19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackbornpackage com.android.server.wm; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_BLUR_BEHIND; 225fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackbornimport static android.view.WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; 274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG; 344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.app.IBatteryStats; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.policy.PolicyManager; 38b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackbornimport com.android.internal.policy.impl.PhoneWindowManager; 39a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport com.android.internal.view.BaseInputHandler; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.view.IInputContext; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.view.IInputMethodClient; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.view.IInputMethodManager; 43ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackbornimport com.android.internal.view.WindowManagerPolicyThread; 44a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackbornimport com.android.server.AttributeCache; 45a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackbornimport com.android.server.EventLogTags; 46a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackbornimport com.android.server.PowerManagerService; 47a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackbornimport com.android.server.Watchdog; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.server.am.BatteryStatsService; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.Manifest; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ActivityManagerNative; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IActivityManager; 53ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onoratoimport android.app.StatusBarManager; 54d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Millerimport android.app.admin.DevicePolicyManager; 55284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Millerimport android.content.BroadcastReceiver; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 57284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Millerimport android.content.Intent; 58284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Millerimport android.content.IntentFilter; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 611ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshimaimport android.content.res.CompatibilityInfo; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration; 630aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.graphics.Bitmap; 64fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackbornimport android.graphics.Canvas; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Matrix; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat; 6744bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackbornimport android.graphics.Point; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Region; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 727580493b014a2c7ea883cd291255798dc72ebbffDianne Hackbornimport android.os.Bundle; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Debug; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 7638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackbornimport android.os.IRemoteCallback; 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; 9538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackbornimport android.util.Pair; 968a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseIntArray; 98fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackbornimport android.util.TypedValue; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Display; 100dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powellimport android.view.Gravity; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IApplicationToken; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IOnKeyguardExitResult; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IRotationWatcher; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindow; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowManager; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowSession; 10746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.view.InputChannel; 108c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownimport android.view.InputDevice; 109bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brownimport android.view.InputEvent; 110a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport android.view.InputHandler; 111a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport android.view.InputQueue; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Surface; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceSession; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerPolicy; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager.LayoutParams; 121df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackbornimport android.view.WindowManagerPolicy.FakeWindow; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Animation; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.AnimationUtils; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Transformation; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.BufferedWriter; 127b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.DataInputStream; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 130b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.FileInputStream; 131b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.FileNotFoundException; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStreamWriter; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.StringWriter; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.Socket; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashSet; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** {@hide} */ 145ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackbornpublic class WindowManagerService extends IWindowManager.Stub 146df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final String TAG = "WindowManager"; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG = false; 149f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn static final boolean DEBUG_ADD_REMOVE = false; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_FOCUS = false; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_ANIM = false; 1529b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn static final boolean DEBUG_LAYOUT = false; 153ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn static final boolean DEBUG_RESIZE = false; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_LAYERS = false; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_INPUT = false; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_INPUT_METHOD = false; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_VISIBILITY = false; 158bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn static final boolean DEBUG_WINDOW_MOVEMENT = false; 159f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn static final boolean DEBUG_TOKEN_MOVEMENT = false; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_ORIENTATION = false; 161bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn static final boolean DEBUG_APP_ORIENTATION = false; 162694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn static final boolean DEBUG_CONFIGURATION = false; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_APP_TRANSITIONS = false; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_STARTING_WINDOW = false; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_REORDER = false; 1667341d7a104b47996445d069a695e155a07184606Dianne Hackborn static final boolean DEBUG_WALLPAPER = false; 167994ef9296a00523de1df424b4b760b4416ead58bChristopher Tate static final boolean DEBUG_DRAG = false; 16829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn static final boolean DEBUG_SCREEN_ON = false; 169cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn static final boolean DEBUG_SCREENSHOT = false; 17038cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn static final boolean DEBUG_BOOT = false; 1715fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn static final boolean SHOW_SURFACE_ALLOC = false; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean SHOW_TRANSACTIONS = false; 17336991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn static final boolean SHOW_LIGHT_TRANSACTIONS = false || SHOW_TRANSACTIONS; 1749bfb707597898f54722460b48588007b682f3e2aDianne Hackborn static final boolean HIDE_STACK_CRAWLS = true; 17553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean PROFILE_ORIENTATION = false; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean BLUR = true; 178cfe6524071624b6679e5fa4db847328e8d0317c8Dave Bort static final boolean localLOGV = DEBUG; 17906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** How much to multiply the policy's type layer, to reserve room 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for multiple windows of the same type and Z-ordering adjustment 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with TYPE_LAYER_OFFSET. */ 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int TYPE_LAYER_MULTIPLIER = 10000; 18406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Offset from TYPE_LAYER_MULTIPLIER for moving a group of windows above 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or below others in the same layer. */ 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int TYPE_LAYER_OFFSET = 1000; 18806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** How much to increment the layer for each window, to reserve room 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for effect surfaces between them. 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int WINDOW_LAYER_MULTIPLIER = 5; 19306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 194de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn /** 195de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn * Dim surface layer is immediately below target window. 196de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn */ 197de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn static final int LAYER_OFFSET_DIM = 1; 198de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn 199de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn /** 200de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn * Blur surface layer is immediately below dim layer. 201de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn */ 202de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn static final int LAYER_OFFSET_BLUR = 2; 203de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn 2047916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn /** 2057916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn * Layer at which to put the rotation freeze snapshot. 2067916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn */ 2077916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn static final int FREEZE_LAYER = (TYPE_LAYER_MULTIPLIER * 200) + 1; 2087916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 2097916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn /** 2107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn * Layer at which to put the mask for emulated screen sizes. 2117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn */ 2127916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn static final int MASK_LAYER = TYPE_LAYER_MULTIPLIER * 200; 2137916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The maximum length we will accept for a loaded animation duration: 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this is 10 seconds. 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int MAX_ANIMATION_DURATION = 10*1000; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Amount of time (in milliseconds) to animate the dim surface from one 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value to another, when no window animation is driving it. 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int DEFAULT_DIM_DURATION = 200; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2240a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima /** Amount of time (in milliseconds) to animate the fade-in-out transition for 2250a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima * compatible windows. 2260a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima */ 2270a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima static final int DEFAULT_FADE_IN_OUT_DURATION = 400; 2280a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima 229a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn /** 230a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn * If true, the window manager will do its own custom freezing and general 231a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn * management of the screen during rotation. 232a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn */ 233a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn static final boolean CUSTOM_SCREEN_ROTATION = true; 234a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn 2357fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown // Maximum number of milliseconds to wait for input event injection. 2367fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown // FIXME is this value reasonable? 2377fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown private static final int INJECTION_TIMEOUT_MILLIS = 30 * 1000; 238b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown 239b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown // Maximum number of milliseconds to wait for input devices to be enumerated before 240b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown // proceding with safe mode detection. 241b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown private static final int INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS = 1000; 24228637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller 243349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // Default input dispatching timeout in nanoseconds. 2446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn static final long DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS = 5000 * 1000000L; 24506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int UPDATE_FOCUS_NORMAL = 0; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int UPDATE_FOCUS_WILL_ASSIGN_LAYERS = 1; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int UPDATE_FOCUS_PLACING_SURFACES = 2; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int UPDATE_FOCUS_WILL_PLACE_SURFACES = 3; 25006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String SYSTEM_SECURE = "ro.secure"; 25206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy private static final String SYSTEM_DEBUGGABLE = "ro.debuggable"; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Condition waited on by {@link #reenableKeyguard} to know the call to 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the window policy has finished. 257983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood * This is set to true only if mKeyguardTokenWatcher.acquired() has 258983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood * actually disabled the keyguard. 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 260983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood private boolean mKeyguardDisabled = false; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 262284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller private static final int ALLOW_DISABLE_YES = 1; 263284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller private static final int ALLOW_DISABLE_NO = 0; 264284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller private static final int ALLOW_DISABLE_UNKNOWN = -1; // check with DevicePolicyManager 265284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller private int mAllowDisableKeyguard = ALLOW_DISABLE_UNKNOWN; // sync'd by mKeyguardTokenWatcher 266284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller 267983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood final TokenWatcher mKeyguardTokenWatcher = new TokenWatcher( 268983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood new Handler(), "WindowManagerService.mKeyguardTokenWatcher") { 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquired() { 270284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller if (shouldAllowDisableKeyguard()) { 271284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mPolicy.enableKeyguard(false); 272284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mKeyguardDisabled = true; 273284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } else { 274284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller Log.v(TAG, "Not disabling keyguard since device policy is enforced"); 275284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void released() { 278a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn mPolicy.enableKeyguard(true); 279983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood synchronized (mKeyguardTokenWatcher) { 280983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood mKeyguardDisabled = false; 281983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood mKeyguardTokenWatcher.notifyAll(); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 286284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 287284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller @Override 288284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller public void onReceive(Context context, Intent intent) { 289284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mPolicy.enableKeyguard(true); 290284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller synchronized(mKeyguardTokenWatcher) { 291284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // lazily evaluate this next time we're asked to disable keyguard 292284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mAllowDisableKeyguard = ALLOW_DISABLE_UNKNOWN; 293284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mKeyguardDisabled = false; 294284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } 295284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } 296284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller }; 297284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Context mContext; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean mHaveInputMethods; 30106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 30258f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn final boolean mAllowBootMessages; 30358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean mLimitedAlphaCompositing; 30506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager(); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IActivityManager mActivityManager; 30906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IBatteryStats mBatteryStats; 31106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All currently active sessions with clients. 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashSet<Session> mSessions = new HashSet<Session>(); 31606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Mapping from an IWindow IBinder to the server's Window object. 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is also used as the lock for all of our state. 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<IBinder, WindowState> mWindowMap = new HashMap<IBinder, WindowState>(); 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Mapping from a token IBinder to a WindowToken object. 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<IBinder, WindowToken> mTokenMap = 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new HashMap<IBinder, WindowToken>(); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Window tokens that are in the process of exiting, but still 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on screen for animations. 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<WindowToken> mExitingTokens = new ArrayList<WindowToken>(); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Z-ordered (bottom-most first) list of all application tokens, for 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * controlling the ordering of windows in different applications. This 338f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn * contains AppWindowToken objects. 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<AppWindowToken> mAppTokens = new ArrayList<AppWindowToken>(); 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Application tokens that are in the process of exiting, but still 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on screen for animations. 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<AppWindowToken> mExitingAppTokens = new ArrayList<AppWindowToken>(); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * List of window tokens that have finished starting their application, 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and now need to have the policy remove their windows. 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<AppWindowToken> mFinishedStarting = new ArrayList<AppWindowToken>(); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Z-ordered (bottom-most first) list of all Window objects. 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 357e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final ArrayList<WindowState> mWindows = new ArrayList<WindowState>(); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 360df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn * Fake windows added to the window manager. Note: ordered from top to 361df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn * bottom, opposite of mWindows. 362df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn */ 363df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn final ArrayList<FakeWindowImpl> mFakeWindows = new ArrayList<FakeWindowImpl>(); 364df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 365df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn /** 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Windows that are being resized. Used so we can tell the client about 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the resize after closing the transaction in which we resized the 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * underlying surface. 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<WindowState> mResizingWindows = new ArrayList<WindowState>(); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Windows whose animations have ended and now must be removed. 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<WindowState> mPendingRemove = new ArrayList<WindowState>(); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 378f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn * Used when processing mPendingRemove to avoid working on the original array. 379f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn */ 380f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn WindowState[] mPendingRemoveTmp = new WindowState[20]; 381f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn 382f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn /** 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Windows whose surface should be destroyed. 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<WindowState> mDestroySurface = new ArrayList<WindowState>(); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Windows that have lost input focus and are waiting for the new 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * focus window to be displayed before they are told about this. 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<WindowState> mLosingFocus = new ArrayList<WindowState>(); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is set when we have run out of memory, and will either be an empty 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * list or contain windows that need to be force removed. 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<WindowState> mForceRemoves; 39806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 399f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn /** 40038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn * Windows that clients are waiting to have drawn. 40138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn */ 40238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn ArrayList<Pair<WindowState, IRemoteCallback>> mWaitingForDrawn 40338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn = new ArrayList<Pair<WindowState, IRemoteCallback>>(); 40438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn 40538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn /** 406f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn * Used when rebuilding window list to keep track of windows that have 407f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn * been removed. 408f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn */ 409f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn WindowState[] mRebuildTmp = new WindowState[20]; 410f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IInputMethodManager mInputMethodManager; 41206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SurfaceSession mFxSession; 4140a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima private DimAnimator mDimAnimator = null; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface mBlurSurface; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mBlurShown; 417fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn Watermark mWatermark; 4186804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick StrictModeFlash mStrictModeFlash; 419a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn ScreenRotationAnimation mScreenRotationAnimation; 42006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn BlackFrame mBlackFrame; 4227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mTransactionSequence = 0; 42406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float[] mTmpFloats = new float[9]; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mSafeMode; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mDisplayEnabled = false; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mSystemBooted = false; 43029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn boolean mForceDisplayEnabled = false; 431661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn boolean mShowingBootMessages = false; 4321fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn 4331fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn // This protects the following display size properties, so that 4341fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn // getDisplaySize() doesn't need to acquire the global lock. This is 4351fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn // needed because the window manager sometimes needs to use ActivityThread 4361fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn // while it has its global state locked (for example to load animation 4371fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn // resources), but the ActivityThread also needs get the current display 4381fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn // size sometimes when it has its package lock held. 4391fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn // 4401fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn // These will only be modified with both mWindowMap and mDisplaySizeLock 4411fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn // held (in that order) so the window manager doesn't need to acquire this 4421fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn // lock when needing these values in its normal operation. 4431fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn final Object mDisplaySizeLock = new Object(); 444b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate int mInitialDisplayWidth = 0; 445b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate int mInitialDisplayHeight = 0; 4467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int mBaseDisplayWidth = 0; 4477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int mBaseDisplayHeight = 0; 44844bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn int mCurDisplayWidth = 0; 44944bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn int mCurDisplayHeight = 0; 45081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn int mAppDisplayWidth = 0; 45181e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn int mAppDisplayHeight = 0; 4521fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mRotation = 0; 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 455dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn boolean mAltOrientation = false; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<IRotationWatcher> mRotationWatchers 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new ArrayList<IRotationWatcher>(); 45801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown int mDeferredRotationPauseCount; 45906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mLayoutNeeded = true; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mAnimationPending = false; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mDisplayFrozen = false; 463e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean mWaitingForConfig = false; 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mWindowsFreezingScreen = false; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mAppsFreezingScreen = 0; 466bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn int mLastWindowForcedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 468e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn int mLayoutSeq = 0; 469df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 470df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn int mLastStatusBarVisibility = 0; 471df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 472b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn // State while inside of layoutAndPlaceSurfacesLocked(). 473b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn boolean mFocusMayChange; 474b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn 475e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn Configuration mCurConfiguration = new Configuration(); 476e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is held as long as we have the screen frozen, to give us time to 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // perform a rotation animation when turning off shows the lock screen which 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // changes the orientation. 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManager.WakeLock mScreenFrozenLock; 48106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // State management of app transitions. When we are preparing for a 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // transition, mNextAppTransition will be the kind of transition to 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // perform or TRANSIT_NONE if we are not waiting. If we are waiting, 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // mOpeningApps and mClosingApps are the lists of tokens that will be 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // made visible or hidden at the next transition. 487bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn int mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET; 4883b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn String mNextAppTransitionPackage; 4893b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int mNextAppTransitionEnter; 4903b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int mNextAppTransitionExit; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mAppTransitionReady = false; 492a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn boolean mAppTransitionRunning = false; 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mAppTransitionTimeout = false; 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mStartingIconInTransition = false; 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mSkipAppTransitionAnimation = false; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<AppWindowToken> mOpeningApps = new ArrayList<AppWindowToken>(); 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<AppWindowToken> mClosingApps = new ArrayList<AppWindowToken>(); 498a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn final ArrayList<AppWindowToken> mToTopApps = new ArrayList<AppWindowToken>(); 499a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn final ArrayList<AppWindowToken> mToBottomApps = new ArrayList<AppWindowToken>(); 50006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Display mDisplay; 50206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 5035fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn final DisplayMetrics mDisplayMetrics = new DisplayMetrics(); 504bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown final DisplayMetrics mRealDisplayMetrics = new DisplayMetrics(); 50548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn final DisplayMetrics mTmpDisplayMetrics = new DisplayMetrics(); 5065fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn final DisplayMetrics mCompatDisplayMetrics = new DisplayMetrics(); 5075fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project H mH = new H(); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState mCurrentFocus = null; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState mLastFocus = null; 51206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This just indicates the window the input method is on top of, not 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // necessarily the window its input is going to. 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState mInputMethodTarget = null; 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mInputMethodTargetWaitingAnim; 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mInputMethodAnimLayerAdjustment; 51806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState mInputMethodWindow = null; 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<WindowState> mInputMethodDialogs = new ArrayList<WindowState>(); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5222992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown boolean mHardKeyboardAvailable; 5232992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown boolean mHardKeyboardEnabled; 5242992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown OnHardKeyboardStatusChangeListener mHardKeyboardStatusChangeListener; 5252992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 5264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>(); 527ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 528759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn // If non-null, this is the currently visible window that is associated 529759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn // with the wallpaper. 530759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn WindowState mWallpaperTarget = null; 5313be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // If non-null, we are in the middle of animating from one wallpaper target 5323be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // to another, and this is the lower one in Z-order. 5333be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn WindowState mLowerWallpaperTarget = null; 5343be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // If non-null, we are in the middle of animating from one wallpaper target 5353be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // to another, and this is the higher one in Z-order. 5363be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn WindowState mUpperWallpaperTarget = null; 5376c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // Window currently running an animation that has requested it be detached 5386c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // from the wallpaper. This means we need to ensure the wallpaper is 5396c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // visible behind it in case it animates in a way that would allow it to be 5406c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // seen. 5416c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn WindowState mWindowDetachedWallpaper = null; 542de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn DimSurface mWindowAnimationBackgroundSurface = null; 543759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn int mWallpaperAnimLayerAdjustment; 54473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn float mLastWallpaperX = -1; 54573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn float mLastWallpaperY = -1; 546bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float mLastWallpaperXStep = -1; 547bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float mLastWallpaperYStep = -1; 54819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn // This is set when we are waiting for a wallpaper to tell us it is done 54919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn // changing its scroll position. 55019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn WindowState mWaitingOnWallpaper; 55119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn // The last time we had a timeout when waiting for a wallpaper. 55219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn long mLastWallpaperTimeoutTime; 55319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn // We give a wallpaper up to 150ms to finish scrolling. 55419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn static final long WALLPAPER_TIMEOUT = 150; 55519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn // Time we wait after a timeout before trying to wait again. 55619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn static final long WALLPAPER_TIMEOUT_RECOVERY = 10000; 557ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken mFocusedApp = null; 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManagerService mPowerManager; 56106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mWindowAnimationScale = 1.0f; 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mTransitionAnimationScale = 1.0f; 56406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 56546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown final InputManager mInputManager; 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Who is holding the screen on. 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Session mHoldingScreenOn; 56946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown PowerManager.WakeLock mHoldingScreenWakeLock; 57006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 57193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn boolean mTurnOnScreen; 572ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 573a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate DragState mDragState = null; 5746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final InputHandler mDragInputHandler = new BaseInputHandler() { 575a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate @Override 5763915bb845b032dc184dba5e60970b803390ca3edJeff Brown public void handleMotion(MotionEvent event, InputQueue.FinishedCallback finishedCallback) { 5773915bb845b032dc184dba5e60970b803390ca3edJeff Brown boolean handled = false; 578a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate try { 5793915bb845b032dc184dba5e60970b803390ca3edJeff Brown if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0 5803915bb845b032dc184dba5e60970b803390ca3edJeff Brown && mDragState != null) { 5813915bb845b032dc184dba5e60970b803390ca3edJeff Brown boolean endDrag = false; 5823915bb845b032dc184dba5e60970b803390ca3edJeff Brown final float newX = event.getRawX(); 5833915bb845b032dc184dba5e60970b803390ca3edJeff Brown final float newY = event.getRawY(); 5843915bb845b032dc184dba5e60970b803390ca3edJeff Brown 585a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate switch (event.getAction()) { 586a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate case MotionEvent.ACTION_DOWN: { 587a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) { 588a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.w(TAG, "Unexpected ACTION_DOWN in drag layer"); 589a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 590a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } break; 591a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 592a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate case MotionEvent.ACTION_MOVE: { 593a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate synchronized (mWindowMap) { 5942c095f367779ef32130c72849936a2e3013c8492Christopher Tate // move the surface and tell the involved window(s) where we are 595a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState.notifyMoveLw(newX, newY); 596a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 597a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } break; 598a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 599a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate case MotionEvent.ACTION_UP: { 600a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) Slog.d(TAG, "Got UP on move channel; dropping at " 601a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate + newX + "," + newY); 602a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate synchronized (mWindowMap) { 603d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate endDrag = mDragState.notifyDropLw(newX, newY); 604a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 605a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } break; 606a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 607a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate case MotionEvent.ACTION_CANCEL: { 608a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) Slog.d(TAG, "Drag cancelled!"); 609a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate endDrag = true; 610a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } break; 611a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 612a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 613a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (endDrag) { 614a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) Slog.d(TAG, "Drag ended; tearing down state"); 615a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // tell all the windows that the drag has ended 6165994359f3009a3ebfbd37d82bb9a665e9b947851Chris Tate synchronized (mWindowMap) { 617d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate mDragState.endDragLw(); 6185994359f3009a3ebfbd37d82bb9a665e9b947851Chris Tate } 619a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6203915bb845b032dc184dba5e60970b803390ca3edJeff Brown 6213915bb845b032dc184dba5e60970b803390ca3edJeff Brown handled = true; 622a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 623a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } catch (Exception e) { 624a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.e(TAG, "Exception caught by drag handleMotion", e); 625a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } finally { 6263915bb845b032dc184dba5e60970b803390ca3edJeff Brown finishedCallback.finished(handled); 627a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 628a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 629a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate }; 630a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 631a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate /** 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether the UI is currently running in touch mode (not showing 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * navigational focus because the user is directly pressing the screen). 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 635e99adc70c8e0a64cb8d13a2ec4c125adaf18904dMichael Jurka boolean mInTouchMode = true; 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ViewServer mViewServer; 638dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev private ArrayList<WindowChangeListener> mWindowChangeListeners = 639dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev new ArrayList<WindowChangeListener>(); 640dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev private boolean mWindowsChanged = false; 641dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev 642dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev public interface WindowChangeListener { 643dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev public void windowsChanged(); 6446e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev public void focusChanged(); 645dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 647c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn final Configuration mTempConfiguration = new Configuration(); 6481ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 6492f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn // The desired scaling factor for compatible apps. 650e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn float mCompatibleScreenScale; 6511ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static WindowManagerService main(Context context, 65358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn PowerManagerService pm, boolean haveInputMethods, boolean allowBootMsgs) { 65458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn WMThread thr = new WMThread(context, pm, haveInputMethods, allowBootMsgs); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thr.start(); 65606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (thr) { 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (thr.mService == null) { 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thr.wait(); 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66406e57b5d46c87e9dd7bca1386b63b3a8522f51efJozef BABJAK return thr.mService; 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class WMThread extends Thread { 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerService mService; 67006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final PowerManagerService mPM; 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final boolean mHaveInputMethods; 67458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn private final boolean mAllowBootMessages; 67506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WMThread(Context context, PowerManagerService pm, 67758f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn boolean haveInputMethods, boolean allowBootMsgs) { 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super("WindowManager"); 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM = pm; 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveInputMethods = haveInputMethods; 68258f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn mAllowBootMessages = allowBootMsgs; 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Looper.prepare(); 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerService s = new WindowManagerService(mContext, mPM, 68858f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn mHaveInputMethods, mAllowBootMessages); 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.os.Process.setThreadPriority( 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.os.Process.THREAD_PRIORITY_DISPLAY); 691160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate android.os.Process.setCanSelfBackground(false); 69206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = s; 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 698ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // For debug builds, log event loop stalls to dropbox for analysis. 699ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick if (StrictMode.conditionallyEnableDebugLogging()) { 700ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick Slog.i(TAG, "Enabled StrictMode logging for WMThread's Looper"); 701ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick } 702ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Looper.loop(); 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class PolicyThread extends Thread { 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final WindowManagerPolicy mPolicy; 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final WindowManagerService mService; 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final PowerManagerService mPM; 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mRunning = false; 71306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PolicyThread(WindowManagerPolicy policy, 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerService service, Context context, 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManagerService pm) { 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super("WindowManagerPolicy"); 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy = policy; 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = service; 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM = pm; 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 72306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Looper.prepare(); 726ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn WindowManagerPolicyThread.set(this, Looper.myLooper()); 727ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Looper.myLooper().setMessageLogging(new LogPrinter( 7298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato // Log.VERBOSE, "WindowManagerPolicy", Log.LOG_ID_SYSTEM)); 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.os.Process.setThreadPriority( 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.os.Process.THREAD_PRIORITY_FOREGROUND); 732160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate android.os.Process.setCanSelfBackground(false); 733df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mPolicy.init(mContext, mService, mService, mPM); 73406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = true; 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 740ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // For debug builds, log event loop stalls to dropbox for analysis. 741ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick if (StrictMode.conditionallyEnableDebugLogging()) { 742ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick Slog.i(TAG, "Enabled StrictMode for PolicyThread's Looper"); 743ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick } 744ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Looper.loop(); 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WindowManagerService(Context context, PowerManagerService pm, 75058f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn boolean haveInputMethods, boolean showBootMsgs) { 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveInputMethods = haveInputMethods; 75358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn mAllowBootMessages = showBootMsgs; 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLimitedAlphaCompositing = context.getResources().getBoolean( 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.bool.config_sf_limitedAlpha); 75606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPowerManager = pm; 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPowerManager.setPolicy(mPolicy); 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManager pmc = (PowerManager)context.getSystemService(Context.POWER_SERVICE); 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenFrozenLock = pmc.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "SCREEN_FROZEN"); 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenFrozenLock.setReferenceCounted(false); 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityManager = ActivityManagerNative.getDefault(); 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryStats = BatteryStatsService.getService(); 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get persisted window scale setting 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowAnimationScale = Settings.System.getFloat(context.getContentResolver(), 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.WINDOW_ANIMATION_SCALE, mWindowAnimationScale); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransitionAnimationScale = Settings.System.getFloat(context.getContentResolver(), 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.TRANSITION_ANIMATION_SCALE, mTransitionAnimationScale); 77206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 773284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // Track changes to DevicePolicyManager state so we can enable/disable keyguard. 774284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller IntentFilter filter = new IntentFilter(); 775284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); 776284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mContext.registerReceiver(mBroadcastReceiver, filter); 777284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller 77846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mHoldingScreenWakeLock = pmc.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, 77946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "KEEP_SCREEN_ON_FLAG"); 78046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mHoldingScreenWakeLock.setReferenceCounted(false); 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 782e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown mInputManager = new InputManager(context, this); 78306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PolicyThread thr = new PolicyThread(mPolicy, this, context, pm); 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thr.start(); 78606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (thr) { 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!thr.mRunning) { 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thr.wait(); 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 79506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 79600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputManager.start(); 79706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Add ourself to the Watchdog monitors. 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Watchdog.getInstance().addMonitor(this); 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onTransact(int code, Parcel data, Parcel reply, int flags) 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws RemoteException { 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onTransact(code, data, reply, flags); 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The window manager only throws security exceptions, so let's 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // log all others. 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!(e instanceof SecurityException)) { 8118962028b6e2f4176e6ceded281e584d223e44982Dianne Hackborn Log.wtf(TAG, "Window Manager Crash", e); 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw e; 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 817e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown private void placeWindowAfter(WindowState pos, WindowState window) { 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int i = mWindows.indexOf(pos); 819f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v( 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Adding window " + window + " at " 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (i+1) + " of " + mWindows.size() + " (after " + pos + ")"); 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(i+1, window); 823dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 826e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown private void placeWindowBefore(WindowState pos, WindowState window) { 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int i = mWindows.indexOf(pos); 828f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v( 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Adding window " + window + " at " 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + i + " of " + mWindows.size() + " (before " + pos + ")"); 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(i, window); 832dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //This method finds out the index of a window that has the same app token as 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //win. used for z ordering the windows in mWindows 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int findIdxBasedOnAppTokens(WindowState win) { 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //use a local variable to cache mWindows 839e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown ArrayList<WindowState> localmWindows = mWindows; 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int jmax = localmWindows.size(); 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(jmax == 0) { 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int j = (jmax-1); j >= 0; j--) { 845e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState wentry = localmWindows.get(j); 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(wentry.mAppToken == win.mAppToken) { 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return j; 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void addWindowToListInOrderLocked(WindowState win, boolean addToToken) { 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IWindow client = win.mClient; 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowToken token = win.mToken; 856e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final ArrayList<WindowState> localmWindows = mWindows; 85706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = localmWindows.size(); 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowState attached = win.mAttachedWindow; 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attached == null) { 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int tokenWindowsPos = token.windows.size(); 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token.appWindowToken != null) { 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = tokenWindowsPos-1; 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index >= 0) { 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this application has existing windows, we 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // simply place the new window on top of them... but 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // keep the starting window on top. 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAttrs.type == TYPE_BASE_APPLICATION) { 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Base windows go behind everything else. 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore(token.windows.get(0), win); 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokenWindowsPos = 0; 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken atoken = win.mAppToken; 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null && 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.get(index) == atoken.startingWindow) { 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore(token.windows.get(index), win); 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokenWindowsPos--; 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int newIdx = findIdxBasedOnAppTokens(win); 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(newIdx != -1) { 88206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy //there is a window above this one associated with the same 88306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy //apptoken note that the window could be a floating window 88406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy //that was created later or a window at the top of the list of 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //windows associated with this token. 886f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) { 887f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.v(TAG, "Adding window " + win + " at " 888f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + (newIdx+1) + " of " + N); 889f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project localmWindows.add(newIdx+1, win); 891dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 89206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy } 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Figuring out where to add app window " 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + client.asBinder() + " (token=" + token + ")"); 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Figure out where the window should go, based on the 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // order of applications. 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NA = mAppTokens.size(); 902e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState pos = null; 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=NA-1; i>=0; i--) { 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken t = mAppTokens.get(i); 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == token) { 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 909ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 910a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // We haven't reached the token yet; if this token 911a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // is not going to the bottom and has windows, we can 912a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // use it as an anchor for when we do reach the token. 913a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (!t.sendingToBottom && t.windows.size() > 0) { 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = t.windows.get(0); 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We now know the index into the apps. If we found 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // an app window above, that gives us the position; else 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need to look some more. 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos != null) { 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Move behind any windows attached to this one. 922e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowToken atoken = mTokenMap.get(pos.mClient.asBinder()); 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null) { 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NC = atoken.windows.size(); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NC > 0) { 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState bottom = atoken.windows.get(0); 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bottom.mSubLayer < 0) { 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = bottom; 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore(pos, win); 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 934a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // Continue looking down until we find the first 935a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // token that has windows. 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i >= 0) { 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken t = mAppTokens.get(i); 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NW = t.windows.size(); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NW > 0) { 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = t.windows.get(NW-1); 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos != null) { 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Move in front of any windows attached to this 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // one. 948e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowToken atoken = mTokenMap.get(pos.mClient.asBinder()); 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null) { 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NC = atoken.windows.size(); 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NC > 0) { 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState top = atoken.windows.get(NC-1); 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (top.mSubLayer >= 0) { 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = top; 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowAfter(pos, win); 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Just search for the start of this layer. 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int myLayer = win.mBaseLayer; 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 963e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = localmWindows.get(i); 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mBaseLayer > myLayer) { 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 968f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) { 969f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.v(TAG, "Adding window " + win + " at " 970f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + i + " of " + N); 971f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project localmWindows.add(i, win); 973dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Figure out where window should go, based on layer. 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int myLayer = win.mBaseLayer; 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=N-1; i>=0; i--) { 981e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown if (localmWindows.get(i).mBaseLayer <= myLayer) { 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i < 0) i = 0; 987f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v( 9889bfb707597898f54722460b48588007b682f3e2aDianne Hackborn TAG, "Adding window " + win + " at " 9899bfb707597898f54722460b48588007b682f3e2aDianne Hackborn + i + " of " + N); 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project localmWindows.add(i, win); 991dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (addToToken) { 994f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token); 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.add(tokenWindowsPos, win); 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Figure out this window's ordering relative to the window 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it is attached to. 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NA = token.windows.size(); 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int sublayer = win.mSubLayer; 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int largestSublayer = Integer.MIN_VALUE; 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState windowWithLargestSublayer = null; 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NA; i++) { 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState w = token.windows.get(i); 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int wSublayer = w.mSubLayer; 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wSublayer >= largestSublayer) { 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project largestSublayer = wSublayer; 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project windowWithLargestSublayer = w; 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sublayer < 0) { 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For negative sublayers, we go below all windows 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // in the same sublayer. 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wSublayer >= sublayer) { 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (addToToken) { 1017f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token); 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.add(i, win); 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore( 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wSublayer >= 0 ? attached : w, win); 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For positive sublayers, we go above all windows 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // in the same sublayer. 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wSublayer > sublayer) { 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (addToToken) { 1029f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token); 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.add(i, win); 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore(w, win); 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i >= NA) { 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (addToToken) { 1039f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token); 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.add(win); 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sublayer < 0) { 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore(attached, win); 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowAfter(largestSublayer >= 0 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? windowWithLargestSublayer 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : attached, 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win); 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 105206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAppToken != null && addToToken) { 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAppToken.allAppWindows.add(win); 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 105706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static boolean canBeImeTarget(WindowState w) { 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int fl = w.mAttrs.flags 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project & (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM); 1061e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (fl == 0 || fl == (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM) 1062e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn || w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { 1063e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (DEBUG_INPUT_METHOD) { 1064e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn Slog.i(TAG, "isVisibleOrAdding " + w + ": " + w.isVisibleOrAdding()); 1065e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (!w.isVisibleOrAdding()) { 1066e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn Slog.i(TAG, " mSurface=" + w.mSurface + " reportDestroy=" + w.mReportDestroySurface 1067e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn + " relayoutCalled=" + w.mRelayoutCalled + " viewVis=" + w.mViewVisibility 1068e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn + " policyVis=" + w.mPolicyVisibility + " attachHid=" + w.mAttachedHidden 1069e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn + " exiting=" + w.mExiting + " destroying=" + w.mDestroying); 1070e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (w.mAppToken != null) { 1071e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn Slog.i(TAG, " mAppToken.hiddenRequested=" + w.mAppToken.hiddenRequested); 1072e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 1073e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 1074e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return w.isVisibleOrAdding(); 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 107906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int findDesiredInputMethodWindowIndexLocked(boolean willMove) { 1081e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final ArrayList<WindowState> localmWindows = mWindows; 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = localmWindows.size(); 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState w = null; 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = N; 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i > 0) { 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 1087e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown w = localmWindows.get(i); 108806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1089e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (DEBUG_INPUT_METHOD && willMove) Slog.i(TAG, "Checking window @" + i 1090e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn + " " + w + " fl=0x" + Integer.toHexString(w.mAttrs.flags)); 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (canBeImeTarget(w)) { 10928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Putting input method here!"); 109306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Yet more tricksyness! If this window is a "starting" 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // window, we do actually want to be on top of it, but 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it is not -really- where input will go. So if the caller 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is not actually looking to move the IME, look down below 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for a real window to target... 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!willMove 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && i > 0) { 1102e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState wb = localmWindows.get(i-1); 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wb.mAppToken == w.mAppToken && canBeImeTarget(wb)) { 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w = wb; 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 111106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1112e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (DEBUG_INPUT_METHOD && willMove) Slog.v(TAG, "Proposed new IME target: " + w); 1113e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn 11147eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // Now, a special case -- if the last target's window is in the 11157eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // process of exiting, and is above the new target, keep on the 11167eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // last target to avoid flicker. Consider for example a Dialog with 11177eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // the IME shown: when the Dialog is dismissed, we want to keep 11187eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // the IME above it until it is completely gone so it doesn't drop 11197eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // behind the dialog or its full-screen scrim. 11207eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn if (mInputMethodTarget != null && w != null 11217eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn && mInputMethodTarget.isDisplayedLw() 11227eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn && mInputMethodTarget.mExiting) { 11237eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn if (mInputMethodTarget.mAnimLayer > w.mAnimLayer) { 11247eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn w = mInputMethodTarget; 11257eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn i = localmWindows.indexOf(w); 1126e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Current target higher, switching to: " + w); 11277eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn } 11287eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn } 112906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 11308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Desired input method target=" 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + w + " willMove=" + willMove); 113206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (willMove && w != null) { 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowState curTarget = mInputMethodTarget; 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curTarget != null && curTarget.mAppToken != null) { 113606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Now some fun for dealing with window animations that 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // modify the Z order. We need to look at all windows below 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the current target that are in this app, finding the highest 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // visible one in layering. 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken token = curTarget.mAppToken; 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState highestTarget = null; 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int highestPos = 0; 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token.animating || token.animation != null) { 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = 0; 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = localmWindows.indexOf(curTarget); 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (pos >= 0) { 1148e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState win = localmWindows.get(pos); 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAppToken != token) { 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!win.mRemoved) { 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (highestTarget == null || win.mAnimLayer > 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project highestTarget.mAnimLayer) { 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project highestTarget = win; 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project highestPos = pos; 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos--; 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 116206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (highestTarget != null) { 11648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_INPUT_METHOD) Slog.v(TAG, "mNextAppTransition=" 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mNextAppTransition + " " + highestTarget 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " animating=" + highestTarget.isAnimating() 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " layer=" + highestTarget.mAnimLayer 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " new layer=" + w.mAnimLayer); 116906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1170bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are currently setting up for an animation, 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // hold everything until we can find out what will happen. 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodTargetWaitingAnim = true; 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodTarget = highestTarget; 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return highestPos + 1; 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (highestTarget.isAnimating() && 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project highestTarget.mAnimLayer > w.mAnimLayer) { 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the window we are currently targeting is involved 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // with an animation, and it is on top of the next target 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we will be over, then hold off on moving until 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // that is done. 1182e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn mInputMethodTargetWaitingAnim = true; 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodTarget = highestTarget; 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return highestPos + 1; 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 118906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 11908a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Placing input method @" + (i+1)); 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w != null) { 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (willMove) { 1193b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_INPUT_METHOD) { 1194b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 1195b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 1196b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 1197b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 1198b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 1199b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.w(TAG, "Moving IM target from " 1200b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + mInputMethodTarget + " to " + w, e); 1201b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodTarget = w; 1203e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn mInputMethodTargetWaitingAnim = false; 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mAppToken != null) { 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInputMethodAnimLayerAdjustment(w.mAppToken.animLayerAdjustment); 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInputMethodAnimLayerAdjustment(0); 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i+1; 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (willMove) { 1213b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_INPUT_METHOD) { 1214b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 1215b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 1216b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 1217b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 1218b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 1219b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.w(TAG, "Moving IM target from " 1220b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + mInputMethodTarget + " to null", e); 1221b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodTarget = null; 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInputMethodAnimLayerAdjustment(0); 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 122706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void addInputMethodWindowToListLocked(WindowState win) { 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = findDesiredInputMethodWindowIndexLocked(true); 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos >= 0) { 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mTargetAppToken = mInputMethodTarget.mAppToken; 1232f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v( 12339bfb707597898f54722460b48588007b682f3e2aDianne Hackborn TAG, "Adding input method window " + win + " at " + pos); 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(pos, win); 1235dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodDialogsLocked(pos+1); 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mTargetAppToken = null; 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addWindowToListInOrderLocked(win, true); 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodDialogsLocked(pos); 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 124306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setInputMethodAnimLayerAdjustment(int adj) { 12458a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS) Slog.v(TAG, "Setting im layer adj to " + adj); 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodAnimLayerAdjustment = adj; 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState imw = mInputMethodWindow; 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imw != null) { 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imw.mAnimLayer = imw.mLayer + adj; 12508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " anim layer: " + imw.mAnimLayer); 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int wi = imw.mChildWindows.size(); 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (wi > 0) { 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wi--; 1255e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cw = imw.mChildWindows.get(wi); 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cw.mAnimLayer = cw.mLayer + adj; 12578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + cw 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " anim layer: " + cw.mAnimLayer); 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int di = mInputMethodDialogs.size(); 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (di > 0) { 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project di --; 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imw = mInputMethodDialogs.get(di); 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imw.mAnimLayer = imw.mLayer + adj; 12668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " anim layer: " + imw.mAnimLayer); 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 127006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int tmpRemoveWindowLocked(int interestingPos, WindowState win) { 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int wpos = mWindows.indexOf(win); 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wpos >= 0) { 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wpos < interestingPos) interestingPos--; 12758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing at " + wpos + ": " + win); 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(wpos); 1277dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NC = win.mChildWindows.size(); 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (NC > 0) { 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NC--; 1281e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cw = win.mChildWindows.get(NC); 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cpos = mWindows.indexOf(cw); 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cpos >= 0) { 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cpos < interestingPos) interestingPos--; 12858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing child at " 12869bfb707597898f54722460b48588007b682f3e2aDianne Hackborn + cpos + ": " + cw); 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(cpos); 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return interestingPos; 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 129306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void reAddWindowToListInOrderLocked(WindowState win) { 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addWindowToListInOrderLocked(win, false); 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is a hack to get all of the child windows added as well 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // at the right position. Child windows should be rare and 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this case should be rare, so it shouldn't be that big a deal. 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int wpos = mWindows.indexOf(win); 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wpos >= 0) { 13018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "ReAdd removing from " + wpos 13029bfb707597898f54722460b48588007b682f3e2aDianne Hackborn + ": " + win); 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(wpos); 1304dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reAddWindowLocked(wpos, win); 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 130806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void logWindowList(String prefix) { 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = mWindows.size(); 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 13138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, prefix + "#" + N + ": " + mWindows.get(N)); 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 131606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void moveInputMethodDialogsLocked(int pos) { 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<WindowState> dialogs = mInputMethodDialogs; 131906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = dialogs.size(); 13218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Removing " + N + " dialogs w/pos=" + pos); 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = tmpRemoveWindowLocked(pos, dialogs.get(i)); 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 13268a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Window list w/pos=" + pos); 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 132906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos >= 0) { 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken targetAppToken = mInputMethodTarget.mAppToken; 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos < mWindows.size()) { 1333e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState wp = mWindows.get(pos); 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wp == mInputMethodWindow) { 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Adding " + N + " dialogs at pos=" + pos); 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = dialogs.get(i); 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mTargetAppToken = targetAppToken; 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = reAddWindowLocked(pos, win); 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 13458a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Final window list:"); 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = dialogs.get(i); 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mTargetAppToken = null; 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reAddWindowToListInOrderLocked(win); 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 13558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "No IM target, final list:"); 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 136006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean moveInputMethodWindowsIfNeededLocked(boolean needAssignLayers) { 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowState imWin = mInputMethodWindow; 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int DN = mInputMethodDialogs.size(); 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imWin == null && DN == 0) { 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 136706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int imPos = findDesiredInputMethodWindowIndexLocked(true); 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imPos >= 0) { 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In this case, the input method windows are to be placed 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // immediately above the window they are targeting. 137206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First check to see if the input method windows are already 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // located here, and contiguous. 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mWindows.size(); 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState firstImWin = imPos < N 1377e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown ? mWindows.get(imPos) : null; 137806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Figure out the actual input method window that should be 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // at the bottom of their stack. 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState baseImWin = imWin != null 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? imWin : mInputMethodDialogs.get(0); 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (baseImWin.mChildWindows.size() > 0) { 1384e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cw = baseImWin.mChildWindows.get(0); 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cw.mSubLayer < 0) baseImWin = cw; 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 138706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (firstImWin == baseImWin) { 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The windows haven't moved... but are they still contiguous? 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First find the top IM window. 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = imPos+1; 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (pos < N) { 1393e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown if (!(mWindows.get(pos)).mIsImWindow) { 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Now there should be no more input method windows above. 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (pos < N) { 1401e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown if ((mWindows.get(pos)).mIsImWindow) { 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos >= N) { 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // All is good! 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 141106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imWin != null) { 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 14148a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Moving IM from " + imPos); 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imPos = tmpRemoveWindowLocked(imPos, imWin); 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 14197eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn Slog.v(TAG, "List after removing with new pos " + imPos + ":"); 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imWin.mTargetAppToken = mInputMethodTarget.mAppToken; 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reAddWindowLocked(imPos, imWin); 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 14258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "List after moving IM to " + imPos + ":"); 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DN > 0) moveInputMethodDialogsLocked(imPos+1); 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodDialogsLocked(imPos); 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 143206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In this case, the input method windows go in a fixed layer, 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // because they aren't currently associated with a focus window. 143606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imWin != null) { 14388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Moving IM from " + imPos); 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpRemoveWindowLocked(0, imWin); 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imWin.mTargetAppToken = null; 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reAddWindowToListInOrderLocked(imWin); 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 14438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "List with no IM target:"); 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DN > 0) moveInputMethodDialogsLocked(-1);; 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodDialogsLocked(-1);; 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 145006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 145206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needAssignLayers) { 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayersLocked(); 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 145606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 145906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void adjustInputMethodDialogsLocked() { 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodDialogsLocked(findDesiredInputMethodWindowIndexLocked(true)); 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 146306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 146425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn final boolean isWallpaperVisible(WindowState wallpaperTarget) { 14658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper vis: target obscured=" 146625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn + (wallpaperTarget != null ? Boolean.toString(wallpaperTarget.mObscured) : "??") 146725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn + " anim=" + ((wallpaperTarget != null && wallpaperTarget.mAppToken != null) 146825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn ? wallpaperTarget.mAppToken.animation : null) 146925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn + " upper=" + mUpperWallpaperTarget 147025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn + " lower=" + mLowerWallpaperTarget); 147125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn return (wallpaperTarget != null 147225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn && (!wallpaperTarget.mObscured || (wallpaperTarget.mAppToken != null 147325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn && wallpaperTarget.mAppToken.animation != null))) 147425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn || mUpperWallpaperTarget != null 147525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn || mLowerWallpaperTarget != null; 147625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn } 1477ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 14780586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn static final int ADJUST_WALLPAPER_LAYERS_CHANGED = 1<<1; 14790586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn static final int ADJUST_WALLPAPER_VISIBILITY_CHANGED = 1<<2; 1480ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 14810586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn int adjustWallpaperWindowsLocked() { 14820586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn int changed = 0; 1483ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 148481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dw = mAppDisplayWidth; 148581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dh = mAppDisplayHeight; 1486ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 14874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // First find top-most window that has asked to be on top of the 14884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // wallpaper; all wallpapers go behind it. 1489e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final ArrayList<WindowState> localmWindows = mWindows; 14904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int N = localmWindows.size(); 14914c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn WindowState w = null; 1492f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn WindowState foundW = null; 1493f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn int foundI = 0; 14943b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn WindowState topCurW = null; 14953b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int topCurI = 0; 14966c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn int windowDetachedI = -1; 14974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int i = N; 14984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn while (i > 0) { 14994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn i--; 1500e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown w = localmWindows.get(i); 15013b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if ((w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER)) { 15023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (topCurW == null) { 15033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn topCurW = w; 15043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn topCurI = i; 15053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 15063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn continue; 15073b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 15083b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn topCurW = null; 15096c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (w != mWindowDetachedWallpaper && w.mAppToken != null) { 15103be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // If this window's app token is hidden and not animating, 15113be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // it is of no interest to us. 15123be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (w.mAppToken.hidden && w.mAppToken.animation == null) { 15138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 15146c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn "Skipping not hidden or animating token: " + w); 15153be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn continue; 1516f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 1517f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 15188a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Win " + w + ": readyfordisplay=" 15193be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + w.isReadyForDisplay() + " drawpending=" + w.mDrawPending 15203be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + " commitdrawpending=" + w.mCommitDrawPending); 15217341d7a104b47996445d069a695e155a07184606Dianne Hackborn if ((w.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0 && w.isReadyForDisplay() 15226c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn && (mWallpaperTarget == w 15236c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn || (!w.mDrawPending && !w.mCommitDrawPending))) { 15248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 15253be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn "Found wallpaper activity: #" + i + "=" + w); 1526f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundW = w; 1527f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundI = i; 15283b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (w == mWallpaperTarget && ((w.mAppToken != null 15293b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn && w.mAppToken.animation != null) 15303b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn || w.mAnimation != null)) { 15313be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // The current wallpaper target is animating, so we'll 15323be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // look behind it for another possible target and figure 15333be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // out what is going on below. 15348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Win " + w 15353be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + ": token animating, looking behind."); 1536f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn continue; 1537f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 15384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn break; 15396c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } else if (w == mWindowDetachedWallpaper) { 15406c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn windowDetachedI = i; 15414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 15424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 15434c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 15446c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (foundW == null && windowDetachedI >= 0) { 15456c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (DEBUG_WALLPAPER) Slog.v(TAG, 15466c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn "Found animating detached wallpaper activity: #" + i + "=" + w); 15476c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn foundW = w; 15486c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn foundI = windowDetachedI; 15496c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 15506c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 1551bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 1552f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // If we are currently waiting for an app transition, and either 1553f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // the current target or the next target are involved with it, 1554f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // then hold off on doing anything with the wallpaper. 1555f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // Note that we are checking here for just whether the target 1556f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // is part of an app token... which is potentially overly aggressive 1557f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // (the app token may not be involved in the transition), but good 1558f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // enough (we'll just wait until whatever transition is pending 1559f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // executes). 1560f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (mWallpaperTarget != null && mWallpaperTarget.mAppToken != null) { 15618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 15623be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn "Wallpaper not changing: waiting for app anim in current target"); 15630586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn return 0; 1564f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 1565f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (foundW != null && foundW.mAppToken != null) { 15668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 15673be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn "Wallpaper not changing: waiting for app anim in found target"); 15680586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn return 0; 1569f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 15707341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 1571ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1572f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (mWallpaperTarget != foundW) { 1573f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (DEBUG_WALLPAPER) { 15748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "New wallpaper target: " + foundW 15753be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + " oldTarget: " + mWallpaperTarget); 15763be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 1577ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 15783be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mLowerWallpaperTarget = null; 15793be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mUpperWallpaperTarget = null; 1580ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 15813be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn WindowState oldW = mWallpaperTarget; 15823be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mWallpaperTarget = foundW; 1583ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 15843be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // Now what is happening... if the current and new targets are 15853be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // animating, then we are in our super special mode! 15863b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (foundW != null && oldW != null) { 15873b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn boolean oldAnim = oldW.mAnimation != null 15883b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn || (oldW.mAppToken != null && oldW.mAppToken.animation != null); 15893b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn boolean foundAnim = foundW.mAnimation != null 15903b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn || (foundW.mAppToken != null && foundW.mAppToken.animation != null); 15913be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 15928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "New animation: " + foundAnim 15933b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + " old animation: " + oldAnim); 15943be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 15953b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (foundAnim && oldAnim) { 15963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn int oldI = localmWindows.indexOf(oldW); 15973be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 15988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "New i: " + foundI + " old i: " + oldI); 15993be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 16003be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (oldI >= 0) { 16013be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 16028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Animating wallpapers: old#" + oldI 16033be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + "=" + oldW + "; new#" + foundI 16043be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + "=" + foundW); 16053be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 1606ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16073be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // Set the new target correctly. 16083b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (foundW.mAppToken != null && foundW.mAppToken.hiddenRequested) { 16093be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 16108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Old wallpaper still the target."); 16113be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 16123be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mWallpaperTarget = oldW; 16133be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 1614ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16153be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // Now set the upper and lower wallpaper targets 16163be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // correctly, and make sure that we are positioning 16173be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // the wallpaper below the lower. 16183be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (foundI > oldI) { 16193be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // The new target is on top of the old one. 16203be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 16218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Found target above old target."); 16223be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 16233be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mUpperWallpaperTarget = foundW; 16243be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mLowerWallpaperTarget = oldW; 16253be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn foundW = oldW; 16263be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn foundI = oldI; 16273be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } else { 16283be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // The new target is below the old one. 16293be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 16308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Found target below old target."); 16313be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 16323be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mUpperWallpaperTarget = oldW; 16333be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mLowerWallpaperTarget = foundW; 16343be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 16353be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 16363be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 16373be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 1638ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16396b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn } else if (mLowerWallpaperTarget != null) { 16403be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // Is it time to stop animating? 16416b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn boolean lowerAnimating = mLowerWallpaperTarget.mAnimation != null 16426b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn || (mLowerWallpaperTarget.mAppToken != null 16436b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn && mLowerWallpaperTarget.mAppToken.animation != null); 16446b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn boolean upperAnimating = mUpperWallpaperTarget.mAnimation != null 16456b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn || (mUpperWallpaperTarget.mAppToken != null 16466b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn && mUpperWallpaperTarget.mAppToken.animation != null); 16476b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn if (!lowerAnimating || !upperAnimating) { 16483be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 16498a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "No longer animating wallpaper targets!"); 16503be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 16513be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mLowerWallpaperTarget = null; 16523be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mUpperWallpaperTarget = null; 1653f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 1654f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 1655ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1656f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn boolean visible = foundW != null; 1657759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn if (visible) { 16587341d7a104b47996445d069a695e155a07184606Dianne Hackborn // The window is visible to the compositor... but is it visible 16597341d7a104b47996445d069a695e155a07184606Dianne Hackborn // to the user? That is what the wallpaper cares about. 166025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn visible = isWallpaperVisible(foundW); 16618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper visibility: " + visible); 1662ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16637341d7a104b47996445d069a695e155a07184606Dianne Hackborn // If the wallpaper target is animating, we may need to copy 1664f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // its layer adjustment. Only do this if we are not transfering 1665f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // between two wallpaper targets. 1666f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn mWallpaperAnimLayerAdjustment = 16673be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn (mLowerWallpaperTarget == null && foundW.mAppToken != null) 1668f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn ? foundW.mAppToken.animLayerAdjustment : 0; 1669ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16706136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn final int maxLayer = mPolicy.getMaxWallpaperLayer() 16716136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn * TYPE_LAYER_MULTIPLIER 16726136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn + TYPE_LAYER_OFFSET; 1673ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16744c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // Now w is the window we are supposed to be behind... but we 16754c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // need to be sure to also be behind any of its attached windows, 16766136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn // AND any starting window associated with it, AND below the 16776136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn // maximum layer the policy allows for wallpapers. 1678f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn while (foundI > 0) { 1679e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState wb = localmWindows.get(foundI-1); 16806136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn if (wb.mBaseLayer < maxLayer && 16816136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn wb.mAttachedWindow != foundW && 1682428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn (foundW.mAttachedWindow == null || 1683428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn wb.mAttachedWindow != foundW.mAttachedWindow) && 16844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn (wb.mAttrs.type != TYPE_APPLICATION_STARTING || 1685428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn foundW.mToken == null || wb.mToken != foundW.mToken)) { 16864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // This window is not related to the previous one in any 16874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // interesting way, so stop here. 16884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn break; 16894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1690f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundW = wb; 1691f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundI--; 16924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 169325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn } else { 16948a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "No wallpaper target"); 16954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1696ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16973b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (foundW == null && topCurW != null) { 16983b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // There is no wallpaper target, so it goes at the bottom. 16993b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // We will assume it is the same place as last time, if known. 17003b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn foundW = topCurW; 17013b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn foundI = topCurI+1; 17023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else { 17033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // Okay i is the position immediately above the wallpaper. Look at 17043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // what is below it for later. 1705e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown foundW = foundI > 0 ? localmWindows.get(foundI-1) : null; 17063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 1707ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1708284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (visible) { 170973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (mWallpaperTarget.mWallpaperX >= 0) { 171073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperX = mWallpaperTarget.mWallpaperX; 1711bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen mLastWallpaperXStep = mWallpaperTarget.mWallpaperXStep; 171273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 171373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (mWallpaperTarget.mWallpaperY >= 0) { 171473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperY = mWallpaperTarget.mWallpaperY; 1715bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen mLastWallpaperYStep = mWallpaperTarget.mWallpaperYStep; 171673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 1717284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 1718ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 17194c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // Start stepping backwards from here, ensuring that our wallpaper windows 17204c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // are correctly placed. 17214c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int curTokenIndex = mWallpaperTokens.size(); 17224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn while (curTokenIndex > 0) { 17234c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn curTokenIndex--; 17244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn WindowToken token = mWallpaperTokens.get(curTokenIndex); 17250586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn if (token.hidden == visible) { 17260586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn changed |= ADJUST_WALLPAPER_VISIBILITY_CHANGED; 17270586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn token.hidden = !visible; 17280586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // Need to do a layout to ensure the wallpaper now has the 17290586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // correct size. 17300586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn mLayoutNeeded = true; 17310586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn } 1732ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 17334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int curWallpaperIndex = token.windows.size(); 17344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn while (curWallpaperIndex > 0) { 17354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn curWallpaperIndex--; 17364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn WindowState wallpaper = token.windows.get(curWallpaperIndex); 1737ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 173872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn if (visible) { 173919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn updateWallpaperOffsetLocked(wallpaper, dw, dh, false); 174072c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } 1741ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1742759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn // First, make sure the client has the current visibility 1743759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn // state. 1744759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn if (wallpaper.mWallpaperVisible != visible) { 1745759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn wallpaper.mWallpaperVisible = visible; 1746759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn try { 17478a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Slog.v(TAG, 1748759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn "Setting visibility of wallpaper " + wallpaper 1749759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn + ": " + visible); 1750759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn wallpaper.mClient.dispatchAppVisibility(visible); 1751759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } catch (RemoteException e) { 1752759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 1753759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 1754ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1755759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn wallpaper.mAnimLayer = wallpaper.mLayer + mWallpaperAnimLayerAdjustment; 17568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper win " 17577341d7a104b47996445d069a695e155a07184606Dianne Hackborn + wallpaper + " anim layer: " + wallpaper.mAnimLayer); 1758ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 17594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // First, if this window is at the current index, then all 17604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // is well. 1761f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (wallpaper == foundW) { 1762f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundI--; 1763f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundW = foundI > 0 1764e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown ? localmWindows.get(foundI-1) : null; 17654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn continue; 17664c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1767ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 17684c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // The window didn't match... the current wallpaper window, 17694c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // wherever it is, is in the wrong place, so make sure it is 17704c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // not in the list. 17714c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int oldIndex = localmWindows.indexOf(wallpaper); 17724c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (oldIndex >= 0) { 17738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Wallpaper removing at " 17749bfb707597898f54722460b48588007b682f3e2aDianne Hackborn + oldIndex + ": " + wallpaper); 17754c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn localmWindows.remove(oldIndex); 1776dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 1777f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (oldIndex < foundI) { 1778f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundI--; 17794c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 17804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1781ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 17824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // Now stick it in. 1783f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_WALLPAPER || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) { 1784f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.v(TAG, "Moving wallpaper " + wallpaper 1785f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + " from " + oldIndex + " to " + foundI); 1786f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 1787ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1788f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn localmWindows.add(foundI, wallpaper); 1789dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 17900586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn changed |= ADJUST_WALLPAPER_LAYERS_CHANGED; 17914c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 17924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1793ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 17944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return changed; 17954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 17964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1797c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn void setWallpaperAnimLayerAdjustmentLocked(int adj) { 17988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, 17997341d7a104b47996445d069a695e155a07184606Dianne Hackborn "Setting wallpaper layer adj to " + adj); 1800759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn mWallpaperAnimLayerAdjustment = adj; 1801759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn int curTokenIndex = mWallpaperTokens.size(); 1802759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn while (curTokenIndex > 0) { 1803759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn curTokenIndex--; 1804759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn WindowToken token = mWallpaperTokens.get(curTokenIndex); 1805759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn int curWallpaperIndex = token.windows.size(); 1806759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn while (curWallpaperIndex > 0) { 1807759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn curWallpaperIndex--; 1808759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn WindowState wallpaper = token.windows.get(curWallpaperIndex); 1809759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn wallpaper.mAnimLayer = wallpaper.mLayer + adj; 18108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper win " 18117341d7a104b47996445d069a695e155a07184606Dianne Hackborn + wallpaper + " anim layer: " + wallpaper.mAnimLayer); 1812759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 1813759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 1814759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 1815759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn 181619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn boolean updateWallpaperOffsetLocked(WindowState wallpaperWin, int dw, int dh, 181719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn boolean sync) { 181872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn boolean changed = false; 18197341d7a104b47996445d069a695e155a07184606Dianne Hackborn boolean rawChanged = false; 182073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn float wpx = mLastWallpaperX >= 0 ? mLastWallpaperX : 0.5f; 1821bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float wpxs = mLastWallpaperXStep >= 0 ? mLastWallpaperXStep : -1.0f; 1822ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn int availw = wallpaperWin.mFrame.right-wallpaperWin.mFrame.left-dw; 182373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn int offset = availw > 0 ? -(int)(availw*wpx+.5f) : 0; 182473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn changed = wallpaperWin.mXOffset != offset; 182573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (changed) { 18268a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper " 182773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn + wallpaperWin + " x: " + offset); 182873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn wallpaperWin.mXOffset = offset; 182973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 1830bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen if (wallpaperWin.mWallpaperX != wpx || wallpaperWin.mWallpaperXStep != wpxs) { 183173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn wallpaperWin.mWallpaperX = wpx; 1832bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen wallpaperWin.mWallpaperXStep = wpxs; 183373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn rawChanged = true; 1834c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1835ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 183673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn float wpy = mLastWallpaperY >= 0 ? mLastWallpaperY : 0.5f; 1837bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float wpys = mLastWallpaperYStep >= 0 ? mLastWallpaperYStep : -1.0f; 183873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn int availh = wallpaperWin.mFrame.bottom-wallpaperWin.mFrame.top-dh; 183973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn offset = availh > 0 ? -(int)(availh*wpy+.5f) : 0; 184073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (wallpaperWin.mYOffset != offset) { 18418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper " 184273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn + wallpaperWin + " y: " + offset); 184373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn changed = true; 184473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn wallpaperWin.mYOffset = offset; 184573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 1846bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen if (wallpaperWin.mWallpaperY != wpy || wallpaperWin.mWallpaperYStep != wpys) { 184773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn wallpaperWin.mWallpaperY = wpy; 1848bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen wallpaperWin.mWallpaperYStep = wpys; 184973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn rawChanged = true; 185072c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } 1851ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1852a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase if (rawChanged && (wallpaperWin.getAttrs().privateFlags & 1853a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase WindowManager.LayoutParams.PRIVATE_FLAG_WANTS_OFFSET_NOTIFICATIONS) != 0) { 185472c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn try { 18558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Report new wp offset " 1856e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn + wallpaperWin + " x=" + wallpaperWin.mWallpaperX 1857e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn + " y=" + wallpaperWin.mWallpaperY); 185819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (sync) { 18597580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWaitingOnWallpaper = wallpaperWin; 186019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 186172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn wallpaperWin.mClient.dispatchWallpaperOffsets( 1862bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen wallpaperWin.mWallpaperX, wallpaperWin.mWallpaperY, 1863bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen wallpaperWin.mWallpaperXStep, wallpaperWin.mWallpaperYStep, sync); 186419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (sync) { 18657580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if (mWaitingOnWallpaper != null) { 18667580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn long start = SystemClock.uptimeMillis(); 18677580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if ((mLastWallpaperTimeoutTime+WALLPAPER_TIMEOUT_RECOVERY) 18687580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn < start) { 18697580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn try { 18708a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 18717580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn "Waiting for offset complete..."); 18727580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWindowMap.wait(WALLPAPER_TIMEOUT); 18737580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } catch (InterruptedException e) { 18747580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 18758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Offset complete!"); 18767580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if ((start+WALLPAPER_TIMEOUT) 18777580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn < SystemClock.uptimeMillis()) { 18788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "Timeout waiting for wallpaper to offset: " 18797580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn + wallpaperWin); 18807580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mLastWallpaperTimeoutTime = start; 188119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 188219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 18837580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWaitingOnWallpaper = null; 188419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 188519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 188672c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } catch (RemoteException e) { 188772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } 1888c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1889ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1890c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn return changed; 1891c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1892ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 189319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn void wallpaperOffsetsComplete(IBinder window) { 18947580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn synchronized (mWindowMap) { 189519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (mWaitingOnWallpaper != null && 189619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mWaitingOnWallpaper.mClient.asBinder() == window) { 189719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mWaitingOnWallpaper = null; 18987580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWindowMap.notifyAll(); 189919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 190019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 190119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 1902ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1903a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase void updateWallpaperOffsetLocked(WindowState changingTarget, boolean sync) { 190481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dw = mAppDisplayWidth; 190581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dh = mAppDisplayHeight; 1906ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1907c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn WindowState target = mWallpaperTarget; 1908c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn if (target != null) { 190973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (target.mWallpaperX >= 0) { 191073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperX = target.mWallpaperX; 191173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } else if (changingTarget.mWallpaperX >= 0) { 191273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperX = changingTarget.mWallpaperX; 191373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 191473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (target.mWallpaperY >= 0) { 191573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperY = target.mWallpaperY; 191673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } else if (changingTarget.mWallpaperY >= 0) { 191773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperY = changingTarget.mWallpaperY; 191873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 191973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 1920ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 192173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn int curTokenIndex = mWallpaperTokens.size(); 192273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn while (curTokenIndex > 0) { 192373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn curTokenIndex--; 192473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn WindowToken token = mWallpaperTokens.get(curTokenIndex); 192573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn int curWallpaperIndex = token.windows.size(); 192673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn while (curWallpaperIndex > 0) { 192773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn curWallpaperIndex--; 192873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn WindowState wallpaper = token.windows.get(curWallpaperIndex); 192973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (updateWallpaperOffsetLocked(wallpaper, dw, dh, sync)) { 193073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn wallpaper.computeShownFrameLocked(); 1931a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase // No need to lay out the windows - we can just set the wallpaper position 1932a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase // directly. 1933a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase if (wallpaper.mSurfaceX != wallpaper.mShownFrame.left 1934a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase || wallpaper.mSurfaceY != wallpaper.mShownFrame.top) { 1935a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase Surface.openTransaction(); 1936a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase try { 1937a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase if (SHOW_TRANSACTIONS) logSurface(wallpaper, 1938a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase "POS " + wallpaper.mShownFrame.left 1939a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase + ", " + wallpaper.mShownFrame.top, null); 1940a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase wallpaper.mSurfaceX = wallpaper.mShownFrame.left; 1941a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase wallpaper.mSurfaceY = wallpaper.mShownFrame.top; 1942a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase wallpaper.mSurface.setPosition(wallpaper.mShownFrame.left, 1943a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase wallpaper.mShownFrame.top); 1944a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase } catch (RuntimeException e) { 1945a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase Slog.w(TAG, "Error positioning surface of " + wallpaper 1946a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase + " pos=(" + wallpaper.mShownFrame.left 1947a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase + "," + wallpaper.mShownFrame.top + ")", e); 1948a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase } 1949a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase Surface.closeTransaction(); 1950a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase } 195173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn // We only want to be synchronous with one wallpaper. 195273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn sync = false; 1953c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1954c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1955c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1956c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1957ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1958e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn void updateWallpaperVisibilityLocked() { 195925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn final boolean visible = isWallpaperVisible(mWallpaperTarget); 196081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dw = mAppDisplayWidth; 196181e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dh = mAppDisplayHeight; 1962ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1963e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn int curTokenIndex = mWallpaperTokens.size(); 1964e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn while (curTokenIndex > 0) { 1965e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn curTokenIndex--; 1966e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn WindowToken token = mWallpaperTokens.get(curTokenIndex); 19670586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn if (token.hidden == visible) { 19680586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn token.hidden = !visible; 19690586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // Need to do a layout to ensure the wallpaper now has the 19700586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // correct size. 19710586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn mLayoutNeeded = true; 19720586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn } 1973ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1974e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn int curWallpaperIndex = token.windows.size(); 1975e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn while (curWallpaperIndex > 0) { 1976e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn curWallpaperIndex--; 1977e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn WindowState wallpaper = token.windows.get(curWallpaperIndex); 1978e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn if (visible) { 197919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn updateWallpaperOffsetLocked(wallpaper, dw, dh, false); 1980e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 1981ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1982e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn if (wallpaper.mWallpaperVisible != visible) { 1983e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn wallpaper.mWallpaperVisible = visible; 1984e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn try { 19858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Slog.v(TAG, 198625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn "Updating visibility of wallpaper " + wallpaper 1987e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn + ": " + visible); 1988e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn wallpaper.mClient.dispatchAppVisibility(visible); 1989e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } catch (RemoteException e) { 1990e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 1991e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 1992e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 1993e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 1994e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 199590d2db3d21d07c2a4b4cbbc558f5ec59d20098c3Dianne Hackborn 19969a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn public int addWindow(Session session, IWindow client, int seq, 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams attrs, int viewVisibility, 199846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown Rect outContentInsets, InputChannel outInputChannel) { 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int res = mPolicy.checkAddPermission(attrs); 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != WindowManagerImpl.ADD_OKAY) { 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 200306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean reportNewConfig = false; 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState attachedWindow = null; 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = null; 20075132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn long origId; 200806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplay == null) { 20115132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn throw new IllegalStateException("Display has not been initialialized"); 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 201306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWindowMap.containsKey(client.asBinder())) { 20158a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Window " + client + " is already added"); 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_DUPLICATE_ADD; 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type >= FIRST_SUB_WINDOW && attrs.type <= LAST_SUB_WINDOW) { 2020e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn attachedWindow = windowForClientLocked(null, attrs.token, false); 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attachedWindow == null) { 20228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add window with token that is not a window: " 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.token + ". Aborting."); 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN; 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attachedWindow.mAttrs.type >= FIRST_SUB_WINDOW 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && attachedWindow.mAttrs.type <= LAST_SUB_WINDOW) { 20288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add window with token that is a sub-window: " 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.token + ". Aborting."); 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN; 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean addToken = false; 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mTokenMap.get(attrs.token); 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token == null) { 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type >= FIRST_APPLICATION_WINDOW 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && attrs.type <= LAST_APPLICATION_WINDOW) { 20398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add application window with unknown token " 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.token + ". Aborting."); 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_BAD_APP_TOKEN; 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type == TYPE_INPUT_METHOD) { 20448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add input method window with unknown token " 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.token + ". Aborting."); 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_BAD_APP_TOKEN; 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (attrs.type == TYPE_WALLPAPER) { 20498a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add wallpaper window with unknown token " 20504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn + attrs.token + ". Aborting."); 20514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return WindowManagerImpl.ADD_BAD_APP_TOKEN; 20524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 20536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn token = new WindowToken(this, attrs.token, -1, false); 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addToken = true; 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (attrs.type >= FIRST_APPLICATION_WINDOW 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && attrs.type <= LAST_APPLICATION_WINDOW) { 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken atoken = token.appWindowToken; 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken == null) { 20598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add window with non-application token " 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + token + ". Aborting."); 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_NOT_APP_TOKEN; 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (atoken.removed) { 20638a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add window with exiting application token " 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + token + ". Aborting."); 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_APP_EXITING; 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type == TYPE_APPLICATION_STARTING && atoken.firstWindowDrawn) { 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // No need for this guy! 20698a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "**** NO NEED TO START: " + attrs.getTitle()); 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_STARTING_NOT_NEEDED; 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (attrs.type == TYPE_INPUT_METHOD) { 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token.windowType != TYPE_INPUT_METHOD) { 20758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add input method window with bad token " 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.token + ". Aborting."); 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_BAD_APP_TOKEN; 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20794c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } else if (attrs.type == TYPE_WALLPAPER) { 20804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (token.windowType != TYPE_WALLPAPER) { 20818a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add wallpaper window with bad token " 20824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn + attrs.token + ". Aborting."); 20834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return WindowManagerImpl.ADD_BAD_APP_TOKEN; 20844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn win = new WindowState(this, session, client, token, 20889a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn attachedWindow, seq, attrs, viewVisibility); 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mDeathRecipient == null) { 20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Client has apparently died, so there is no reason to 20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // continue. 20928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Adding window client " + client.asBinder() 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " that is dead, aborting."); 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_APP_EXITING; 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.adjustWindowParamsLw(win.mAttrs); 209806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = mPolicy.prepareAddWindowLw(win, attrs); 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != WindowManagerImpl.ADD_OKAY) { 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 210346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2104cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown if (outInputChannel != null && (attrs.inputFeatures 2105cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown & WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0) { 210600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown String name = win.makeInputChannelName(); 210700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown InputChannel[] inputChannels = InputChannel.openInputChannelPair(name); 2108cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown win.setInputChannel(inputChannels[0]); 21090a0ab128a65900a23f1018a14f5cbecec6443dd3Jeff Brown inputChannels[1].transferTo(outInputChannel); 211000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 2111928e054931d357326613c78e62f4d850b7c442ffJeff Brown mInputManager.registerInputChannel(win.mInputChannel, win.mInputWindowHandle); 211246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // From now on, no exceptions or errors allowed! 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = WindowManagerImpl.ADD_OKAY; 211706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21185132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn origId = Binder.clearCallingIdentity(); 211906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (addToken) { 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTokenMap.put(attrs.token, token); 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.attach(); 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowMap.put(client.asBinder(), win); 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type == TYPE_APPLICATION_STARTING && 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.appWindowToken != null) { 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.appWindowToken.startingWindow = win; 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean imMayMove = true; 213206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type == TYPE_INPUT_METHOD) { 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodWindow = win; 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addInputMethodWindowToListLocked(win); 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imMayMove = false; 21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (attrs.type == TYPE_INPUT_METHOD_DIALOG) { 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodDialogs.add(win); 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addWindowToListInOrderLocked(win, true); 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project adjustInputMethodDialogsLocked(); 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imMayMove = false; 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addWindowToListInOrderLocked(win, true); 214419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (attrs.type == TYPE_WALLPAPER) { 214519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mLastWallpaperTimeoutTime = 0; 214619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn adjustWallpaperWindowsLocked(); 214719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } else if ((attrs.flags&FLAG_SHOW_WALLPAPER) != 0) { 21484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn adjustWallpaperWindowsLocked(); 21494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 215106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mEnterAnimationPending = true; 215306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.getContentInsetHintLw(attrs, outContentInsets); 215506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInTouchMode) { 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res |= WindowManagerImpl.ADD_FLAG_IN_TOUCH_MODE; 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == null || win.mAppToken == null || !win.mAppToken.clientHidden) { 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res |= WindowManagerImpl.ADD_FLAG_APP_VISIBLE; 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 216206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21632e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 21642e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown 2165c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project boolean focusChanged = false; 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.canReceiveKeys()) { 21673a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown focusChanged = updateFocusedWindowLocked(UPDATE_FOCUS_WILL_ASSIGN_LAYERS, 21683a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 2169349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown if (focusChanged) { 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imMayMove = false; 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 217306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imMayMove) { 217506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy moveInputMethodWindowsIfNeededLocked(false); 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 217706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayersLocked(); 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't do layout here, the window must call 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // relayout to be displayed, so we'll do it there. 218106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //dump(); 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2184c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project if (focusChanged) { 21853a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown finishUpdateFocusedWindowAfterAssignLayersLocked(false /*updateInputWindows*/); 2186c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project } 21872e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 21883a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown 21898a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "New client " + client.asBinder() 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": window=" + win); 2192e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 219394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (win.isVisibleOrAdding() && updateOrientationFromAppTokensLocked(false)) { 2194e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn reportNewConfig = true; 2195e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reportNewConfig) { 21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendNewConfiguration(); 22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22015132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 220306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 220606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeWindow(Session session, IWindow client) { 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 2209e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState win = windowForClientLocked(session, client, false); 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == null) { 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeWindowLocked(session, win); 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 221606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeWindowLocked(Session session, WindowState win) { 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22198a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV || DEBUG_FOCUS) Slog.v( 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Remove " + win + " client=" 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode( 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mClient.asBinder())) 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", surface=" + win.mSurface); 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 2226c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 2227c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown win.disposeInputChannel(); 222806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 22298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v( 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Remove " + win + ": mSurface=" + win.mSurface 22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mExiting=" + win.mExiting 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " isAnimating=" + win.isAnimating() 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " app-animation=" 22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (win.mAppToken != null ? win.mAppToken.animation : null) 22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " inPendingTransaction=" 22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (win.mAppToken != null ? win.mAppToken.inPendingTransaction : false) 22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mDisplayFrozen=" + mDisplayFrozen); 22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Visibility of the removed window. Will be used later to update orientation later on. 22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean wasVisible = false; 22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First, see if we need to run an animation. If we do, we have 22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to hold off on removing the window until the animation is done. 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the display is frozen, just remove immediately, since the 22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // animation wouldn't be seen. 2244bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn if (win.mSurface != null && !mDisplayFrozen && mDisplayEnabled 2245bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn && mPolicy.isScreenOnFully()) { 22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are not currently running the exit animation, we 22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // need to see about starting one. 22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wasVisible=win.isWinVisibleLw()) { 224906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transit = WindowManagerPolicy.TRANSIT_EXIT; 22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.getAttrs().type == TYPE_APPLICATION_STARTING) { 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transit = WindowManagerPolicy.TRANSIT_PREVIEW_DONE; 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Try starting an animation. 22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (applyAnimationLocked(win, transit, false)) { 22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mExiting = true; 22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mExiting || win.isAnimating()) { 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The exit animation is running... wait for it! 22618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "*** Running exit animation..."); 22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mExiting = true; 22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mRemoveOnExit = true; 22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 22653a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 22663a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 22682e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAppToken != null) { 22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAppToken.updateReportedVisibilityLocked(); 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //dump(); 22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeWindowInnerLocked(session, win); 22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Removing a visible window will effect the computed orientation 22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // So just update orientation if needed. 2281c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project if (wasVisible && computeForcedAppOrientationLocked() 2282e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn != mForcedAppOrientation 228394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn && updateOrientationFromAppTokensLocked(false)) { 2284e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22863a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/); 22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 228906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void removeWindowInnerLocked(Session session, WindowState win) { 2291f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (win.mRemoved) { 2292f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn // Nothing to do. 2293f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn return; 2294f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 2295f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn 2296f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn for (int i=win.mChildWindows.size()-1; i>=0; i--) { 2297f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn WindowState cwin = win.mChildWindows.get(i); 2298f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.w(TAG, "Force-removing child win " + cwin + " from container " 2299f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + win); 2300f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn removeWindowInnerLocked(cwin.mSession, cwin); 2301f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 2302f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn 23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mRemoved = true; 230406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInputMethodTarget == win) { 23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodWindowsIfNeededLocked(false); 23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 230806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 2309bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn if (false) { 2310bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn RuntimeException e = new RuntimeException("here"); 2311bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn e.fillInStackTrace(); 23128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Removing window " + win, e); 2313bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn } 2314ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.removeWindowLw(win); 23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.removeLocked(); 23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2318f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "removeWindowInnerLocked: " + win); 23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowMap.remove(win.mClient.asBinder()); 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(win); 2321f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn mPendingRemove.remove(win); 2322dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 23238a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Final remove of window: " + win); 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInputMethodWindow == win) { 23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodWindow = null; 23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (win.mAttrs.type == TYPE_INPUT_METHOD_DIALOG) { 23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodDialogs.remove(win); 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 233006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowToken token = win.mToken; 23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken atoken = win.mAppToken; 2333f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing " + win + " from " + token); 23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.remove(win); 23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null) { 23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.allAppWindows.remove(win); 23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "**** Removing window " + win + ": count=" 23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + token.windows.size()); 23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token.windows.size() == 0) { 23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!token.explicit) { 23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTokenMap.remove(token.token); 23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (atoken != null) { 23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.firstWindowDrawn = false; 23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null) { 23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken.startingWindow == win) { 23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.startingWindow = null; 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (atoken.allAppWindows.size() == 0 && atoken.startingData != null) { 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this is the last window and we had requested a starting 23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // transition window, well there is no point now. 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.startingData = null; 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (atoken.allAppWindows.size() == 1 && atoken.startingView != null) { 23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this is the last window except for a starting transition 23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // window, we need to get rid of the starting transition. 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_STARTING_WINDOW) { 23608a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Schedule remove starting " + token 23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": no more real windows"); 23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = mH.obtainMessage(H.REMOVE_STARTING, atoken); 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessage(m); 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 236706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 236819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (win.mAttrs.type == TYPE_WALLPAPER) { 236919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mLastWallpaperTimeoutTime = 0; 237019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn adjustWallpaperWindowsLocked(); 237119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } else if ((win.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0) { 2372e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn adjustWallpaperWindowsLocked(); 2373e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 2374ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mInLayout) { 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayersLocked(); 23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAppToken != null) { 23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAppToken.updateReportedVisibilityLocked(); 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2383c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 23842e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn static void logSurface(WindowState w, String msg, RuntimeException where) { 2388b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn String str = " SURFACE " + Integer.toHexString(w.hashCode()) 2389b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + ": " + msg + " / " + w.mAttrs.getTitle(); 2390b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (where != null) { 2391b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.i(TAG, str, where); 2392b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } else { 2393b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.i(TAG, str); 2394b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 2395b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 2396b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 23976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void setTransparentRegionWindow(Session session, IWindow client, Region region) { 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long origId = Binder.clearCallingIdentity(); 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 2401e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState w = windowForClientLocked(session, client, false); 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((w != null) && (w.mSurface != null)) { 240336991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 240494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn ">>> OPEN TRANSACTION setTransparentRegion"); 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface.openTransaction(); 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2407b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(w, 2408b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn "transparentRegionHint=" + region, null); 24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.setTransparentRegionHint(region); 24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface.closeTransaction(); 241236991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 241394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn "<<< CLOSE TRANSACTION setTransparentRegion"); 24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setInsetsWindow(Session session, IWindow client, 242306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy int touchableInsets, Rect contentInsets, 2424fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown Rect visibleInsets, Region touchableRegion) { 24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long origId = Binder.clearCallingIdentity(); 24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 2428e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState w = windowForClientLocked(session, client, false); 24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w != null) { 24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mGivenInsetsPending = false; 24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mGivenContentInsets.set(contentInsets); 24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mGivenVisibleInsets.set(visibleInsets); 2433fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown w.mGivenTouchableRegion.set(touchableRegion); 24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mTouchableInsets = touchableInsets; 2435ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn if (w.mGlobalScale != 1) { 2436ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn w.mGivenContentInsets.scale(w.mGlobalScale); 2437ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn w.mGivenVisibleInsets.scale(w.mGlobalScale); 2438ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn w.mGivenTouchableRegion.scale(w.mGlobalScale); 2439ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } 24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 244806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void getWindowDisplayFrame(Session session, IWindow client, 24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect outDisplayFrame) { 24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 2452e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState win = windowForClientLocked(session, client, false); 24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == null) { 24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outDisplayFrame.setEmpty(); 24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outDisplayFrame.set(win.mDisplayFrame); 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2461bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen public void setWindowWallpaperPositionLocked(WindowState window, float x, float y, 2462bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float xStep, float yStep) { 2463c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn if (window.mWallpaperX != x || window.mWallpaperY != y) { 2464c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn window.mWallpaperX = x; 2465c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn window.mWallpaperY = y; 2466bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen window.mWallpaperXStep = xStep; 2467bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen window.mWallpaperYStep = yStep; 2468a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase updateWallpaperOffsetLocked(window, true); 2469c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 2470c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 2471ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 24727580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn void wallpaperCommandComplete(IBinder window, Bundle result) { 24737580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn synchronized (mWindowMap) { 24747580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if (mWaitingOnWallpaper != null && 24757580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWaitingOnWallpaper.mClient.asBinder() == window) { 24767580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWaitingOnWallpaper = null; 24777580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWindowMap.notifyAll(); 24787580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 24797580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 24807580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 2481ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 24827580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn public Bundle sendWindowWallpaperCommandLocked(WindowState window, 24837580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn String action, int x, int y, int z, Bundle extras, boolean sync) { 24847580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if (window == mWallpaperTarget || window == mLowerWallpaperTarget 24857580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn || window == mUpperWallpaperTarget) { 24867580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn boolean doWait = sync; 24877580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn int curTokenIndex = mWallpaperTokens.size(); 24887580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn while (curTokenIndex > 0) { 24897580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn curTokenIndex--; 24907580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn WindowToken token = mWallpaperTokens.get(curTokenIndex); 24917580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn int curWallpaperIndex = token.windows.size(); 24927580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn while (curWallpaperIndex > 0) { 24937580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn curWallpaperIndex--; 24947580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn WindowState wallpaper = token.windows.get(curWallpaperIndex); 24957580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn try { 24967580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn wallpaper.mClient.dispatchWallpaperCommand(action, 24977580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn x, y, z, extras, sync); 24987580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn // We only want to be synchronous with one wallpaper. 24997580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn sync = false; 25007580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } catch (RemoteException e) { 25017580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 25027580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 25037580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 2504ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 25057580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if (doWait) { 25067580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn // XXX Need to wait for result. 25077580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 25087580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 2509ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 25107580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn return null; 25117580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 2512ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 25139a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn public int relayoutWindow(Session session, IWindow client, int seq, 25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams attrs, int requestedWidth, 25156d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn int requestedHeight, int viewVisibility, int flags, 25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect outFrame, Rect outContentInsets, Rect outVisibleInsets, 2517694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn Configuration outConfig, Surface outSurface) { 25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean displayed = false; 25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean inTouchMode; 2520e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean configChanged; 25216d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn boolean surfaceChanged = false; 2522ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato 2523ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato // if they don't have this permission, mask out the status bar bits 25249a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn int systemUiVisibility = 0; 2525ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato if (attrs != null) { 25269a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn systemUiVisibility = (attrs.systemUiVisibility|attrs.subtreeSystemUiVisibility); 25279a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn if ((systemUiVisibility & StatusBarManager.DISABLE_MASK) != 0) { 2528a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR) 2529a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn != PackageManager.PERMISSION_GRANTED) { 25309a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn systemUiVisibility &= ~StatusBarManager.DISABLE_MASK; 2531a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 2532ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato } 2533ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato } 25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long origId = Binder.clearCallingIdentity(); 253506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 2537e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState win = windowForClientLocked(session, client, false); 25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == null) { 25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mRequestedWidth = requestedWidth; 25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mRequestedHeight = requestedHeight; 25439a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn if (attrs != null && seq == win.mSeq) { 25449a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn win.mSystemUiVisibility = systemUiVisibility; 25459a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn } 25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs != null) { 25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.adjustWindowParamsLw(attrs); 25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 255006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 25516d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn win.mSurfaceDestroyDeferred = 25526d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn (flags&WindowManagerImpl.RELAYOUT_DEFER_SURFACE_DESTROY) != 0; 25536d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn 25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int attrChanges = 0; 25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flagChanges = 0; 25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs != null) { 25570e60db221c80bb1c57eaa7989b7079e5ba5a27a4Dianne Hackborn if (win.mAttrs.type != attrs.type) { 25580e60db221c80bb1c57eaa7989b7079e5ba5a27a4Dianne Hackborn throw new IllegalArgumentException( 25590e60db221c80bb1c57eaa7989b7079e5ba5a27a4Dianne Hackborn "Window type can not be changed after the window is added."); 25600e60db221c80bb1c57eaa7989b7079e5ba5a27a4Dianne Hackborn } 25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flagChanges = win.mAttrs.flags ^= attrs.flags; 25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attrChanges = win.mAttrs.copyFrom(attrs); 25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYOUT) Slog.v(TAG, "Relayout " + win + ": " + win.mAttrs); 25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25675fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn win.mEnforceSizeCompat = (win.mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0; 25685fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((attrChanges & WindowManager.LayoutParams.ALPHA_CHANGED) != 0) { 25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAlpha = attrs.alpha; 25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean scaledWindow = 25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((win.mAttrs.flags & WindowManager.LayoutParams.FLAG_SCALED) != 0); 25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scaledWindow) { 25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // requested{Width|Height} Surface's physical size 25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // attrs.{width|height} Size on screen 25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mHScale = (attrs.width != requestedWidth) ? 25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (attrs.width / (float)requestedWidth) : 1.0f; 25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mVScale = (attrs.height != requestedHeight) ? 25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (attrs.height / (float)requestedHeight) : 1.0f; 25839b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn } else { 25849b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn win.mHScale = win.mVScale = 1; 25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean imMayMove = (flagChanges&( 25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM | 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)) != 0; 259006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean focusMayChange = win.mViewVisibility != viewVisibility 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || ((flagChanges&WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) != 0) 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (!win.mRelayoutCalled); 259406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 25954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn boolean wallpaperMayMove = win.mViewVisibility != viewVisibility 25964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn && (win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0; 25979e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn wallpaperMayMove |= (flagChanges & FLAG_SHOW_WALLPAPER) != 0; 2598ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mRelayoutCalled = true; 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int oldVisibility = win.mViewVisibility; 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mViewVisibility = viewVisibility; 260229aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (DEBUG_SCREEN_ON) { 260329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn RuntimeException stack = new RuntimeException(); 260429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn stack.fillInStackTrace(); 260529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn Slog.i(TAG, "Relayout " + win + ": oldVis=" + oldVisibility 260629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn + " newVis=" + viewVisibility, stack); 260729aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (viewVisibility == View.VISIBLE && 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (win.mAppToken == null || !win.mAppToken.clientHidden)) { 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayed = !win.isVisibleLw(); 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mExiting) { 2612cef37fb481d16eda2b304887a8738ed599bc1b21satok win.cancelExitAnimationForNextAnimationLocked(); 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mDestroying) { 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mDestroying = false; 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDestroySurface.remove(win); 26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldVisibility == View.GONE) { 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mEnterAnimationPending = true; 26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2621694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (displayed) { 2622694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (win.mSurface != null && !win.mDrawPending 2623694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn && !win.mCommitDrawPending && !mDisplayFrozen 2624bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn && mDisplayEnabled && mPolicy.isScreenOnFully()) { 2625694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn applyEnterAnimationLocked(win); 2626694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 2627694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if ((win.mAttrs.flags 2628694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn & WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) != 0) { 2629694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (DEBUG_VISIBILITY) Slog.v(TAG, 2630694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn "Relayout window turning screen on: " + win); 2631694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn win.mTurnOnScreen = true; 2632694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 2633694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn int diff = 0; 2634694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (win.mConfiguration != mCurConfiguration 2635694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn && (win.mConfiguration == null 2636694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn || (diff=mCurConfiguration.diff(win.mConfiguration)) != 0)) { 2637694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn win.mConfiguration = mCurConfiguration; 2638694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (DEBUG_CONFIGURATION) { 2639694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn Slog.i(TAG, "Window " + win + " visible with new config: " 2640694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn + win.mConfiguration + " / 0x" 2641694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn + Integer.toHexString(diff)); 2642694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 2643694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn outConfig.setTo(mCurConfiguration); 2644694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 264593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } 26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((attrChanges&WindowManager.LayoutParams.FORMAT_CHANGED) != 0) { 26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // To change the format, we need to re-build the surface. 26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.destroySurfaceLocked(); 26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayed = true; 26506d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn surfaceChanged = true; 26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 26536d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (win.mSurface == null) { 26546d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn surfaceChanged = true; 26556d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface surface = win.createSurfaceLocked(); 26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (surface != null) { 26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outSurface.copyFrom(surface); 26593b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn win.mReportDestroySurface = false; 26603b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn win.mSurfacePendingDestroy = false; 26618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (SHOW_TRANSACTIONS) Slog.i(TAG, 26620586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn " OUT SURFACE " + outSurface + ": copied"); 26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26640586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // For some reason there isn't a surface. Clear the 26650586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // caller's object so they see the same state. 26660586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn outSurface.release(); 26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 26692e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 2670e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 26718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception thrown when creating surface for client " 26720586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn + client + " (" + win.mAttrs.getTitle() + ")", 26730586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn e); 26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (displayed) { 26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project focusMayChange = true; 26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAttrs.type == TYPE_INPUT_METHOD 26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && mInputMethodWindow == null) { 26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodWindow = win; 26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imMayMove = true; 26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2685558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn if (win.mAttrs.type == TYPE_BASE_APPLICATION 2686558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn && win.mAppToken != null 2687558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn && win.mAppToken.startingWindow != null) { 2688558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn // Special handling of starting window over the base 2689558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn // window of the app: propagate lock screen flags to it, 2690558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn // to provide the correct semantics while starting. 2691558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn final int mask = 2692558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 2693ef73162887943e16587b8e737b19e59348338e8cMike Lockwood | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 2694ef73162887943e16587b8e737b19e59348338e8cMike Lockwood | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON; 2695558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn WindowManager.LayoutParams sa = win.mAppToken.startingWindow.mAttrs; 2696558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn sa.flags = (sa.flags&~mask) | (win.mAttrs.flags&mask); 2697558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn } 26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mEnterAnimationPending = false; 27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mSurface != null) { 27018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.i(TAG, "Relayout invis " + win 27023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + ": mExiting=" + win.mExiting 27033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + " mSurfacePendingDestroy=" + win.mSurfacePendingDestroy); 27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are not currently running the exit animation, we 27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // need to see about starting one. 27063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (!win.mExiting || win.mSurfacePendingDestroy) { 27076d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn surfaceChanged = true; 27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Try starting an animation; if there isn't one, we 27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // can destroy the surface right away. 27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transit = WindowManagerPolicy.TRANSIT_EXIT; 27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.getAttrs().type == TYPE_APPLICATION_STARTING) { 27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transit = WindowManagerPolicy.TRANSIT_PREVIEW_DONE; 27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (!win.mSurfacePendingDestroy && win.isWinVisibleLw() && 27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applyAnimationLocked(win, transit, false)) { 27163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn focusMayChange = true; 27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mExiting = true; 27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (win.isAnimating()) { 27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Currently in a hide animation... turn this into 27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // an exit. 27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mExiting = true; 27226136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn } else if (win == mWallpaperTarget) { 27236136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn // If the wallpaper is currently behind this 27246136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn // window, we need to change both of them inside 27256136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn // of a transaction to avoid artifacts. 27266136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn win.mExiting = true; 27276136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn win.mAnimating = true; 27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInputMethodWindow == win) { 27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodWindow = null; 27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.destroySurfaceLocked(); 27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2736ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 27373b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (win.mSurface == null || (win.getAttrs().flags 27383b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn & WindowManager.LayoutParams.FLAG_KEEP_SURFACE_WHILE_ANIMATING) == 0 27393b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn || win.mSurfacePendingDestroy) { 27406d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn // We could be called from a local process, which 27413b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // means outSurface holds its current surface. Ensure the 27426d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn // surface object is cleared, but we don't necessarily want 27436d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn // it actually destroyed at this point. 27443b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn win.mSurfacePendingDestroy = false; 27453b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn outSurface.release(); 27468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.i(TAG, "Releasing surface in: " + win); 27473b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (win.mSurface != null) { 27488a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.i(TAG, 27493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn "Keeping surface, will report destroy: " + win); 27503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn win.mReportDestroySurface = true; 27513b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn outSurface.copyFrom(win.mSurface); 27523b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (focusMayChange) { 27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //System.out.println("Focus may change: " + win.mAttrs.getTitle()); 27573a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown if (updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 27583a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/)) { 27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imMayMove = false; 27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //System.out.println("Relayout " + win + ": focus=" + mCurrentFocus); 27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 276306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 2764c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project // updateFocusedWindowLocked() already assigned layers so we only need to 2765c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project // reassign them at this point if the IM window state gets shuffled 2766c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project boolean assignLayers = false; 276706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imMayMove) { 27698abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn if (moveInputMethodWindowsIfNeededLocked(false) || displayed) { 27708abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn // Little hack here -- we -should- be able to rely on the 27718abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn // function to return true if the IME has moved and needs 27728abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn // its layer recomputed. However, if the IME was hidden 27738abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn // and isn't actually moved in the list, its layer may be 27748abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn // out of data so we make sure to recompute it. 27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayers = true; 27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27784c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (wallpaperMayMove) { 27790586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn if ((adjustWallpaperWindowsLocked()&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) { 27804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn assignLayers = true; 27814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 27824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 278306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 27856d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn win.mGivenInsetsPending = (flags&WindowManagerImpl.RELAYOUT_INSETS_PENDING) != 0; 27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assignLayers) { 27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayersLocked(); 27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 278994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn configChanged = updateOrientationFromAppTokensLocked(false); 27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 2791284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (displayed && win.mIsWallpaper) { 279281e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn updateWallpaperOffsetLocked(win, mAppDisplayWidth, mAppDisplayHeight, false); 2793284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAppToken != null) { 27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAppToken.updateReportedVisibilityLocked(); 27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2797ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn outFrame.set(win.mCompatFrame); 27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outContentInsets.set(win.mContentInsets); 27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVisibleInsets.set(win.mVisibleInsets); 28008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Relayout given client " + client.asBinder() 280206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy + ", requestedWidth=" + requestedWidth 28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", requestedHeight=" + requestedHeight 28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", viewVisibility=" + viewVisibility 28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "\nRelayout returning frame=" + outFrame 28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", surface=" + outSurface); 28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV || DEBUG_FOCUS) Slog.v( 28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Relayout of " + win + ": focusMayChange=" + focusMayChange); 28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inTouchMode = mInTouchMode; 2812e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 28132e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2816e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (configChanged) { 28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendNewConfiguration(); 28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 281906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 282106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 28226d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn return (inTouchMode ? WindowManagerImpl.RELAYOUT_RES_IN_TOUCH_MODE : 0) 28236d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn | (displayed ? WindowManagerImpl.RELAYOUT_RES_FIRST_TIME : 0) 28246d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn | (surfaceChanged ? WindowManagerImpl.RELAYOUT_RES_SURFACE_CHANGED : 0); 28256d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 28266d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn 28276d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn public void performDeferredDestroyWindow(Session session, IWindow client) { 28286d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn long origId = Binder.clearCallingIdentity(); 28296d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn 28306d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn try { 28316d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn synchronized(mWindowMap) { 28326d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn WindowState win = windowForClientLocked(session, client, false); 28336d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (win == null) { 28346d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn return; 28356d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 28366d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn win.destroyDeferredSurfaceLocked(); 28376d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 28386d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } finally { 28396d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn Binder.restoreCallingIdentity(origId); 28406d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2843648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn public boolean outOfMemoryWindow(Session session, IWindow client) { 2844648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn long origId = Binder.clearCallingIdentity(); 2845648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn 2846648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn try { 2847648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn synchronized(mWindowMap) { 2848648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn WindowState win = windowForClientLocked(session, client, false); 2849648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn if (win == null) { 2850648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn return false; 2851648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn } 2852648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn return reclaimSomeSurfaceMemoryLocked(win, "from-client", false); 2853648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn } 2854648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn } finally { 2855648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn Binder.restoreCallingIdentity(origId); 2856648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn } 2857648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn } 2858648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn 28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void finishDrawingWindow(Session session, IWindow client) { 28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 2862e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState win = windowForClientLocked(session, client, false); 28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win != null && win.finishDrawingLocked()) { 2864759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn if ((win.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0) { 2865759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn adjustWallpaperWindowsLocked(); 2866759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28747961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov public float getWindowCompatibilityScale(IBinder windowToken) { 28757961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov synchronized (mWindowMap) { 28767961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov WindowState windowState = mWindowMap.get(windowToken); 28777961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov return (windowState != null) ? windowState.mGlobalScale : 1.0f; 28787961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov } 28797961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov } 28807961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov 28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AttributeCache.Entry getCachedAnimations(WindowManager.LayoutParams lp) { 288208121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: layout params pkg=" 28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (lp != null ? lp.packageName : null) 28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " resId=0x" + (lp != null ? Integer.toHexString(lp.windowAnimations) : null)); 28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lp != null && lp.windowAnimations != 0) { 28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this is a system resource, don't try to load it from the 28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // application resources. It is nice to avoid loading application 28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // resources if we can. 28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String packageName = lp.packageName != null ? lp.packageName : "android"; 28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int resId = lp.windowAnimations; 28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((resId&0xFF000000) == 0x01000000) { 28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = "android"; 28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28948a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package=" 28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + packageName); 28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AttributeCache.instance().get(packageName, resId, 28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.WindowAnimation); 28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 290106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 29023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn private AttributeCache.Entry getCachedAnimations(String packageName, int resId) { 290308121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: package=" 29043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + packageName + " resId=0x" + Integer.toHexString(resId)); 29053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (packageName != null) { 29063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if ((resId&0xFF000000) == 0x01000000) { 29073b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn packageName = "android"; 29083b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 29098a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package=" 29103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + packageName); 29113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn return AttributeCache.instance().get(packageName, resId, 29123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn com.android.internal.R.styleable.WindowAnimation); 29133b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 29143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn return null; 29153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 29163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn 29176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void applyEnterAnimationLocked(WindowState win) { 29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transit = WindowManagerPolicy.TRANSIT_SHOW; 29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mEnterAnimationPending) { 29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mEnterAnimationPending = false; 29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transit = WindowManagerPolicy.TRANSIT_ENTER; 29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applyAnimationLocked(win, transit, true); 29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean applyAnimationLocked(WindowState win, 29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transit, boolean isEntrance) { 29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mLocalAnimating && win.mAnimationIsEntrance == isEntrance) { 29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are trying to apply an animation, but already running 29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // an animation of the same type, then just leave that one alone. 29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 293406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Only apply an animation if the display isn't frozen. If it is 29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // frozen, there is no reason to animate and it can cause strange 29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // artifacts when we unfreeze the display if some different animation 29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is running. 2939bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn if (!mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOnFully()) { 29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int anim = mPolicy.selectAnimationLw(win, transit); 29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int attr = -1; 29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Animation a = null; 29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (anim != 0) { 29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a = AnimationUtils.loadAnimation(mContext, anim); 29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (transit) { 29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WindowManagerPolicy.TRANSIT_ENTER: 29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation; 29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WindowManagerPolicy.TRANSIT_EXIT: 29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation; 29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WindowManagerPolicy.TRANSIT_SHOW: 29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation; 29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WindowManagerPolicy.TRANSIT_HIDE: 29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation; 29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attr >= 0) { 29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a = loadAnimation(win.mAttrs, attr); 29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: win=" + win 29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " anim=" + anim + " attr=0x" + Integer.toHexString(attr) 29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAnimation=" + win.mAnimation 29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " isEntrance=" + isEntrance); 29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a != null) { 29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_ANIM) { 2970b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 2971b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 2972b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 2973b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 2974b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 29758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Loaded animation " + a + " for " + win, e); 29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.setAnimation(a); 29789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAnimationIsEntrance = isEntrance; 29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.clearAnimation(); 29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return win.mAnimation != null; 29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Animation loadAnimation(WindowManager.LayoutParams lp, int animAttr) { 29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int anim = 0; 29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context context = mContext; 29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (animAttr >= 0) { 29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeCache.Entry ent = getCachedAnimations(lp); 29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ent != null) { 29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context = ent.context; 29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project anim = ent.array.getResourceId(animAttr, 0); 29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (anim != 0) { 29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AnimationUtils.loadAnimation(context, anim); 29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 300206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 30033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn private Animation loadAnimation(String packageName, int resId) { 30043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int anim = 0; 30053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn Context context = mContext; 30063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (resId >= 0) { 30073b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn AttributeCache.Entry ent = getCachedAnimations(packageName, resId); 30083b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (ent != null) { 30093b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn context = ent.context; 30103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn anim = resId; 30113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 30123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 30133b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (anim != 0) { 30143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn return AnimationUtils.loadAnimation(context, anim); 30153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 30163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn return null; 30173b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 30183b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn 30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean applyAnimationLocked(AppWindowToken wtoken, 3020ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn WindowManager.LayoutParams lp, int transit, boolean enter) { 30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Only apply an animation if the display isn't frozen. If it is 30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // frozen, there is no reason to animate and it can cause strange 30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // artifacts when we unfreeze the display if some different animation 30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is running. 3025bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn if (!mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOnFully()) { 30260a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima Animation a; 3027ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn if (mNextAppTransitionPackage != null) { 30283b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn a = loadAnimation(mNextAppTransitionPackage, enter ? 30293b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn mNextAppTransitionEnter : mNextAppTransitionExit); 30300a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima } else { 30310a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima int animAttr = 0; 30320a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima switch (transit) { 30330a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN: 30340a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 30350a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation 30360a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation; 30370a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 30380a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE: 30390a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 30400a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation 30410a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation; 30420a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 30430a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_TASK_OPEN: 30440a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 30450a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation 30460a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation; 30470a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 30480a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_TASK_CLOSE: 30490a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 30500a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_taskCloseEnterAnimation 30510a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_taskCloseExitAnimation; 30520a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 30530a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT: 30540a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 30550a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation 30560a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation; 30570a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 30580a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_TASK_TO_BACK: 30590a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 30605a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation 30610a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation; 30620a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 306325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN: 306425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn animAttr = enter 306525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation 306625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn : com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation; 306725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn break; 306825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE: 306925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn animAttr = enter 307025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_wallpaperCloseEnterAnimation 307125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn : com.android.internal.R.styleable.WindowAnimation_wallpaperCloseExitAnimation; 307225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn break; 307325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN: 3074f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn animAttr = enter 307525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenEnterAnimation 307625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation; 3077f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn break; 307825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE: 3079f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn animAttr = enter 308025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseEnterAnimation 308125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseExitAnimation; 3082f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn break; 30830a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima } 3084bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn a = animAttr != 0 ? loadAnimation(lp, animAttr) : null; 30858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: wtoken=" + wtoken 30860a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima + " anim=" + a 30870a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima + " animAttr=0x" + Integer.toHexString(animAttr) 30880a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima + " transit=" + transit); 30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a != null) { 30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_ANIM) { 3092b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 3093b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 3094b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 3095b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 3096b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 30978a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Loaded animation " + a + " for " + wtoken, e); 30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.setAnimation(a); 31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.clearAnimation(); 31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return wtoken.animation != null; 31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Application Window Tokens 31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3112be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn public void validateAppTokens(List<IBinder> tokens) { 31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int v = tokens.size()-1; 31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int m = mAppTokens.size()-1; 31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (v >= 0 && m >= 0) { 31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mAppTokens.get(m); 31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.removed) { 31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m--; 31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tokens.get(v) != wtoken.token) { 31228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Tokens out of sync: external is " + tokens.get(v) 31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " @ " + v + ", internal is " + wtoken.token + " @ " + m); 31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v--; 31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m--; 31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (v >= 0) { 31298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "External token not found: " + tokens.get(v) + " @ " + v); 31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v--; 31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (m >= 0) { 31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mAppTokens.get(m); 31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!wtoken.removed) { 31358a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Invalid internal token: " + wtoken.token + " @ " + m); 31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m--; 31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean checkCallingPermission(String permission, String func) { 31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Quick check: if the calling permission is me, it's all okay. 31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Binder.getCallingPid() == Process.myPid()) { 31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 314606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mContext.checkCallingPermission(permission) 31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == PackageManager.PERMISSION_GRANTED) { 31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String msg = "Permission Denial: " + func + " from pid=" 31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Binder.getCallingPid() 31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", uid=" + Binder.getCallingUid() 31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " requires " + permission; 31558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, msg); 31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 315806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken findAppWindowToken(IBinder token) { 31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken wtoken = mTokenMap.get(token); 31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return wtoken.appWindowToken; 31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 316606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addWindowToken(IBinder token, int type) { 31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "addWindowToken()")) { 3170cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 317206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken wtoken = mTokenMap.get(token); 31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken != null) { 31768a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add existing input method token: " + token); 31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn wtoken = new WindowToken(this, token, type, true); 31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTokenMap.put(token, wtoken); 31814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (type == TYPE_WALLPAPER) { 31824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWallpaperTokens.add(wtoken); 31834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 318606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeWindowToken(IBinder token) { 31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "removeWindowToken()")) { 3190cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken wtoken = mTokenMap.remove(token); 31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken != null) { 31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean delayed = false; 31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!wtoken.hidden) { 31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hidden = true; 320006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = wtoken.windows.size(); 32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = false; 320306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = wtoken.windows.get(i); 32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.isAnimating()) { 32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = true; 32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 321006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.isVisibleNow()) { 32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applyAnimationLocked(win, 32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerPolicy.TRANSIT_EXIT, false); 32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = true; 32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (changed) { 32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 32213a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, 32223a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 322406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delayed) { 32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingTokens.add(wtoken); 32274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } else if (wtoken.windowType == TYPE_WALLPAPER) { 32284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWallpaperTokens.remove(wtoken); 32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 323106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 32322e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 32348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to remove non-existing token: " + token); 32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addAppToken(int addPos, IApplicationToken token, 32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int groupId, int requestedOrientation, boolean fullscreen) { 32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "addAppToken()")) { 3244cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3246349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 3247349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // Get the dispatching timeout here while we are not holding any locks so that it 3248349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // can be cached by the AppWindowToken. The timeout value is used later by the 3249349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // input dispatcher in code that does hold locks. If we did not cache the value 3250349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // here we would run the chance of introducing a deadlock between the window manager 3251349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // (which holds locks while updating the input dispatcher state) and the activity manager 3252349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // (which holds locks while querying the application token). 3253349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown long inputDispatchingTimeoutNanos; 3254349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown try { 3255349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown inputDispatchingTimeoutNanos = token.getKeyDispatchingTimeout() * 1000000L; 3256349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } catch (RemoteException ex) { 3257349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown Slog.w(TAG, "Could not get dispatching timeout.", ex); 3258349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown inputDispatchingTimeoutNanos = DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS; 3259349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } 326006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token.asBinder()); 32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken != null) { 32648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add existing app token: " + token); 32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn wtoken = new AppWindowToken(this, token); 3268349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown wtoken.inputDispatchingTimeoutNanos = inputDispatchingTimeoutNanos; 32699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.groupId = groupId; 32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.appFullscreen = fullscreen; 32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.requestedOrientation = requestedOrientation; 3272f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_TOKEN_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, "addAppToken: " + wtoken); 32739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.add(addPos, wtoken); 32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTokenMap.put(token.asBinder(), wtoken); 327506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Application tokens start out hidden. 32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hidden = true; 32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hiddenRequested = true; 327906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //dump(); 32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 328306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAppGroupId(IBinder token, int groupId) { 32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppStartingIcon()")) { 3287cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token); 32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 32938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set group id of non-existing app token: " + token); 32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.groupId = groupId; 32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 329906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getOrientationFromWindowsLocked() { 3301bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (mDisplayFrozen || mOpeningApps.size() > 0 || mClosingApps.size() > 0) { 3302bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn // If the display is frozen, some activities may be in the middle 3303bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn // of restarting, and thus have removed their old window. If the 3304bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn // window has the flag to hide the lock screen, then the lock screen 3305bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn // can re-appear and inflict its own orientation on us. Keep the 3306bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn // orientation stable until this all settles down. 3307bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn return mLastWindowForcedOrientation; 3308bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn } 3309bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn 33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = mWindows.size() - 1; 33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (pos >= 0) { 3312e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState wtoken = mWindows.get(pos); 33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos--; 33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.mAppToken != null) { 33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We hit an application window. so the orientation will be determined by the 33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // app window. No point in continuing further. 3317bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate if (!wtoken.isVisibleLw() || !wtoken.mPolicyVisibilityAfterAnim) { 33209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 33219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int req = wtoken.mAttrs.screenOrientation; 33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if((req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) || 33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (req == ActivityInfo.SCREEN_ORIENTATION_BEHIND)){ 33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3327bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn return (mLastWindowForcedOrientation=req); 33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3330bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 333206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getOrientationFromAppTokensLocked() { 3334e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn int pos = mAppTokens.size() - 1; 3335e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn int curGroup = 0; 3336e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn int lastOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 3337e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean findingBehind = false; 3338e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean haveGroup = false; 3339e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean lastFullscreen = false; 3340e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn while (pos >= 0) { 3341e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn AppWindowToken wtoken = mAppTokens.get(pos); 3342e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn pos--; 3343bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn 3344bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_APP_ORIENTATION) Slog.v(TAG, "Checking app orientation: " + wtoken); 3345bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn 3346e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // if we're about to tear down this window and not seek for 3347e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // the behind activity, don't use it for orientation 3348e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (!findingBehind 3349e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn && (!wtoken.hidden && wtoken.hiddenRequested)) { 3350bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping " + wtoken 3351bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn + " -- going to hide"); 3352e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn continue; 3353e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3354e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 3355e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (!haveGroup) { 3356e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // We ignore any hidden applications on the top. 3357e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (wtoken.hiddenRequested || wtoken.willBeHidden) { 3358bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping " + wtoken 3359bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn + " -- hidden on top"); 3360105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project continue; 3361105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 3362e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn haveGroup = true; 3363e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn curGroup = wtoken.groupId; 3364e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn lastOrientation = wtoken.requestedOrientation; 3365e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } else if (curGroup != wtoken.groupId) { 3366e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // If we have hit a new application group, and the bottom 3367e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // of the previous group didn't explicitly say to use 3368e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // the orientation behind it, and the last app was 3369e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // full screen, then we'll stick with the 3370e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // user's orientation. 3371e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (lastOrientation != ActivityInfo.SCREEN_ORIENTATION_BEHIND 3372e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn && lastFullscreen) { 3373bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken 3374bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn + " -- end of group, return " + lastOrientation); 3375e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return lastOrientation; 3376e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3377e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3378e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn int or = wtoken.requestedOrientation; 3379e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // If this application is fullscreen, and didn't explicitly say 3380e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // to use the orientation behind it, then just take whatever 3381e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // orientation it has and ignores whatever is under it. 3382e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn lastFullscreen = wtoken.appFullscreen; 3383e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (lastFullscreen 3384e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn && or != ActivityInfo.SCREEN_ORIENTATION_BEHIND) { 3385bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken 3386bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn + " -- full screen, return " + or); 3387e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return or; 3388e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3389e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // If this application has requested an explicit orientation, 3390e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // then use it. 3391e5439f228f603f60febe058f633d91d5af2fff76Dianne Hackborn if (or != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED 3392e5439f228f603f60febe058f633d91d5af2fff76Dianne Hackborn && or != ActivityInfo.SCREEN_ORIENTATION_BEHIND) { 3393bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken 3394bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn + " -- explicitly set, return " + or); 3395e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return or; 3396e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3397e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn findingBehind |= (or == ActivityInfo.SCREEN_ORIENTATION_BEHIND); 3398e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3399bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "No app is requesting an orientation"); 3400e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 340206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Configuration updateOrientationFromAppTokens( 3404105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project Configuration currentConfig, IBinder freezeThisOneIfNeeded) { 3405cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 3406cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn "updateOrientationFromAppTokens()")) { 3407cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 3408cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn } 3409ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 3410e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn Configuration config = null; 34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long ident = Binder.clearCallingIdentity(); 3412e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 34147916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn config = updateOrientationFromAppTokensLocked(currentConfig, 34157916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn freezeThisOneIfNeeded); 34167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 34177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 34187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Binder.restoreCallingIdentity(ident); 34197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn return config; 34207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 34217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 34227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn private Configuration updateOrientationFromAppTokensLocked( 34237916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Configuration currentConfig, IBinder freezeThisOneIfNeeded) { 34247916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Configuration config = null; 34257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 34267916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (updateOrientationFromAppTokensLocked(false)) { 34277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (freezeThisOneIfNeeded != null) { 34287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn AppWindowToken wtoken = findAppWindowToken( 34297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn freezeThisOneIfNeeded); 34307916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (wtoken != null) { 34317916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn startAppFreezingScreenLocked(wtoken, 34327916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ActivityInfo.CONFIG_ORIENTATION); 34337916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 34347916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 34357916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn config = computeNewConfigurationLocked(); 34367916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 34377916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else if (currentConfig != null) { 34387916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn // No obvious action we need to take, but if our current 34397916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn // state mismatches the activity manager's, update it, 34407916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn // disregarding font scale, which should remain set to 34417916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn // the value of the previous configuration. 34427916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mTempConfiguration.setToDefaults(); 34437916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mTempConfiguration.fontScale = currentConfig.fontScale; 34447916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (computeNewConfigurationLocked(mTempConfiguration)) { 34457916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (currentConfig.diff(mTempConfiguration) != 0) { 34467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mWaitingForConfig = true; 34477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mLayoutNeeded = true; 34487916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn startFreezingDisplayLocked(false); 34497916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn config = new Configuration(mTempConfiguration); 3450e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3451bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn } 34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3453e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return config; 34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 345606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 3458e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * Determine the new desired orientation of the display, returning 3459e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * a non-null new Configuration if it has changed from the current 3460e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * orientation. IF TRUE IS RETURNED SOMEONE MUST CALL 3461e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * setNewConfiguration() TO TELL THE WINDOW MANAGER IT CAN UNFREEZE THE 3462e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * SCREEN. This will typically be done for you if you call 3463e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * sendNewConfiguration(). 3464e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * 34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The orientation is computed from non-application windows first. If none of 34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the non-application windows specify orientation, the orientation is computed from 346706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * application tokens. 34689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.IWindowManager#updateOrientationFromAppTokens( 34699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android.os.IBinder) 34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 347194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn boolean updateOrientationFromAppTokensLocked(boolean inTransaction) { 34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = false; 34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long ident = Binder.clearCallingIdentity(); 34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3475c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project int req = computeForcedAppOrientationLocked(); 347606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (req != mForcedAppOrientation) { 34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForcedAppOrientation = req; 34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //send a message to Policy indicating orientation change to take 34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //action like disabling/enabling sensors etc., 3481c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project mPolicy.setCurrentOrientationLw(req); 348201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if (updateRotationUncheckedLocked(inTransaction)) { 3483e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn changed = true; 34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3486105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 3487e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return changed; 34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(ident); 34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 349206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3493c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project int computeForcedAppOrientationLocked() { 3494c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project int req = getOrientationFromWindowsLocked(); 3495c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project if (req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) { 3496c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project req = getOrientationFromAppTokensLocked(); 3497c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 3498c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project return req; 3499c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 350006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3501e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn public void setNewConfiguration(Configuration config) { 3502e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 3503e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn "setNewConfiguration()")) { 3504e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 3505e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3506e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 3507e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn synchronized(mWindowMap) { 3508e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn mCurConfiguration = new Configuration(config); 3509e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn mWaitingForConfig = false; 3510e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn performLayoutAndPlaceSurfacesLocked(); 3511e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3512e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3513e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAppOrientation(IApplicationToken token, int requestedOrientation) { 35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppOrientation()")) { 3517cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 351906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token.asBinder()); 35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 35238a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set orientation of non-existing app token: " + token); 35249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 35259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 352606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.requestedOrientation = requestedOrientation; 35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 353006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getAppOrientation(IApplicationToken token) { 35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token.asBinder()); 35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 353706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return wtoken.requestedOrientation; 35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 354106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFocusedApp(IBinder token, boolean moveFocusNow) { 35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setFocusedApp()")) { 3545cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = false; 35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token == null) { 35518a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_FOCUS) Slog.v(TAG, "Clearing focused app, was " + mFocusedApp); 35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = mFocusedApp != null; 35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocusedApp = null; 355400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown if (changed) { 355500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.setFocusedAppLw(null); 3556349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } 35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken newFocus = findAppWindowToken(token); 35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newFocus == null) { 35608a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set focus to non-existing app token: " + token); 35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = mFocusedApp != newFocus; 35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocusedApp = newFocus; 35658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_FOCUS) Slog.v(TAG, "Set focused app to: " + mFocusedApp); 356600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown if (changed) { 356700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.setFocusedAppLw(newFocus); 3568349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } 35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (moveFocusNow && changed) { 35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 35733a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/); 35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35797da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn public void prepareAppTransition(int transit, boolean alwaysKeepCurrent) { 35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "prepareAppTransition()")) { 3582cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 358406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 35868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v( 35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Prepare app transition: transit=" + transit 35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mNextAppTransition=" + mNextAppTransition); 3589bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn if (!mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOnFully()) { 3590bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET 3591bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn || mNextAppTransition == WindowManagerPolicy.TRANSIT_NONE) { 35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextAppTransition = transit; 35937da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn } else if (!alwaysKeepCurrent) { 35947da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn if (transit == WindowManagerPolicy.TRANSIT_TASK_OPEN 35957da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn && mNextAppTransition == WindowManagerPolicy.TRANSIT_TASK_CLOSE) { 35967da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn // Opening a new task always supersedes a close for the anim. 35977da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mNextAppTransition = transit; 35987da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn } else if (transit == WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN 35997da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn && mNextAppTransition == WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE) { 36007da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn // Opening a new activity always supersedes a close for the anim. 36017da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mNextAppTransition = transit; 36027da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn } 36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionReady = false; 36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionTimeout = false; 36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartingIconInTransition = false; 36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSkipAppTransitionAnimation = false; 36089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.APP_TRANSITION_TIMEOUT); 36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageDelayed(mH.obtainMessage(H.APP_TRANSITION_TIMEOUT), 36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5000); 36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPendingAppTransition() { 36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNextAppTransition; 36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 361806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 36193b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn public void overridePendingAppTransition(String packageName, 36203b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int enterAnim, int exitAnim) { 36218b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 36223b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn mNextAppTransitionPackage = packageName; 36233b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn mNextAppTransitionEnter = enterAnim; 36243b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn mNextAppTransitionExit = exitAnim; 36253b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 36263b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 3627ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void executeAppTransition() { 36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "executeAppTransition()")) { 3631cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 363306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 36353b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (DEBUG_APP_TRANSITIONS) { 36363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn RuntimeException e = new RuntimeException("here"); 36373b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn e.fillInStackTrace(); 36388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Execute app transition: mNextAppTransition=" 36393b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + mNextAppTransition, e); 36403b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 3641bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionReady = true; 36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAppStartingWindow(IBinder token, String pkg, 36512f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn int theme, CompatibilityInfo compatInfo, 36522f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn CharSequence nonLocalizedLabel, int labelRes, int icon, 36537eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn int windowFlags, IBinder transferFrom, boolean createIfNeeded) { 36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppStartingIcon()")) { 3656cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 36608a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v( 36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "setAppStartingIcon: token=" + token + " pkg=" + pkg 36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " transferFrom=" + transferFrom); 366306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token); 36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 36668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set icon of non-existing app token: " + token); 36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the display is frozen, we won't do anything until the 36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // actual window is displayed so there is no reason to put in 36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the starting window. 3673bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn if (mDisplayFrozen || !mDisplayEnabled || !mPolicy.isScreenOnFully()) { 36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 367606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.startingData != null) { 36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 368006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (transferFrom != null) { 36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken ttoken = findAppWindowToken(transferFrom); 36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ttoken != null) { 36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState startingWindow = ttoken.startingWindow; 36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startingWindow != null) { 36869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mStartingIconInTransition) { 36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In this case, the starting icon has already 36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // been displayed, so start letting windows get 36899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // shown immediately without any more transitions. 36909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSkipAppTransitionAnimation = true; 36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, 36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Moving existing starting from " + ttoken 36949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " to " + wtoken); 36959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 369606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 36979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Transfer the starting window over to the new 36989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // token. 36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingData = ttoken.startingData; 37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingView = ttoken.startingView; 37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingWindow = startingWindow; 37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingData = null; 37039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingView = null; 37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingWindow = null; 37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingMoved = true; 37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startingWindow.mToken = wtoken; 3707ef49c57bdcdb6c808870570c205434b002431c37Dianne Hackborn startingWindow.mRootToken = wtoken; 37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startingWindow.mAppToken = wtoken; 3709f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, 37109bfb707597898f54722460b48588007b682f3e2aDianne Hackborn "Removing starting window: " + startingWindow); 37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(startingWindow); 3712dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 3713f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing starting " + startingWindow 3714f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + " from " + ttoken); 37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.windows.remove(startingWindow); 37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.allAppWindows.remove(startingWindow); 37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addWindowToListInOrderLocked(startingWindow, true); 371806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Propagate other interesting state between the 37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // tokens. If the old token is displayed, we should 37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // immediately force the new one to be displayed. If 37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it is animating, we need to move that animation to 37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the new one. 37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ttoken.allDrawn) { 37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.allDrawn = true; 37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ttoken.firstWindowDrawn) { 37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.firstWindowDrawn = true; 37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!ttoken.hidden) { 37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hidden = false; 37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hiddenRequested = false; 37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.willBeHidden = false; 37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.clientHidden != ttoken.clientHidden) { 37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.clientHidden = ttoken.clientHidden; 37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.sendAppVisibilityToClients(); 37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ttoken.animation != null) { 37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.animation = ttoken.animation; 37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.animating = ttoken.animating; 37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.animLayerAdjustment = ttoken.animLayerAdjustment; 37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.animation = null; 37449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.animLayerAdjustment = 0; 37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.updateLayers(); 37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.updateLayers(); 37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 374806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 37493a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 37503a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown true /*updateInputWindows*/); 37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (ttoken.startingData != null) { 37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The previous app was getting ready to show a 37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // starting window, but hasn't yet done so. Steal it! 37588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, 37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Moving pending starting from " + ttoken 37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " to " + wtoken); 37619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingData = ttoken.startingData; 37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingData = null; 37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingMoved = true; 37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = mH.obtainMessage(H.ADD_STARTING, wtoken); 37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note: we really want to do sendMessageAtFrontOfQueue() because we 37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // want to process the message ASAP, before any other queued 37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // messages. 37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageAtFrontOfQueue(m); 37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // There is no existing starting window, and the caller doesn't 37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // want us to create one, so that's it! 37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!createIfNeeded) { 37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 377906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 37806d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn // If this is a translucent window, then don't 3781284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn // show a starting window -- the current effect (a full-screen 3782284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn // opaque starting window that fades away to the real contents 3783284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn // when it is ready) does not work for this. 3784284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (theme != 0) { 3785284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn AttributeCache.Entry ent = AttributeCache.instance().get(pkg, theme, 3786284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn com.android.internal.R.styleable.Window); 3787284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (ent.array.getBoolean( 3788284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn com.android.internal.R.styleable.Window_windowIsTranslucent, false)) { 3789284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn return; 3790284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 3791284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (ent.array.getBoolean( 37926136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn com.android.internal.R.styleable.Window_windowIsFloating, false)) { 37936136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn return; 37946136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn } 37956136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn if (ent.array.getBoolean( 3796284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn com.android.internal.R.styleable.Window_windowShowWallpaper, false)) { 37976d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (mWallpaperTarget == null) { 37986d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn // If this theme is requesting a wallpaper, and the wallpaper 37996d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn // is not curently visible, then this effectively serves as 38006d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn // an opaque window and our starting window transition animation 38016d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn // can still work. We just need to make sure the starting window 38026d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn // is also showing the wallpaper. 38036d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn windowFlags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; 38046d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } else { 38056d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn return; 38066d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 3807284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 3808284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 3809ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 38109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartingIconInTransition = true; 38112f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn wtoken.startingData = new StartingData(pkg, theme, compatInfo, nonLocalizedLabel, 38127eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn labelRes, icon, windowFlags); 38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = mH.obtainMessage(H.ADD_STARTING, wtoken); 38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note: we really want to do sendMessageAtFrontOfQueue() because we 38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // want to process the message ASAP, before any other queued 38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // messages. 38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageAtFrontOfQueue(m); 38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAppWillBeHidden(IBinder token) { 38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppWillBeHidden()")) { 3824cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken; 38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken = findAppWindowToken(token); 38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 38328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set will be hidden of non-existing app token: " + token); 38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.willBeHidden = true; 38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 383806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean setTokenVisibilityLocked(AppWindowToken wtoken, WindowManager.LayoutParams lp, 3840ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn boolean visible, int transit, boolean performLayout) { 38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean delayed = false; 38429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.clientHidden == visible) { 38449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.clientHidden = !visible; 38459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.sendAppVisibilityToClients(); 38469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 384706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.willBeHidden = false; 38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.hidden == visible) { 38509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = wtoken.allAppWindows.size(); 38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = false; 38528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v( 38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Changing app " + wtoken + " hidden=" + wtoken.hidden 38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " performLayout=" + performLayout); 385506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 38569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean runningAppAnimation = false; 385706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3858bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (transit != WindowManagerPolicy.TRANSIT_UNSET) { 38599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.animation == sDummyAnimation) { 38609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.animation = null; 38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3862ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn applyAnimationLocked(wtoken, lp, transit, visible); 38639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = true; 38649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.animation != null) { 38659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = runningAppAnimation = true; 38669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 386806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 38699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 38709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = wtoken.allAppWindows.get(i); 38719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == wtoken.startingWindow) { 38729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 38739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.isAnimating()) { 38769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = true; 38779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 387806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 38798a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Window " + win + ": vis=" + win.isVisible()); 38809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //win.dump(" "); 38819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (visible) { 38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!win.isVisibleNow()) { 38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!runningAppAnimation) { 38849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applyAnimationLocked(win, 38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerPolicy.TRANSIT_ENTER, true); 38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = true; 38889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (win.isVisibleNow()) { 38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!runningAppAnimation) { 38919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applyAnimationLocked(win, 38929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerPolicy.TRANSIT_EXIT, false); 38939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = true; 38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hidden = wtoken.hiddenRequested = !visible; 38999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!visible) { 39009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsetAppFreezingScreenLocked(wtoken, true, true); 39019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 39029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are being set visible, and the starting window is 39039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // not yet displayed, then make sure it doesn't get displayed. 39049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState swin = wtoken.startingWindow; 39059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (swin != null && (swin.mDrawPending 39069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || swin.mCommitDrawPending)) { 39079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project swin.mPolicyVisibility = false; 39089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project swin.mPolicyVisibilityAfterAnim = false; 39099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 391106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 39128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "setTokenVisibilityLocked: " + wtoken 39139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": hidden=" + wtoken.hidden + " hiddenRequested=" 39149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.hiddenRequested); 391506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 39169b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn if (changed) { 39179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 39183a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 39199b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn if (performLayout) { 39203a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 39213a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 39229b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn performLayoutAndPlaceSurfacesLocked(); 39239b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn } 39242e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 39259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.animation != null) { 39299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = true; 39309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 393106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 39329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return delayed; 39339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAppVisibility(IBinder token, boolean visible) { 39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 39379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppVisibility()")) { 3938cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken; 39429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 39449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken = findAppWindowToken(token); 39459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 39468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set visibility of non-existing app token: " + token); 39479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 39489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_APP_TRANSITIONS || DEBUG_ORIENTATION) { 3951b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 3952b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 3953b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 3954b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 3955b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 39568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "setAppVisibility(" + token + ", " + visible 39579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "): mNextAppTransition=" + mNextAppTransition 39589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " hidden=" + wtoken.hidden 39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " hiddenRequested=" + wtoken.hiddenRequested, e); 39609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 396106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 39629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are preparing an app transition, then delay changing 39639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the visibility of this token until we execute that transition. 3964bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn if (!mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOnFully() 3965b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn && mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 39669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Already in requested state, don't do anything more. 39679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.hiddenRequested != visible) { 39689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 39699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hiddenRequested = !visible; 397106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 39728a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v( 39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Setting dummy animation on: " + wtoken); 39749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.setDummyAnimation(); 39759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpeningApps.remove(wtoken); 39769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClosingApps.remove(wtoken); 3977a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.waitingToShow = wtoken.waitingToHide = false; 39789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.inPendingTransaction = true; 39799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (visible) { 39809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpeningApps.add(wtoken); 39819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingDisplayed = false; 39829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingMoved = false; 3983ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 3984195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // If the token is currently hidden (should be the 3985195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // common case), then we need to set up to wait for 3986195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // its windows to be ready. 3987195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn if (wtoken.hidden) { 3988195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn wtoken.allDrawn = false; 3989195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn wtoken.waitingToShow = true; 3990ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 3991195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn if (wtoken.clientHidden) { 3992195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // In the case where we are making an app visible 3993195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // but holding off for a transition, we still need 3994195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // to tell the client to make its windows visible so 3995195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // they get drawn. Otherwise, we will wait on 3996195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // performing the transition until all windows have 3997195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // been drawn, they never will be, and we are sad. 3998195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn wtoken.clientHidden = false; 3999195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn wtoken.sendAppVisibilityToClients(); 4000195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn } 40019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 40039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClosingApps.add(wtoken); 4004ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 4005195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // If the token is currently visible (should be the 4006195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // common case), then set up to wait for it to be hidden. 4007195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn if (!wtoken.hidden) { 4008195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn wtoken.waitingToHide = true; 4009195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn } 40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 40129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 401306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 40149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 4015e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn setTokenVisibilityLocked(wtoken, null, visible, WindowManagerPolicy.TRANSIT_UNSET, 4016ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn true); 40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.updateReportedVisibilityLocked(); 40189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 40199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void unsetAppFreezingScreenLocked(AppWindowToken wtoken, 40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean unfreezeSurfaceNow, boolean force) { 40249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.freezingScreen) { 40258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + wtoken 40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " force=" + force); 40279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = wtoken.allAppWindows.size(); 40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean unfrozeWindows = false; 40299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 40309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState w = wtoken.allAppWindows.get(i); 40319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mAppFreezing) { 40329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAppFreezing = false; 40339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null && !w.mOrientationChanging) { 40343ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "set mOrientationChanging of " + w); 40359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = true; 40369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unfrozeWindows = true; 40389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (force || unfrozeWindows) { 40418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, "No longer freezing: " + wtoken); 40429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.freezingScreen = false; 40439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppsFreezingScreen--; 40449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (unfreezeSurfaceNow) { 40469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (unfrozeWindows) { 40479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 40489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 40499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4050e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn stopFreezingDisplayLocked(); 40519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 405406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 40559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startAppFreezingScreenLocked(AppWindowToken wtoken, 40569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int configChanges) { 40579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_ORIENTATION) { 4058b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 4059b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 4060b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 4061b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 4062b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 40638a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "Set freezing of " + wtoken.appToken 40649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": hidden=" + wtoken.hidden + " freezing=" 40659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.freezingScreen, e); 40669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!wtoken.hiddenRequested) { 40689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!wtoken.freezingScreen) { 40699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.freezingScreen = true; 40709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppsFreezingScreen++; 40719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAppsFreezingScreen == 1) { 407294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn startFreezingDisplayLocked(false); 40739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.APP_FREEZE_TIMEOUT); 40749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageDelayed(mH.obtainMessage(H.APP_FREEZE_TIMEOUT), 40759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5000); 40769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = wtoken.allAppWindows.size(); 40799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 40809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState w = wtoken.allAppWindows.get(i); 40819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAppFreezing = true; 40829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 408506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 40869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startAppFreezingScreen(IBinder token, int configChanges) { 40879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 40889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppFreezingScreen()")) { 4089cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 40909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 4093bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn if (configChanges == 0 && !mDisplayFrozen && mPolicy.isScreenOnFully()) { 40948a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping set freeze of " + token); 40959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 40969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 409706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 40989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token); 40999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null || wtoken.appToken == null) { 41008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to freeze screen with non-existing app token: " + wtoken); 41019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 41029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 41049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startAppFreezingScreenLocked(wtoken, configChanges); 41059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 41069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 410806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 41099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopAppFreezingScreen(IBinder token, boolean force) { 41109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 41119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppFreezingScreen()")) { 4112cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 41139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 41169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token); 41179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null || wtoken.appToken == null) { 41189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 41199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 41218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + token 41229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": hidden=" + wtoken.hidden + " freezing=" + wtoken.freezingScreen); 41239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsetAppFreezingScreenLocked(wtoken, true, force); 41249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 41259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 412706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 41289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeAppToken(IBinder token) { 41299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 41309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "removeAppToken()")) { 4131cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 41329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = null; 41359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken startingToken = null; 41369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean delayed = false; 41379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 41399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 41409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken basewtoken = mTokenMap.remove(token); 41419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (basewtoken != null && (wtoken=basewtoken.appWindowToken) != null) { 41428a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Removing app token: " + wtoken); 4143e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn delayed = setTokenVisibilityLocked(wtoken, null, false, 4144ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn WindowManagerPolicy.TRANSIT_UNSET, true); 41459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.inPendingTransaction = false; 41469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpeningApps.remove(wtoken); 4147a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.waitingToShow = false; 41489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mClosingApps.contains(wtoken)) { 41499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = true; 4150bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn } else if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 41519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClosingApps.add(wtoken); 4152a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.waitingToHide = true; 41539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = true; 41549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v( 41569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Removing app " + wtoken + " delayed=" + delayed 41579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " animation=" + wtoken.animation 41589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " animating=" + wtoken.animating); 41599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delayed) { 41609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // set the token aside because it has an active animation to be finished 4161f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, 4162f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "removeAppToken make exiting: " + wtoken); 41639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingAppTokens.add(wtoken); 41649bfb707597898f54722460b48588007b682f3e2aDianne Hackborn } else { 41659bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // Make sure there is no animation running on this token, 41669bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // so any windows associated with it will be removed as 41679bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // soon as their animations are complete 41689bfb707597898f54722460b48588007b682f3e2aDianne Hackborn wtoken.animation = null; 41699bfb707597898f54722460b48588007b682f3e2aDianne Hackborn wtoken.animating = false; 41709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4171f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, 4172f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "removeAppToken: " + wtoken); 41739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.remove(wtoken); 41749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.removed = true; 41759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.startingData != null) { 41769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startingToken = wtoken; 41779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsetAppFreezingScreenLocked(wtoken, true, true); 41799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFocusedApp == wtoken) { 41808a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_FOCUS) Slog.v(TAG, "Removing focused app token:" + wtoken); 41819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocusedApp = null; 41823a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/); 418300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.setFocusedAppLw(null); 41849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 41868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to remove non-existing app token: " + token); 41879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 418806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 41899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!delayed && wtoken != null) { 41909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.updateReportedVisibilityLocked(); 41919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 41949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startingToken != null) { 41968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Schedule remove starting " 41979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + startingToken + ": app token removed"); 41989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = mH.obtainMessage(H.REMOVE_STARTING, startingToken); 41999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessage(m); 42009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean tmpRemoveAppWindowsLocked(WindowToken token) { 42049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NW = token.windows.size(); 42059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<NW; i++) { 42069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = token.windows.get(i); 42078a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Tmp removing app window " + win); 42089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(win); 4209dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 42109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int j = win.mChildWindows.size(); 42119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (j > 0) { 42129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project j--; 4213e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cwin = win.mChildWindows.get(j); 42148a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, 4215bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn "Tmp removing child window " + cwin); 4216bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn mWindows.remove(cwin); 42179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NW > 0; 42209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dumpAppTokensLocked() { 42239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mAppTokens.size()-1; i>=0; i--) { 42248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, " #" + i + ": " + mAppTokens.get(i).token); 42259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 422706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 42289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dumpWindowsLocked() { 42299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mWindows.size()-1; i>=0; i--) { 42308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, " #" + i + ": " + mWindows.get(i)); 42319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 423306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 42349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int findWindowOffsetLocked(int tokenPos) { 42359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NW = mWindows.size(); 42369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tokenPos >= mAppTokens.size()) { 42389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = NW; 42399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i > 0) { 42409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 4241e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState win = mWindows.get(i); 42429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.getAppToken() != null) { 42439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i+1; 42449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (tokenPos > 0) { 42499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Find the first app token below the new position that has 42509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // a window displayed. 42519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = mAppTokens.get(tokenPos-1); 42528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Looking for lower windows @ " 42539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + tokenPos + " -- " + wtoken.token); 4254a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (wtoken.sendingToBottom) { 42558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, 4256a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn "Skipping token -- currently sending to bottom"); 4257a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn tokenPos--; 4258a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn continue; 4259a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 42609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = wtoken.windows.size(); 42619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i > 0) { 42629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 42639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = wtoken.windows.get(i); 42649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int j = win.mChildWindows.size(); 42659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (j > 0) { 42669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project j--; 4267e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cwin = win.mChildWindows.get(j); 4268a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (cwin.mSubLayer >= 0) { 42699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int pos=NW-1; pos>=0; pos--) { 42709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWindows.get(pos) == cwin) { 42718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, 42729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Found child win @" + (pos+1)); 42739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pos+1; 42749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int pos=NW-1; pos>=0; pos--) { 42799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWindows.get(pos) == win) { 42808a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Found win @" + (pos+1)); 42819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pos+1; 42829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokenPos--; 42869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 42899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final int reAddWindowLocked(int index, WindowState win) { 42929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NCW = win.mChildWindows.size(); 42939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean added = false; 42949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j=0; j<NCW; j++) { 4295e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cwin = win.mChildWindows.get(j); 42969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!added && cwin.mSubLayer >= 0) { 42978a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding child window at " 4298bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn + index + ": " + cwin); 4299f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn win.mRebuilding = false; 43009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(index, win); 43019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 43029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project added = true; 43039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at " 4305bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn + index + ": " + cwin); 4306f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn cwin.mRebuilding = false; 43079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(index, cwin); 43089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 43099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!added) { 43118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at " 4312bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn + index + ": " + win); 4313f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn win.mRebuilding = false; 43149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(index, win); 43159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 43169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4317dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 43189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return index; 43199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 432006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 43219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final int reAddAppWindowsLocked(int index, WindowToken token) { 43229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NW = token.windows.size(); 43239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<NW; i++) { 43249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = reAddWindowLocked(index, token.windows.get(i)); 43259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return index; 43279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void moveAppToken(int index, IBinder token) { 43309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 43319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "moveAppToken()")) { 4332cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 43339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 43368a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Initial app tokens:"); 43379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_REORDER) dumpAppTokensLocked(); 43389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = findAppWindowToken(token); 4339f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_TOKEN_MOVEMENT || DEBUG_REORDER) Slog.v(TAG, 4340f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "Start moving token " + wtoken + " initially at " 4341f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + mAppTokens.indexOf(wtoken)); 43429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null || !mAppTokens.remove(wtoken)) { 43438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempting to reorder token that doesn't exist: " 43449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + token + " (" + wtoken + ")"); 43459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 43469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.add(index, wtoken); 43488a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Moved " + token + " to " + index + ":"); 4349f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn else if (DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, "Moved " + token + " to " + index); 43509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_REORDER) dumpAppTokensLocked(); 435106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 43529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 43538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Removing windows in " + token + ":"); 43549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_REORDER) dumpWindowsLocked(); 43559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tmpRemoveAppWindowsLocked(wtoken)) { 43568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Adding windows back in:"); 43579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_REORDER) dumpWindowsLocked(); 43589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reAddAppWindowsLocked(findWindowOffsetLocked(index), wtoken); 43598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Final window list:"); 43609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_REORDER) dumpWindowsLocked(); 43613a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 43623a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 43639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 43642e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 43659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 43662e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 43679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 43699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void removeAppTokensLocked(List<IBinder> tokens) { 43739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXX This should be done more efficiently! 43749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (take advantage of the fact that both lists should be 43759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ordered in the same way.) 43769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = tokens.size(); 43779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 43789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder token = tokens.get(i); 43799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = findAppWindowToken(token); 4380f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_REORDER || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, 4381f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "Temporarily removing " + wtoken + " from " + mAppTokens.indexOf(wtoken)); 43829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mAppTokens.remove(wtoken)) { 43838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempting to reorder token that doesn't exist: " 43849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + token + " (" + wtoken + ")"); 43859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 43869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 43879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4391a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn private void moveAppWindowsLocked(AppWindowToken wtoken, int tokenPos, 4392a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn boolean updateFocusAndLayout) { 4393a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // First remove all of the windows from the list. 4394a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn tmpRemoveAppWindowsLocked(wtoken); 4395a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn 4396a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // Where to start adding? 4397a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn int pos = findWindowOffsetLocked(tokenPos); 4398a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn 4399a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // And now add them back at the correct place. 4400a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn pos = reAddAppWindowsLocked(pos, wtoken); 4401a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn 4402a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (updateFocusAndLayout) { 44032e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 44043a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 44053a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/)) { 4406a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn assignLayersLocked(); 4407a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 4408a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mLayoutNeeded = true; 4409a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn performLayoutAndPlaceSurfacesLocked(); 44102e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 4411a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 4412a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 4413a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn 44149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void moveAppWindowsLocked(List<IBinder> tokens, int tokenPos) { 44159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First remove all of the windows from the list. 44169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = tokens.size(); 44179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 44189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 44199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mTokenMap.get(tokens.get(i)); 44209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token != null) { 44219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpRemoveAppWindowsLocked(token); 44229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Where to start adding? 44269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = findWindowOffsetLocked(tokenPos); 44279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // And now add them back at the correct place. 44299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 44309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mTokenMap.get(tokens.get(i)); 44319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token != null) { 44329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = reAddAppWindowsLocked(pos, token); 44339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44362e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 44373a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 44383a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/)) { 4439a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn assignLayersLocked(); 4440a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 44419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 44429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 44432e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 44449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //dump(); 44469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void moveAppTokensToTop(List<IBinder> tokens) { 44499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 44509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "moveAppTokensToTop()")) { 4451cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 44529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 44559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 44569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeAppTokensLocked(tokens); 44579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = tokens.size(); 44589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 44599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wt = findAppWindowToken(tokens.get(i)); 44609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wt != null) { 4461f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_TOKEN_MOVEMENT || DEBUG_REORDER) Slog.v(TAG, 4462f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "Adding next to top: " + wt); 44639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.add(wt); 4464bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 4465a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToTopApps.remove(wt); 4466a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToBottomApps.remove(wt); 4467a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToTopApps.add(wt); 4468a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wt.sendingToBottom = false; 4469a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wt.sendingToTop = true; 4470a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 44719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4473ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 4474bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) { 4475a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn moveAppWindowsLocked(tokens, mAppTokens.size()); 4476a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 44779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 44799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void moveAppTokensToBottom(List<IBinder> tokens) { 44829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 44839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "moveAppTokensToBottom()")) { 4484cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 44859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 44889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 44899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeAppTokensLocked(tokens); 44909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = tokens.size(); 44919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = 0; 44929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 44939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wt = findAppWindowToken(tokens.get(i)); 44949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wt != null) { 4495f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, 4496f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "Adding next to bottom: " + wt + " at " + pos); 44979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.add(pos, wt); 4498bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 4499a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToTopApps.remove(wt); 4500a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToBottomApps.remove(wt); 4501a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToBottomApps.add(i, wt); 4502a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wt.sendingToTop = false; 4503a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wt.sendingToBottom = true; 4504a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 45059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 45069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4508ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 4509bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) { 4510a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn moveAppWindowsLocked(tokens, 0); 4511a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 45129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 45149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 45179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Misc IWindowSession methods 45189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 451906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4520284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller private boolean shouldAllowDisableKeyguard() 4521d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller { 4522284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // We fail safe and prevent disabling keyguard in the unlikely event this gets 4523284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // called before DevicePolicyManagerService has started. 4524284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller if (mAllowDisableKeyguard == ALLOW_DISABLE_UNKNOWN) { 4525284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService( 4526284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller Context.DEVICE_POLICY_SERVICE); 4527284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller if (dpm != null) { 4528284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mAllowDisableKeyguard = dpm.getPasswordQuality(null) 4529284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED ? 4530284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller ALLOW_DISABLE_YES : ALLOW_DISABLE_NO; 4531284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } 4532284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } 4533284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller return mAllowDisableKeyguard == ALLOW_DISABLE_YES; 4534d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller } 4535d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller 45369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void disableKeyguard(IBinder token, String tag) { 4537733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD) 45389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 45399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException("Requires DISABLE_KEYGUARD permission"); 45409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4541d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller 4542284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller synchronized (mKeyguardTokenWatcher) { 4543284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mKeyguardTokenWatcher.acquire(token, tag); 4544dd8846886aa21980ecdca7ba42deac4f7ecd8ff0Mike Lockwood } 45459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void reenableKeyguard(IBinder token) { 4548733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD) 45499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 45509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException("Requires DISABLE_KEYGUARD permission"); 45519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4552d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller 4553284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller synchronized (mKeyguardTokenWatcher) { 4554284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mKeyguardTokenWatcher.release(token); 4555284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller 4556284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller if (!mKeyguardTokenWatcher.isAcquired()) { 4557284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // If we are the last one to reenable the keyguard wait until 4558284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // we have actually finished reenabling until returning. 4559284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // It is possible that reenableKeyguard() can be called before 4560284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // the previous disableKeyguard() is handled, in which case 4561284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // neither mKeyguardTokenWatcher.acquired() or released() would 4562284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // be called. In that case mKeyguardDisabled will be false here 4563284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // and we have nothing to wait for. 4564284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller while (mKeyguardDisabled) { 4565284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller try { 4566284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mKeyguardTokenWatcher.wait(); 4567284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } catch (InterruptedException e) { 4568284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller Thread.currentThread().interrupt(); 45699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 45769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.app.KeyguardManager#exitKeyguardSecurely 45779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 45789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void exitKeyguardSecurely(final IOnKeyguardExitResult callback) { 4579733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD) 45809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 45819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException("Requires DISABLE_KEYGUARD permission"); 45829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.exitKeyguardSecurely(new WindowManagerPolicy.OnKeyguardExitResult() { 45849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onKeyguardExitResult(boolean success) { 45859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 45869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback.onKeyguardExitResult(success); 45879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 45889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Client has died, we don't care. 45899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 45929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean inKeyguardRestrictedInputMode() { 45959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPolicy.inKeyguardRestrictedKeyInputMode(); 45969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 459706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4598520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood public boolean isKeyguardLocked() { 4599520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood return mPolicy.isKeyguardLocked(); 4600520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood } 4601520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood 4602520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood public boolean isKeyguardSecure() { 4603520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood return mPolicy.isKeyguardSecure(); 4604520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood } 4605520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood 460690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn public void dismissKeyguard() { 460790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD) 460890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn != PackageManager.PERMISSION_GRANTED) { 460990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn throw new SecurityException("Requires DISABLE_KEYGUARD permission"); 461090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn } 461190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn synchronized(mWindowMap) { 461290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mPolicy.dismissKeyguardLw(); 461390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn } 461490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn } 461590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn 4616ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn public void closeSystemDialogs(String reason) { 4617ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn synchronized(mWindowMap) { 4618ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn for (int i=mWindows.size()-1; i>=0; i--) { 4619e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 4620ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn if (w.mSurface != null) { 4621ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn try { 4622ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn w.mClient.closeSystemDialogs(reason); 4623ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } catch (RemoteException e) { 4624ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 4625ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 4626ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 4627ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 4628ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 4629ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 46309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static float fixScale(float scale) { 46319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scale < 0) scale = 0; 46329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (scale > 20) scale = 20; 46339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Math.abs(scale); 46349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 463506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAnimationScale(int which, float scale) { 46379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE, 46389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAnimationScale()")) { 4639cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires SET_ANIMATION_SCALE permission"); 46409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scale < 0) scale = 0; 46439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (scale > 20) scale = 20; 46449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scale = Math.abs(scale); 46459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 46469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0: mWindowAnimationScale = fixScale(scale); break; 46479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 1: mTransitionAnimationScale = fixScale(scale); break; 46489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 464906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Persist setting 46519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.obtainMessage(H.PERSIST_ANIMATION_SCALE).sendToTarget(); 46529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 465306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAnimationScales(float[] scales) { 46559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE, 46569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAnimationScale()")) { 4657cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires SET_ANIMATION_SCALE permission"); 46589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scales != null) { 46619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scales.length >= 1) { 46629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowAnimationScale = fixScale(scales[0]); 46639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scales.length >= 2) { 46659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransitionAnimationScale = fixScale(scales[1]); 46669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 466806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Persist setting 46709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.obtainMessage(H.PERSIST_ANIMATION_SCALE).sendToTarget(); 46719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 467206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getAnimationScale(int which) { 46749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 46759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0: return mWindowAnimationScale; 46769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 1: return mTransitionAnimationScale; 46779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 46799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 468006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float[] getAnimationScales() { 46829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new float[] { mWindowAnimationScale, mTransitionAnimationScale }; 46839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 468406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSwitchState(int sw) { 46869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 46879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getSwitchState()")) { 4688cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 46899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46906d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getSwitchState(-1, InputDevice.SOURCE_ANY, sw); 46919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 469206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSwitchStateForDevice(int devid, int sw) { 46949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 46959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getSwitchStateForDevice()")) { 4696cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 46979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46986d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getSwitchState(devid, InputDevice.SOURCE_ANY, sw); 46999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 470006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 47019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getScancodeState(int sw) { 47029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 47039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getScancodeState()")) { 4704cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 47059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47066d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_ANY, sw); 47079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 470806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 47099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getScancodeStateForDevice(int devid, int sw) { 47109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 47119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getScancodeStateForDevice()")) { 4712cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 47139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47146d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getScanCodeState(devid, InputDevice.SOURCE_ANY, sw); 47159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 471606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 47171d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn public int getTrackballScancodeState(int sw) { 47181d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 47191d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn "getTrackballScancodeState()")) { 47201d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 47211d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 47226d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_TRACKBALL, sw); 47231d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 47241d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn 47251d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn public int getDPadScancodeState(int sw) { 47261d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 47271d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn "getDPadScancodeState()")) { 47281d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 47291d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 47306d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_DPAD, sw); 47311d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 47321d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn 47339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getKeycodeState(int sw) { 47349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 47359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getKeycodeState()")) { 4736cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 47379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47386d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_ANY, sw); 47399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 474006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 47419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getKeycodeStateForDevice(int devid, int sw) { 47429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 47439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getKeycodeStateForDevice()")) { 4744cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 47459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47466d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getKeyCodeState(devid, InputDevice.SOURCE_ANY, sw); 47479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 474806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 47491d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn public int getTrackballKeycodeState(int sw) { 47501d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 47511d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn "getTrackballKeycodeState()")) { 47521d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 47531d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 47546d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_TRACKBALL, sw); 47551d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 47561d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn 47571d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn public int getDPadKeycodeState(int sw) { 47581d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 47591d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn "getDPadKeycodeState()")) { 47601d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 47611d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 47626d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_DPAD, sw); 47631d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 4764a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown 47659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasKeys(int[] keycodes, boolean[] keyExists) { 47666d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.hasKeys(-1, InputDevice.SOURCE_ANY, keycodes, keyExists); 47679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 476806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4769a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown public InputChannel monitorInput(String inputChannelName) { 4770a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 4771a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown "monitorInput()")) { 4772a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown throw new SecurityException("Requires READ_INPUT_STATE permission"); 4773a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown } 4774a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown return mInputManager.monitorInput(inputChannelName); 4775a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown } 4776a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown 47770029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown public void setInputFilter(InputFilter filter) { 47780029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown mInputManager.setInputFilter(filter); 47790029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown } 47800029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 47818d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown public InputDevice getInputDevice(int deviceId) { 47828d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return mInputManager.getInputDevice(deviceId); 47838d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 47848d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 47858d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown public int[] getInputDeviceIds() { 47868d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return mInputManager.getInputDeviceIds(); 47878d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 47888d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 47899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enableScreenAfterBoot() { 47909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 479138cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn if (DEBUG_BOOT) { 479238cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn RuntimeException here = new RuntimeException("here"); 479338cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn here.fillInStackTrace(); 479438cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn Slog.i(TAG, "enableScreenAfterBoot: mDisplayEnabled=" + mDisplayEnabled 479538cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn + " mForceDisplayEnabled=" + mForceDisplayEnabled 479638cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn + " mShowingBootMessages=" + mShowingBootMessages 479738cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn + " mSystemBooted=" + mSystemBooted, here); 479838cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn } 47999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSystemBooted) { 48009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 48019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystemBooted = true; 4803661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn hideBootMessagesLocked(); 480429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // If the screen still doesn't come up after 30 seconds, give 480529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // up and turn it on. 480629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn Message msg = mH.obtainMessage(H.BOOT_TIMEOUT); 480729aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn mH.sendMessageDelayed(msg, 30*1000); 48089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 480906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4810ba24e4d8bbeb60e96d74f05e21691dad61ce497eDianne Hackborn mPolicy.systemBooted(); 4811ba24e4d8bbeb60e96d74f05e21691dad61ce497eDianne Hackborn 48129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performEnableScreen(); 48139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 481406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4815661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn void enableScreenIfNeededLocked() { 481638cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn if (DEBUG_BOOT) { 481738cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn RuntimeException here = new RuntimeException("here"); 481838cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn here.fillInStackTrace(); 481938cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn Slog.i(TAG, "enableScreenIfNeededLocked: mDisplayEnabled=" + mDisplayEnabled 482038cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn + " mForceDisplayEnabled=" + mForceDisplayEnabled 482138cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn + " mShowingBootMessages=" + mShowingBootMessages 482238cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn + " mSystemBooted=" + mSystemBooted, here); 482338cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn } 48249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplayEnabled) { 48259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 48269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4827661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn if (!mSystemBooted && !mShowingBootMessages) { 48289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 48299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessage(mH.obtainMessage(H.ENABLE_SCREEN)); 48319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 483206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 483329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn public void performBootTimeout() { 483429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn synchronized(mWindowMap) { 483529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (mDisplayEnabled) { 483629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn return; 483729aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 483829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn Slog.w(TAG, "***** BOOT TIMEOUT: forcing display enabled"); 483929aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn mForceDisplayEnabled = true; 484029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 484129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn performEnableScreen(); 484229aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 484329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn 48449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void performEnableScreen() { 48459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 484638cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn if (DEBUG_BOOT) { 484738cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn RuntimeException here = new RuntimeException("here"); 484838cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn here.fillInStackTrace(); 484938cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn Slog.i(TAG, "performEnableScreen: mDisplayEnabled=" + mDisplayEnabled 485038cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn + " mForceDisplayEnabled=" + mForceDisplayEnabled 485138cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn + " mShowingBootMessages=" + mShowingBootMessages 485238cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn + " mSystemBooted=" + mSystemBooted, here); 485338cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn } 48549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplayEnabled) { 48559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 48569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4857661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn if (!mSystemBooted && !mShowingBootMessages) { 48589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 48599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 486006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 486129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (!mForceDisplayEnabled) { 486229aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // Don't enable the screen until all existing windows 486329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // have been drawn. 486429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn boolean haveBootMsg = false; 486529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn boolean haveApp = false; 486629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn boolean haveWallpaper = false; 486738cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn boolean haveKeyguard = true; 486829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn final int N = mWindows.size(); 486929aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn for (int i=0; i<N; i++) { 487029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn WindowState w = mWindows.get(i); 487138cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_KEYGUARD) { 487238cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn // Only if there is a keyguard attached to the window manager 487338cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn // will we consider ourselves as having a keyguard. If it 487438cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn // isn't attached, we don't know if it wants to be shown or 487538cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn // hidden. If it is attached, we will say we have a keyguard 487638cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn // if the window doesn't want to be visible, because in that 487738cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn // case it explicitly doesn't want to be shown so we should 487838cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn // not delay turning the screen on for it. 487938cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn boolean vis = w.mViewVisibility == View.VISIBLE 488038cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn && w.mPolicyVisibility; 488138cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn haveKeyguard = !vis; 488238cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn } 488329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (w.isVisibleLw() && !w.mObscured && !w.isDrawnLw()) { 488429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn return; 488529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 488629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (w.isDrawnLw()) { 488729aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_BOOT_PROGRESS) { 488829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn haveBootMsg = true; 488929aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION) { 489029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn haveApp = true; 489129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER) { 489229aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn haveWallpaper = true; 489329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_KEYGUARD) { 489429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn haveKeyguard = true; 489529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 489629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 489729aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 489829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn 489938cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn if (DEBUG_SCREEN_ON || DEBUG_BOOT) { 490029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn Slog.i(TAG, "******** booted=" + mSystemBooted + " msg=" + mShowingBootMessages 490129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn + " haveBoot=" + haveBootMsg + " haveApp=" + haveApp 490229aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn + " haveWall=" + haveWallpaper + " haveKeyguard=" + haveKeyguard); 490329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 490429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn 490529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // If we are turning on the screen to show the boot message, 490629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // don't do it until the boot message is actually displayed. 490729aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (!mSystemBooted && !haveBootMsg) { 490829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn return; 490929aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 491029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn 491129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // If we are turning on the screen after the boot is completed 491229aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // normally, don't do so until we have the application and 491329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // wallpaper. 491429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (mSystemBooted && ((!haveApp && !haveKeyguard) || !haveWallpaper)) { 49159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 49169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 491806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 49199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisplayEnabled = true; 492038cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn if (DEBUG_SCREEN_ON || DEBUG_BOOT) Slog.i(TAG, "******************** ENABLING SCREEN!"); 49219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 49229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringWriter sw = new StringWriter(); 49239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PrintWriter pw = new PrintWriter(sw); 49249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.dump(null, pw, null); 49258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, sw.toString()); 49269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 49289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder surfaceFlinger = ServiceManager.getService("SurfaceFlinger"); 49299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (surfaceFlinger != null) { 49308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "******* TELLING SURFACE FLINGER WE ARE BOOTED!"); 49319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = Parcel.obtain(); 49329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken("android.ui.ISurfaceComposer"); 49339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION, 49349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data, null, 0); 49359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.recycle(); 49369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 49388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.e(TAG, "Boot completed: SurfaceFlinger is dead!"); 49399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 494106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 49429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.enableScreenAfterBoot(); 494306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 49449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make sure the last requested orientation has been applied. 494501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown updateRotationUnchecked(false); 49469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 494706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4948661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn public void showBootMessage(final CharSequence msg, final boolean always) { 4949661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn boolean first = false; 4950661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn synchronized(mWindowMap) { 495138cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn if (DEBUG_BOOT) { 495238cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn RuntimeException here = new RuntimeException("here"); 495338cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn here.fillInStackTrace(); 495438cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn Slog.i(TAG, "showBootMessage: msg=" + msg + " always=" + always 495538cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn + " mAllowBootMessages=" + mAllowBootMessages 495638cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn + " mShowingBootMessages=" + mShowingBootMessages 495738cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn + " mSystemBooted=" + mSystemBooted, here); 495838cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn } 495958f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn if (!mAllowBootMessages) { 496058f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn return; 496158f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn } 4962661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn if (!mShowingBootMessages) { 4963661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn if (!always) { 4964661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn return; 4965661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn } 4966661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn first = true; 4967661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn } 4968661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn if (mSystemBooted) { 4969661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn return; 4970661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn } 4971661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn mShowingBootMessages = true; 4972661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn mPolicy.showBootMessage(msg, always); 4973661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn } 4974661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn if (first) { 4975661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn performEnableScreen(); 4976661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn } 4977661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn } 4978661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn 4979661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn public void hideBootMessagesLocked() { 498038cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn if (DEBUG_BOOT) { 498138cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn RuntimeException here = new RuntimeException("here"); 498238cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn here.fillInStackTrace(); 498338cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn Slog.i(TAG, "hideBootMessagesLocked: mDisplayEnabled=" + mDisplayEnabled 498438cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn + " mForceDisplayEnabled=" + mForceDisplayEnabled 498538cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn + " mShowingBootMessages=" + mShowingBootMessages 498638cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn + " mSystemBooted=" + mSystemBooted, here); 498738cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn } 4988661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn if (mShowingBootMessages) { 4989661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn mShowingBootMessages = false; 4990661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn mPolicy.hideBootMessages(); 4991661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn } 4992661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn } 4993661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn 49949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInTouchMode(boolean mode) { 49959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 49969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInTouchMode = mode; 49979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50006804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // TODO: more accounting of which pid(s) turned it on, keep count, 50016804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // only allow disables from pids which have count on, etc. 50026804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick public void showStrictModeViolation(boolean on) { 50036804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick int pid = Binder.getCallingPid(); 50046804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick synchronized(mWindowMap) { 50056804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // Ignoring requests to enable the red border from clients 50066804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // which aren't on screen. (e.g. Broadcast Receivers in 50076804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // the background..) 50086804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick if (on) { 50096804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick boolean isVisible = false; 50106804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick for (WindowState ws : mWindows) { 50116804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick if (ws.mSession.mPid == pid && ws.isVisibleLw()) { 50126804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick isVisible = true; 50136804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick break; 50146804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 50156804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 50166804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick if (!isVisible) { 50176804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick return; 50186804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 50196804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 50206804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick 502136991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 502236991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn ">>> OPEN TRANSACTION showStrictModeViolation"); 50236804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick Surface.openTransaction(); 502494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn try { 502594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (mStrictModeFlash == null) { 502694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn mStrictModeFlash = new StrictModeFlash(mDisplay, mFxSession); 502794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } 502894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn mStrictModeFlash.setVisibility(on); 502994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } finally { 503094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn Surface.closeTransaction(); 503136991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 503236991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn "<<< CLOSE TRANSACTION showStrictModeViolation"); 50336804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 50346804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 50356804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 50366804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick 5037c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick public void setStrictModeVisualIndicatorPreference(String value) { 5038c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick SystemProperties.set(StrictMode.VISUAL_PROPERTY, value); 5039c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick } 5040c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick 5041e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller /** 5042e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * Takes a snapshot of the screen. In landscape mode this grabs the whole screen. 5043e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * In portrait mode, it grabs the upper region of the screen based on the vertical dimension 5044e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * of the target image. 5045e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * 5046e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * @param width the width of the target bitmap 5047e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * @param height the height of the target bitmap 5048e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller */ 5049e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller public Bitmap screenshotApplications(IBinder appToken, int width, int height) { 50500aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (!checkCallingPermission(android.Manifest.permission.READ_FRAME_BUFFER, 50510aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn "screenshotApplications()")) { 50520aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn throw new SecurityException("Requires READ_FRAME_BUFFER permission"); 50530aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 50540aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 50550aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn Bitmap rawss; 50560aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 5057d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn int maxLayer = 0; 50580aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn final Rect frame = new Rect(); 50590aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 50600aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn float scale; 5061e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller int dw, dh; 50620aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int rot; 50630aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 50640aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn synchronized(mWindowMap) { 50650aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn long ident = Binder.clearCallingIdentity(); 50660aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 506781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn dw = mAppDisplayWidth; 506881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn dh = mAppDisplayHeight; 5069428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn 50700aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int aboveAppLayer = mPolicy.windowTypeToLayerLw( 50710aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn WindowManager.LayoutParams.TYPE_APPLICATION) * TYPE_LAYER_MULTIPLIER 50720aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn + TYPE_LAYER_OFFSET; 50730aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn aboveAppLayer += TYPE_LAYER_MULTIPLIER; 50740aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 5075428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn boolean isImeTarget = mInputMethodTarget != null 5076428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn && mInputMethodTarget.mAppToken != null 5077428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn && mInputMethodTarget.mAppToken.appToken != null 5078428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn && mInputMethodTarget.mAppToken.appToken.asBinder() == appToken; 5079428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn 50800aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn // Figure out the part of the screen that is actually the app. 5081428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn boolean including = false; 5082428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn for (int i=mWindows.size()-1; i>=0; i--) { 50830aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn WindowState ws = mWindows.get(i); 50840aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (ws.mSurface == null) { 50850aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn continue; 50860aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 50870aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (ws.mLayer >= aboveAppLayer) { 5088d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn continue; 5089d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn } 5090428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // When we will skip windows: when we are not including 5091428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // ones behind a window we didn't skip, and we are actually 5092428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // taking a screenshot of a specific app. 5093428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (!including && appToken != null) { 5094428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // Also, we can possibly skip this window if it is not 5095428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // an IME target or the application for the screenshot 5096428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // is not the current IME target. 5097428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (!ws.mIsImWindow || !isImeTarget) { 5098428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // And finally, this window is of no interest if it 5099428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // is not associated with the screenshot app. 5100428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (ws.mAppToken == null || ws.mAppToken.token != appToken) { 5101428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn continue; 5102428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } 5103428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } 5104428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } 5105428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn 5106428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // We keep on including windows until we go past a full-screen 5107428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // window. 5108428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn including = !ws.mIsImWindow && !ws.isFullscreen(dw, dh); 5109428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn 5110d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn if (maxLayer < ws.mAnimLayer) { 5111d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn maxLayer = ws.mAnimLayer; 5112d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn } 51132aded18b0ef9f189771f70f05091493a44ec46aeJim Miller 51142aded18b0ef9f189771f70f05091493a44ec46aeJim Miller // Don't include wallpaper in bounds calculation 51152aded18b0ef9f189771f70f05091493a44ec46aeJim Miller if (!ws.mIsWallpaper) { 5116ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn final Rect wf = ws.mFrame; 51172aded18b0ef9f189771f70f05091493a44ec46aeJim Miller final Rect cr = ws.mContentInsets; 51182aded18b0ef9f189771f70f05091493a44ec46aeJim Miller int left = wf.left + cr.left; 51192aded18b0ef9f189771f70f05091493a44ec46aeJim Miller int top = wf.top + cr.top; 51202aded18b0ef9f189771f70f05091493a44ec46aeJim Miller int right = wf.right - cr.right; 51212aded18b0ef9f189771f70f05091493a44ec46aeJim Miller int bottom = wf.bottom - cr.bottom; 51222aded18b0ef9f189771f70f05091493a44ec46aeJim Miller frame.union(left, top, right, bottom); 51232aded18b0ef9f189771f70f05091493a44ec46aeJim Miller } 51240aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 51250aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn Binder.restoreCallingIdentity(ident); 51260aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 5127dd962ee1633b1e479bca5eae83744262fb69867fDianne Hackborn // Constrain frame to the screen size. 5128dd962ee1633b1e479bca5eae83744262fb69867fDianne Hackborn frame.intersect(0, 0, dw, dh); 5129e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller 5130cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn if (frame.isEmpty() || maxLayer == 0) { 51310aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn return null; 51320aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 51330aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 51340aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn // The screenshot API does not apply the current screen rotation. 51350aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn rot = mDisplay.getRotation(); 51360aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int fw = frame.width(); 51370aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int fh = frame.height(); 51380aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 513928637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller // Constrain thumbnail to smaller of screen width or height. Assumes aspect 514028637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller // of thumbnail is the same as the screen (in landscape) or square. 5141bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka float targetWidthScale = width / (float) fw; 5142bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka float targetHeightScale = height / (float) fh; 514328637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller if (dw <= dh) { 5144bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka scale = targetWidthScale; 5145bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka // If aspect of thumbnail is the same as the screen (in landscape), 5146bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka // select the slightly larger value so we fill the entire bitmap 5147bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka if (targetHeightScale > scale && (int) (targetHeightScale * fw) == width) { 5148bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka scale = targetHeightScale; 5149bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka } 515028637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller } else { 5151bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka scale = targetHeightScale; 5152bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka // If aspect of thumbnail is the same as the screen (in landscape), 5153bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka // select the slightly larger value so we fill the entire bitmap 5154bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka if (targetWidthScale > scale && (int) (targetWidthScale * fh) == height) { 5155bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka scale = targetWidthScale; 5156bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka } 515728637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller } 51580aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 51590aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn // The screen shot will contain the entire screen. 5160428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn dw = (int)(dw*scale); 5161428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn dh = (int)(dh*scale); 51620aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270) { 51630aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int tmp = dw; 51640aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn dw = dh; 51650aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn dh = tmp; 51660aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn rot = (rot == Surface.ROTATION_90) ? Surface.ROTATION_270 : Surface.ROTATION_90; 51670aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 5168cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn if (DEBUG_SCREENSHOT) { 5169cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn Slog.i(TAG, "Screenshot: " + dw + "x" + dh + " from 0 to " + maxLayer); 5170cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn for (int i=0; i<mWindows.size(); i++) { 5171cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn Slog.i(TAG, mWindows.get(i) + ": " + mWindows.get(i).mLayer 5172cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn + " animLayer=" + mWindows.get(i).mAnimLayer 5173cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn + " surfaceLayer=" + mWindows.get(i).mSurfaceLayer); 5174cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn } 5175cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn } 5176d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn rawss = Surface.screenshot(dw, dh, 0, maxLayer); 51770aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 51780aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 5179cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn if (rawss == null) { 51803ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn Slog.w(TAG, "Failure taking screenshot for (" + dw + "x" + dh 518188b03bd2e12c10c73e455a7eccf7d1aa324049d7Dianne Hackborn + ") to layer " + maxLayer); 5182cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn return null; 5183cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn } 5184e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller 5185e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller Bitmap bm = Bitmap.createBitmap(width, height, rawss.getConfig()); 51860aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn Matrix matrix = new Matrix(); 51870aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn ScreenRotationAnimation.createRotationMatrix(rot, dw, dh, matrix); 51880aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn matrix.postTranslate(-(int)(frame.left*scale), -(int)(frame.top*scale)); 51890aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn Canvas canvas = new Canvas(bm); 51900aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn canvas.drawBitmap(rawss, matrix, null); 51916311d0a079702b29984c0d31937345be105e1a5eDianne Hackborn canvas.setBitmap(null); 51920aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 51930aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn rawss.recycle(); 51940aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn return bm; 51950aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 51960aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 519701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown /** 519801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * Freeze rotation changes. (Enable "rotation lock".) 519901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * Persists across reboots. 52004dfce20cac7492882d366d053006795aefad59daJeff Brown * @param rotation The desired rotation to freeze to, or -1 to use the 52014dfce20cac7492882d366d053006795aefad59daJeff Brown * current rotation. 520201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown */ 52034dfce20cac7492882d366d053006795aefad59daJeff Brown public void freezeRotation(int rotation) { 5204b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION, 52052ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler "freezeRotation()")) { 5206b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler throw new SecurityException("Requires SET_ORIENTATION permission"); 5207b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler } 52084dfce20cac7492882d366d053006795aefad59daJeff Brown if (rotation < -1 || rotation > Surface.ROTATION_270) { 52094dfce20cac7492882d366d053006795aefad59daJeff Brown throw new IllegalArgumentException("Rotation argument must be -1 or a valid " 52104dfce20cac7492882d366d053006795aefad59daJeff Brown + "rotation constant."); 52114dfce20cac7492882d366d053006795aefad59daJeff Brown } 5212b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler 52132ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler if (DEBUG_ORIENTATION) Slog.v(TAG, "freezeRotation: mRotation=" + mRotation); 52142ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler 52154dfce20cac7492882d366d053006795aefad59daJeff Brown mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_LOCKED, 52164dfce20cac7492882d366d053006795aefad59daJeff Brown rotation == -1 ? mRotation : rotation); 521701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown updateRotationUnchecked(false); 5218b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler } 5219b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler 522001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown /** 522101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * Thaw rotation changes. (Disable "rotation lock".) 522201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * Persists across reboots. 522301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown */ 5224b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler public void thawRotation() { 5225b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION, 52262ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler "thawRotation()")) { 5227b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler throw new SecurityException("Requires SET_ORIENTATION permission"); 5228b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler } 5229b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler 52302ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler if (DEBUG_ORIENTATION) Slog.v(TAG, "thawRotation: mRotation=" + mRotation); 52312ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler 52322ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_FREE, 777); // rot not used 523301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown updateRotationUnchecked(false); 5234b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler } 5235b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler 523601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown /** 523701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * Recalculate the current rotation. 523801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * 523901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * Called by the window manager policy whenever the state of the system changes 524001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * such that the current rotation might need to be updated, such as when the 524101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * device is docked or rotated into a new posture. 524201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown */ 524301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown public void updateRotation(boolean alwaysSendConfiguration) { 524401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown updateRotationUnchecked(alwaysSendConfiguration); 524501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown } 52469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 524701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown /** 524801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * Temporarily pauses rotation changes until resumed. 524901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * 525001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * This can be used to prevent rotation changes from occurring while the user is 525101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * performing certain operations, such as drag and drop. 525201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * 525301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * This call nests and must be matched by an equal number of calls to {@link #resumeRotation}. 525401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown */ 525501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown void pauseRotationLocked() { 525601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown mDeferredRotationPauseCount += 1; 525701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown } 525801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown 525901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown /** 526001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * Resumes normal rotation changes after being paused. 526101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown */ 526201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown void resumeRotationLocked() { 526301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if (mDeferredRotationPauseCount > 0) { 526401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown mDeferredRotationPauseCount -= 1; 526501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if (mDeferredRotationPauseCount == 0) { 526601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown boolean changed = updateRotationUncheckedLocked(false); 526701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if (changed) { 526801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 526901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown } 527001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown } 527101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown } 52729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 527306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 527401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown public void updateRotationUnchecked( 527501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown boolean alwaysSendConfiguration) { 527601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if(DEBUG_ORIENTATION) Slog.v(TAG, "updateRotationUnchecked(" 527701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown + "alwaysSendConfiguration=" + alwaysSendConfiguration + ")"); 527806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 52799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long origId = Binder.clearCallingIdentity(); 52809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed; 52819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 528201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown changed = updateRotationUncheckedLocked(false); 52839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 528406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 5285e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (changed || alwaysSendConfiguration) { 52869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendNewConfiguration(); 52879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 528806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 52899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 52909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 529106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 5292e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn /** 529301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * Updates the current rotation. 529401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * 529501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * Returns true if the rotation has been changed. In this case YOU 529601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown * MUST CALL sendNewConfiguration() TO UNFREEZE THE SCREEN. 5297e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn */ 529801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown public boolean updateRotationUncheckedLocked(boolean inTransaction) { 529901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if (mDeferredRotationPauseCount > 0) { 530001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown // Rotation updates have been paused temporarily. Defer the update until 530101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown // updates have been resumed. 530201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation, rotation is paused."); 5303ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate return false; 5304ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate } 5305ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate 530601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) { 530701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown // Rotation updates cannot be performed while the previous rotation change 530801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown // animation is still in progress. Skip this update. We will try updating 530901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown // again after the animation is finished and the display is unfrozen. 531001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation, animation in progress."); 531101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown return false; 5312dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 5313dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn 531401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if (!mDisplayEnabled) { 531501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown // No point choosing a rotation if the display is not enabled. 531601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation, display is not enabled."); 531701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown return false; 5318dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 531906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 532001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown // TODO: Implement forced rotation changes. 532101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown // Set mAltOrientation to indicate that the application is receiving 532201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown // an orientation that has different metrics than it expected. 532301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown // eg. Portrait instead of Landscape. 5324dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn 532501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown int rotation = mPolicy.rotationForOrientationLw(mForcedAppOrientation, mRotation); 532601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown boolean altOrientation = !mPolicy.rotationHasCompatibleMetricsLw( 532701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown mForcedAppOrientation, rotation); 532801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown 532901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if (DEBUG_ORIENTATION) { 533001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown Slog.v(TAG, "Application requested orientation " 533101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown + mForcedAppOrientation + ", got rotation " + rotation 533201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown + " which has " + (altOrientation ? "incompatible" : "compatible") 533301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown + " metrics"); 533401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown } 533501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown 533601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if (mRotation == rotation && mAltOrientation == altOrientation) { 533701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown // No change. 533801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown return false; 533901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown } 534001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown 534101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if (DEBUG_ORIENTATION) { 534201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown Slog.v(TAG, 534301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown "Rotation changed to " + rotation + (altOrientation ? " (alt)" : "") 534401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown + " from " + mRotation + (mAltOrientation ? " (alt)" : "") 534501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown + ", forceApp=" + mForcedAppOrientation); 534601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown } 534701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown 534801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown mRotation = rotation; 534901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown mAltOrientation = altOrientation; 5350c0347aa19f354a8e1ff4fcd5372b134c0c7c16adJeff Brown mPolicy.setRotationLw(mRotation); 535101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown 535201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown mWindowsFreezingScreen = true; 535301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT); 535401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown mH.sendMessageDelayed(mH.obtainMessage(H.WINDOW_FREEZE_TIMEOUT), 2000); 535501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown mWaitingForConfig = true; 535601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown mLayoutNeeded = true; 535701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown startFreezingDisplayLocked(inTransaction); 535801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown mInputManager.setDisplayOrientation(0, rotation); 535901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown 5360e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis if (!inTransaction) { 536136991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, 5362e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis ">>> OPEN TRANSACTION setRotationUnchecked"); 5363e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis Surface.openTransaction(); 5364e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis } 5365e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis try { 5366e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis // NOTE: We disable the rotation in the emulator because 5367e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis // it doesn't support hardware OpenGL emulation yet. 5368e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis if (CUSTOM_SCREEN_ROTATION && mScreenRotationAnimation != null 5369e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis && mScreenRotationAnimation.hasScreenshot()) { 5370e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis mScreenRotationAnimation.setRotation(rotation); 5371e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis } 5372e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis Surface.setOrientation(0, rotation); 5373e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis } finally { 537401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if (!inTransaction) { 5375e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis Surface.closeTransaction(); 537636991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 5377e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis "<<< CLOSE TRANSACTION setRotationUnchecked"); 53789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 537901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown } 5380e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis 538101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown rebuildBlackFrame(inTransaction); 538206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 538301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown for (int i=mWindows.size()-1; i>=0; i--) { 538401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown WindowState w = mWindows.get(i); 538501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if (w.mSurface != null) { 53863ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Set mOrientationChanging of " + w); 538701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown w.mOrientationChanging = true; 538801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown } 538901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown } 539001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown for (int i=mRotationWatchers.size()-1; i>=0; i--) { 539101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown try { 539201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown mRotationWatchers.get(i).onRotationChanged(rotation); 539301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown } catch (RemoteException e) { 539401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown } 539501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown } 539601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown return true; 53979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 539806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 53999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRotation() { 54009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRotation; 54019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int watchRotation(IRotationWatcher watcher) { 54049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IBinder watcherBinder = watcher.asBinder(); 54059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder.DeathRecipient dr = new IBinder.DeathRecipient() { 54069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void binderDied() { 54079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 54089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<mRotationWatchers.size(); i++) { 54099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (watcherBinder == mRotationWatchers.get(i).asBinder()) { 5410fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu IRotationWatcher removed = mRotationWatchers.remove(i); 5411fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu if (removed != null) { 5412fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu removed.asBinder().unlinkToDeath(this, 0); 5413fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu } 54149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 54159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 542006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 54219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 54229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 54239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project watcher.asBinder().linkToDeath(dr, 0); 54249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRotationWatchers.add(watcher); 54259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 54269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Client died, no cleanup needed. 54279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 542806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 54299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRotation; 54309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5434dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * Apps that use the compact menu panel (as controlled by the panelMenuIsCompact 5435dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * theme attribute) on devices that feature a physical options menu key attempt to position 5436dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * their menu panel window along the edge of the screen nearest the physical menu key. 5437dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * This lowers the travel distance between invoking the menu panel and selecting 5438dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * a menu option. 5439dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * 5440dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * This method helps control where that menu is placed. Its current implementation makes 5441dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * assumptions about the menu key and its relationship to the screen based on whether 5442dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * the device's natural orientation is portrait (width < height) or landscape. 5443dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * 5444dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * The menu key is assumed to be located along the bottom edge of natural-portrait 5445dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * devices and along the right edge of natural-landscape devices. If these assumptions 5446dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * do not hold for the target device, this method should be changed to reflect that. 5447dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * 5448dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * @return A {@link Gravity} value for placing the options menu window 5449dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell */ 5450dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell public int getPreferredOptionsPanelGravity() { 5451dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell synchronized (mWindowMap) { 5452dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell final int rotation = getRotation(); 5453dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell 5454dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell if (mInitialDisplayWidth < mInitialDisplayHeight) { 5455dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell // On devices with a natural orientation of portrait 5456dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell switch (rotation) { 5457dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell default: 5458dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell case Surface.ROTATION_0: 5459dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell return Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; 5460dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell case Surface.ROTATION_90: 546167ed6c7224b902ae56a109701a241210e18cf721Adam Powell return Gravity.RIGHT | Gravity.BOTTOM; 5462dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell case Surface.ROTATION_180: 546367ed6c7224b902ae56a109701a241210e18cf721Adam Powell return Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; 5464dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell case Surface.ROTATION_270: 546567ed6c7224b902ae56a109701a241210e18cf721Adam Powell return Gravity.LEFT | Gravity.BOTTOM; 5466dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell } 5467dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell } else { 5468dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell // On devices with a natural orientation of landscape 5469dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell switch (rotation) { 5470dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell default: 5471dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell case Surface.ROTATION_0: 547267ed6c7224b902ae56a109701a241210e18cf721Adam Powell return Gravity.RIGHT | Gravity.BOTTOM; 5473dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell case Surface.ROTATION_90: 5474dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell return Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; 5475dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell case Surface.ROTATION_180: 547667ed6c7224b902ae56a109701a241210e18cf721Adam Powell return Gravity.LEFT | Gravity.BOTTOM; 5477dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell case Surface.ROTATION_270: 547867ed6c7224b902ae56a109701a241210e18cf721Adam Powell return Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; 5479dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell } 5480dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell } 5481dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell } 5482dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell } 5483dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell 5484dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell /** 54859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Starts the view server on the specified port. 54869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 54879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param port The port to listener to. 54889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 54899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the server was successfully started, false otherwise. 54909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5491a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn * @see com.android.server.wm.ViewServer 5492a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn * @see com.android.server.wm.ViewServer#VIEW_SERVER_DEFAULT_PORT 54939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 54949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean startViewServer(int port) { 549506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy if (isSystemSecure()) { 54969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 54979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(Manifest.permission.DUMP, "startViewServer")) { 55009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 55019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (port < 1024) { 55049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 55059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mViewServer != null) { 55089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mViewServer.isRunning()) { 55099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 55109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mViewServer.start(); 55119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 55128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "View server did not start"); 55139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 55169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 55199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mViewServer = new ViewServer(this, port); 55209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mViewServer.start(); 55219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 55228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "View server did not start"); 55239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 55259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 552706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy private boolean isSystemSecure() { 552806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy return "1".equals(SystemProperties.get(SYSTEM_SECURE, "1")) && 552906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy "0".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0")); 553006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy } 553106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 55329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 55339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Stops the view server if it exists. 55349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 55359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the server stopped, false if it wasn't started or 55369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * couldn't be stopped. 55379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5538a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn * @see com.android.server.wm.ViewServer 55399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 55409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean stopViewServer() { 554106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy if (isSystemSecure()) { 55429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 55439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(Manifest.permission.DUMP, "stopViewServer")) { 55469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 55479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mViewServer != null) { 55509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mViewServer.stop(); 55519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 55539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 55569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates whether the view server is running. 55579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 55589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the server is running, false otherwise. 55599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5560a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn * @see com.android.server.wm.ViewServer 55619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 55629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isViewServerRunning() { 556306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy if (isSystemSecure()) { 55649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 55659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(Manifest.permission.DUMP, "isViewServerRunning")) { 55689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 55699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mViewServer != null && mViewServer.isRunning(); 55729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 55759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all availble windows in the system. The listing is written in the 55769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified Socket's output stream with the following syntax: 55779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * windowHashCodeInHexadecimal windowName 55789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Each line of the ouput represents a different window. 55799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 55809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param client The remote client to send the listing to. 55819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return False if an error occured, true otherwise. 55829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 55839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean viewServerListWindows(Socket client) { 558406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy if (isSystemSecure()) { 55859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 55869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean result = true; 55899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5590e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState[] windows; 55919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 55929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //noinspection unchecked 5593e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown windows = mWindows.toArray(new WindowState[mWindows.size()]); 55949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BufferedWriter out = null; 55979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Any uncaught exception will crash the system process 55999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 56009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OutputStream clientStream = client.getOutputStream(); 56019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024); 56029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 56039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = windows.length; 56049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 5605e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final WindowState w = windows[i]; 56069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.write(Integer.toHexString(System.identityHashCode(w))); 56079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.write(' '); 56089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append(w.mAttrs.getTitle()); 56099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.write('\n'); 56109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 56129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.write("DONE.\n"); 56139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.flush(); 56149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 56159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = false; 56169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 56179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out != null) { 56189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 56199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.close(); 56209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 56219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = false; 56229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 56269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 56279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 56299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5630f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev * Returns the focused window in the following format: 5631f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev * windowHashCodeInHexadecimal windowName 5632f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev * 5633f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev * @param client The remote client to send the listing to. 5634f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev * @return False if an error occurred, true otherwise. 5635f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev */ 5636f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev boolean viewServerGetFocusedWindow(Socket client) { 5637f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev if (isSystemSecure()) { 5638f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev return false; 5639f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev } 5640f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev 5641f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev boolean result = true; 5642f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev 5643f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev WindowState focusedWindow = getFocusedWindow(); 5644f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev 5645f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev BufferedWriter out = null; 5646f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev 5647f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev // Any uncaught exception will crash the system process 5648f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev try { 5649f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev OutputStream clientStream = client.getOutputStream(); 5650f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024); 5651f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev 5652f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev if(focusedWindow != null) { 5653f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out.write(Integer.toHexString(System.identityHashCode(focusedWindow))); 5654f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out.write(' '); 5655f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out.append(focusedWindow.mAttrs.getTitle()); 5656f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev } 5657f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out.write('\n'); 5658f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out.flush(); 5659f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev } catch (Exception e) { 5660f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev result = false; 56619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 56629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out != null) { 56639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 56649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.close(); 56659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 56669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = false; 56679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 56719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 56729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 56749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 56759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sends a command to a target window. The result of the command, if any, will be 56769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * written in the output stream of the specified socket. 56779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 56789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The parameters must follow this syntax: 56799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * windowHashcode extra 56809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 56819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Where XX is the length in characeters of the windowTitle. 56829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 56839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The first parameter is the target window. The window with the specified hashcode 56849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be the target. If no target can be found, nothing happens. The extra parameters 56859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be delivered to the target window and as parameters to the command itself. 56869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 56879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param client The remote client to sent the result, if any, to. 56889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param command The command to execute. 56899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parameters The command parameters. 56909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 56919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the command was successfully delivered, false otherwise. This does 56929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not indicate whether the command itself was successful. 56939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 56949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean viewServerWindowCommand(Socket client, String command, String parameters) { 569506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy if (isSystemSecure()) { 56969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 56979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 56999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean success = true; 57009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = null; 57019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel reply = null; 57029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 570343b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev BufferedWriter out = null; 570443b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev 57059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Any uncaught exception will crash the system process 57069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 57079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Find the hashcode of the window 57089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = parameters.indexOf(' '); 57099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == -1) { 57109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = parameters.length(); 57119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 57129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String code = parameters.substring(0, index); 5713236092a36216c79507ec19eb207831810caced19Romain Guy int hashCode = (int) Long.parseLong(code, 16); 57149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 57159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Extract the command's parameter after the window description 57169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < parameters.length()) { 57179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parameters = parameters.substring(index + 1); 57189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 57199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parameters = ""; 57209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 57219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 57226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final WindowState window = findWindow(hashCode); 57239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (window == null) { 57249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 57259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 57269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 57279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = Parcel.obtain(); 57289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken("android.view.IWindow"); 57299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeString(command); 57309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeString(parameters); 57319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt(1); 57329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ParcelFileDescriptor.fromSocket(client).writeToParcel(data, 0); 57339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 57349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply = Parcel.obtain(); 57359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 57369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IBinder binder = window.mClient.asBinder(); 57379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: GET THE TRANSACTION CODE IN A SAFER MANNER 57389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binder.transact(IBinder.FIRST_CALL_TRANSACTION, data, reply, 0); 57399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 57409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.readException(); 57419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 574243b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev if (!client.isOutputShutdown()) { 574343b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 574443b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev out.write("DONE\n"); 574543b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev out.flush(); 574643b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev } 574743b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev 57489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 57498a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Could not send command " + command + " with parameters " + parameters, e); 57509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project success = false; 57519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 57529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data != null) { 57539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.recycle(); 57549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 57559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reply != null) { 57569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.recycle(); 57579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 575843b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev if (out != null) { 575943b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev try { 576043b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev out.close(); 576143b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev } catch (IOException e) { 576243b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev 576343b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev } 576443b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev } 57659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 57669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 57679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return success; 57689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 57699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5770dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev public void addWindowChangeListener(WindowChangeListener listener) { 5771dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev synchronized(mWindowMap) { 5772dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowChangeListeners.add(listener); 5773dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5774dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5775dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev 5776dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev public void removeWindowChangeListener(WindowChangeListener listener) { 5777dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev synchronized(mWindowMap) { 5778dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowChangeListeners.remove(listener); 5779dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5780dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5781dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev 5782dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev private void notifyWindowsChanged() { 5783dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev WindowChangeListener[] windowChangeListeners; 5784dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev synchronized(mWindowMap) { 5785dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev if(mWindowChangeListeners.isEmpty()) { 5786dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev return; 5787dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5788dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev windowChangeListeners = new WindowChangeListener[mWindowChangeListeners.size()]; 5789dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev windowChangeListeners = mWindowChangeListeners.toArray(windowChangeListeners); 5790dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5791dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev int N = windowChangeListeners.length; 5792dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev for(int i = 0; i < N; i++) { 5793dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev windowChangeListeners[i].windowsChanged(); 5794dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5795dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5796dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev 57976e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev private void notifyFocusChanged() { 57986e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev WindowChangeListener[] windowChangeListeners; 57996e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev synchronized(mWindowMap) { 58006e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev if(mWindowChangeListeners.isEmpty()) { 58016e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev return; 58026e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev } 58036e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev windowChangeListeners = new WindowChangeListener[mWindowChangeListeners.size()]; 58046e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev windowChangeListeners = mWindowChangeListeners.toArray(windowChangeListeners); 58056e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev } 58066e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev int N = windowChangeListeners.length; 58076e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev for(int i = 0; i < N; i++) { 58086e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev windowChangeListeners[i].focusChanged(); 58096e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev } 58106e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev } 58116e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev 58129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WindowState findWindow(int hashCode) { 58139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hashCode == -1) { 58149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getFocusedWindow(); 58159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 58169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 5818e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final ArrayList<WindowState> windows = mWindows; 58199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = windows.size(); 58209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 5822e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = windows.get(i); 58239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (System.identityHashCode(w) == hashCode) { 58249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return w; 58259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 58269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 58279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 58289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 58309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 58319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 58339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Instruct the Activity Manager to fetch the current configuration and broadcast 58349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that to config-changed listeners if appropriate. 58359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 58369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void sendNewConfiguration() { 58379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 58389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityManager.updateConfiguration(null); 58399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 58409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 58419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 584206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 58439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Configuration computeNewConfiguration() { 58449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 584594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn Configuration config = computeNewConfigurationLocked(); 584694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (config == null && mWaitingForConfig) { 584794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn // Nothing changed but we are waiting for something... stop that! 584894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn mWaitingForConfig = false; 584994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn performLayoutAndPlaceSurfacesLocked(); 585094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } 585194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn return config; 5852c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } 5853c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } 585406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 5855c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn Configuration computeNewConfigurationLocked() { 5856c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn Configuration config = new Configuration(); 585709e5b9daf3c675b8943015abb3b420fd45f19fe8Dianne Hackborn config.fontScale = 0; 5858c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn if (!computeNewConfigurationLocked(config)) { 5859c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn return null; 5860c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } 5861c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn return config; 5862c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } 586306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 58641f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn private int reduceConfigWidthSize(int curSize, int rotation, float density, int dw, int dh) { 58651f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn int size = (int)(mPolicy.getConfigDisplayWidth(dw, dh, rotation) / density); 586669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (size < curSize) { 586769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn curSize = size; 586869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 586969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn return curSize; 587069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 587169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn 587256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn private int reduceConfigLayout(int curLayout, int rotation, float density, 587356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn int dw, int dh) { 587456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // Get the app screen size at this rotation. 587556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn int w = mPolicy.getNonDecorDisplayWidth(dw, dh, rotation); 587656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn int h = mPolicy.getNonDecorDisplayHeight(dw, dh, rotation); 587756b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn 587856b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // Compute the screen layout size class for this rotation. 587956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn int screenLayoutSize; 588056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn boolean screenLayoutLong; 588156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn boolean screenLayoutCompatNeeded; 588256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn int longSize = w; 588356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn int shortSize = h; 588456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn if (longSize < shortSize) { 588556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn int tmp = longSize; 588656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn longSize = shortSize; 588756b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn shortSize = tmp; 588856b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn } 588956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn longSize = (int)(longSize/density); 589056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn shortSize = (int)(shortSize/density); 589156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn 589256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // These semi-magic numbers define our compatibility modes for 589356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // applications with different screens. These are guarantees to 589456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // app developers about the space they can expect for a particular 589556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // configuration. DO NOT CHANGE! 589656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn if (longSize < 470) { 589756b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // This is shorter than an HVGA normal density screen (which 589856b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // is 480 pixels on its long side). 589956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn screenLayoutSize = Configuration.SCREENLAYOUT_SIZE_SMALL; 590056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn screenLayoutLong = false; 590156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn screenLayoutCompatNeeded = false; 590256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn } else { 590356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // What size is this screen screen? 590456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn if (longSize >= 960 && shortSize >= 720) { 590556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // 1.5xVGA or larger screens at medium density are the point 590656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // at which we consider it to be an extra large screen. 590756b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn screenLayoutSize = Configuration.SCREENLAYOUT_SIZE_XLARGE; 590856b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn } else if (longSize >= 640 && shortSize >= 480) { 590956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // VGA or larger screens at medium density are the point 591056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // at which we consider it to be a large screen. 591156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn screenLayoutSize = Configuration.SCREENLAYOUT_SIZE_LARGE; 591256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn } else { 591356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn screenLayoutSize = Configuration.SCREENLAYOUT_SIZE_NORMAL; 591456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn } 591556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn 591656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // If this screen is wider than normal HVGA, or taller 591756b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // than FWVGA, then for old apps we want to run in size 591856b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // compatibility mode. 591956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn if (shortSize > 321 || longSize > 570) { 592056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn screenLayoutCompatNeeded = true; 592156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn } else { 592256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn screenLayoutCompatNeeded = false; 592356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn } 592456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn 592556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // Is this a long screen? 592656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn if (((longSize*3)/5) >= (shortSize-1)) { 592756b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // Anything wider than WVGA (5:3) is considering to be long. 592856b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn screenLayoutLong = true; 592956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn } else { 593056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn screenLayoutLong = false; 593156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn } 593256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn } 593356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn 593456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // Now reduce the last screenLayout to not be better than what we 593556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn // have found. 593656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn if (!screenLayoutLong) { 593756b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn curLayout = (curLayout&~Configuration.SCREENLAYOUT_LONG_MASK) 593856b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn | Configuration.SCREENLAYOUT_LONG_NO; 593956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn } 594056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn if (screenLayoutCompatNeeded) { 594156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn curLayout |= Configuration.SCREENLAYOUT_COMPAT_NEEDED; 594256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn } 594356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn int curSize = curLayout&Configuration.SCREENLAYOUT_SIZE_MASK; 594456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn if (screenLayoutSize < curSize) { 594556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn curLayout = (curLayout&~Configuration.SCREENLAYOUT_SIZE_MASK) 594656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn | screenLayoutSize; 594756b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn } 594856b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn return curLayout; 594956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn } 595056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn 595156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn private void computeSmallestWidthAndScreenLayout(boolean rotated, int dw, int dh, 595256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn float density, Configuration outConfig) { 59535fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn // We need to determine the smallest width that will occur under normal 59545fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn // operation. To this, start with the base screen size and compute the 59555fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn // width under the different possible rotations. We need to un-rotate 59565fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn // the current screen dimensions before doing this. 59575fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn int unrotDw, unrotDh; 59585fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (rotated) { 59595fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn unrotDw = dh; 59605fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn unrotDh = dw; 59615fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } else { 59625fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn unrotDw = dw; 59635fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn unrotDh = dh; 59645fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 59651f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn int sw = reduceConfigWidthSize(unrotDw, Surface.ROTATION_0, density, unrotDw, unrotDh); 596609bd49a8a74cafe7f03aee769bfe0748bf3c2b51Dianne Hackborn sw = reduceConfigWidthSize(sw, Surface.ROTATION_90, density, unrotDh, unrotDw); 59671f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn sw = reduceConfigWidthSize(sw, Surface.ROTATION_180, density, unrotDw, unrotDh); 596809bd49a8a74cafe7f03aee769bfe0748bf3c2b51Dianne Hackborn sw = reduceConfigWidthSize(sw, Surface.ROTATION_270, density, unrotDh, unrotDw); 596956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn int sl = Configuration.SCREENLAYOUT_SIZE_XLARGE 597056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn | Configuration.SCREENLAYOUT_LONG_YES; 597156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn sl = reduceConfigLayout(sl, Surface.ROTATION_0, density, unrotDw, unrotDh); 597256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn sl = reduceConfigLayout(sl, Surface.ROTATION_90, density, unrotDh, unrotDw); 597356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn sl = reduceConfigLayout(sl, Surface.ROTATION_180, density, unrotDw, unrotDh); 597456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn sl = reduceConfigLayout(sl, Surface.ROTATION_270, density, unrotDh, unrotDw); 597556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn outConfig.smallestScreenWidthDp = sw; 597656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn outConfig.screenLayout = sl; 59775fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 59785fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 597948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn private int reduceCompatConfigWidthSize(int curSize, int rotation, DisplayMetrics dm, 598048a7651823030ed3c0f4c084b423430044425feaDianne Hackborn int dw, int dh) { 59811f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn dm.noncompatWidthPixels = mPolicy.getNonDecorDisplayWidth(dw, dh, rotation); 59821f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn dm.noncompatHeightPixels = mPolicy.getNonDecorDisplayHeight(dw, dh, rotation); 598348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn float scale = CompatibilityInfo.computeCompatibleScaling(dm, null); 59842b31d53161789358de57fd396716a6503855c5daDianne Hackborn int size = (int)(((dm.noncompatWidthPixels / scale) / dm.density) + .5f); 598548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn if (curSize == 0 || size < curSize) { 598648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn curSize = size; 598748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn } 598848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn return curSize; 598948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn } 599048a7651823030ed3c0f4c084b423430044425feaDianne Hackborn 599148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn private int computeCompatSmallestWidth(boolean rotated, DisplayMetrics dm, int dw, int dh) { 599248a7651823030ed3c0f4c084b423430044425feaDianne Hackborn mTmpDisplayMetrics.setTo(dm); 599348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn dm = mTmpDisplayMetrics; 599448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn int unrotDw, unrotDh; 599548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn if (rotated) { 599648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn unrotDw = dh; 599748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn unrotDh = dw; 599848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn } else { 599948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn unrotDw = dw; 600048a7651823030ed3c0f4c084b423430044425feaDianne Hackborn unrotDh = dh; 600148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn } 600248a7651823030ed3c0f4c084b423430044425feaDianne Hackborn int sw = reduceCompatConfigWidthSize(0, Surface.ROTATION_0, dm, unrotDw, unrotDh); 600348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_90, dm, unrotDh, unrotDw); 600448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_180, dm, unrotDw, unrotDh); 600548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_270, dm, unrotDh, unrotDw); 600648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn return sw; 600748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn } 600848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn 6009c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn boolean computeNewConfigurationLocked(Configuration config) { 6010c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn if (mDisplay == null) { 6011c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn return false; 60129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 601300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 601400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputManager.getInputConfiguration(config); 6015b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate 6016b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate // Use the effective "visual" dimensions based on current rotation 6017b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate final boolean rotated = (mRotation == Surface.ROTATION_90 6018b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate || mRotation == Surface.ROTATION_270); 60197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn final int realdw = rotated ? mBaseDisplayHeight : mBaseDisplayWidth; 60207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn final int realdh = rotated ? mBaseDisplayWidth : mBaseDisplayHeight; 6021dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn 60221fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn synchronized(mDisplaySizeLock) { 60231fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn if (mAltOrientation) { 60241fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn mCurDisplayWidth = realdw; 60251fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn mCurDisplayHeight = realdh; 60261fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn if (realdw > realdh) { 60271fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn // Turn landscape into portrait. 60281fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn int maxw = (int)(realdh/1.3f); 60291fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn if (maxw < realdw) { 60301fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn mCurDisplayWidth = maxw; 60311fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn } 60321fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn } else { 60331fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn // Turn portrait into landscape. 60341fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn int maxh = (int)(realdw/1.3f); 60351fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn if (maxh < realdh) { 60361fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn mCurDisplayHeight = maxh; 60371fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn } 6038dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 6039dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } else { 60401fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn mCurDisplayWidth = realdw; 60411fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn mCurDisplayHeight = realdh; 6042dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 6043dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 6044dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn 6045dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn final int dw = mCurDisplayWidth; 6046dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn final int dh = mCurDisplayHeight; 6047b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate 6048c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn int orientation = Configuration.ORIENTATION_SQUARE; 6049c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn if (dw < dh) { 6050c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn orientation = Configuration.ORIENTATION_PORTRAIT; 6051c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } else if (dw > dh) { 6052c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn orientation = Configuration.ORIENTATION_LANDSCAPE; 6053c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } 6054c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn config.orientation = orientation; 6055ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 6056bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown // Update real display metrics. 6057bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mDisplay.getMetricsWithSize(mRealDisplayMetrics, mCurDisplayWidth, mCurDisplayHeight); 6058dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn 6059bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown // Update application display metrics. 6060bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown final DisplayMetrics dm = mDisplayMetrics; 60611fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn final int appWidth = mPolicy.getNonDecorDisplayWidth(dw, dh, mRotation); 60621fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn final int appHeight = mPolicy.getNonDecorDisplayHeight(dw, dh, mRotation); 60631fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn synchronized(mDisplaySizeLock) { 60641fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn mAppDisplayWidth = appWidth; 60651fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn mAppDisplayHeight = appHeight; 60661fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn } 606736991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn if (false) { 606836991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn Slog.i(TAG, "Set app display size: " + mAppDisplayWidth 606936991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn + " x " + mAppDisplayHeight); 607036991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn } 6071bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mDisplay.getMetricsWithSize(dm, mAppDisplayWidth, mAppDisplayHeight); 6072dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn 60735fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn mCompatibleScreenScale = CompatibilityInfo.computeCompatibleScaling(dm, 60745fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn mCompatDisplayMetrics); 60751ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 60761f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn config.screenWidthDp = (int)(mPolicy.getConfigDisplayWidth(dw, dh, mRotation) 60771f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn / dm.density); 60781f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn config.screenHeightDp = (int)(mPolicy.getConfigDisplayHeight(dw, dh, mRotation) 60791f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn / dm.density); 608056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn computeSmallestWidthAndScreenLayout(rotated, dw, dh, dm.density, config); 60815fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 60825fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn config.compatScreenWidthDp = (int)(config.screenWidthDp / mCompatibleScreenScale); 60835fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn config.compatScreenHeightDp = (int)(config.screenHeightDp / mCompatibleScreenScale); 608448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn config.compatSmallestScreenWidthDp = computeCompatSmallestWidth(rotated, dm, dw, dh); 608569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn 6086597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown // Determine whether a hard keyboard is available and enabled. 60872992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown boolean hardKeyboardAvailable = config.keyboard != Configuration.KEYBOARD_NOKEYS; 60882992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown if (hardKeyboardAvailable != mHardKeyboardAvailable) { 60892992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mHardKeyboardAvailable = hardKeyboardAvailable; 60902992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mHardKeyboardEnabled = hardKeyboardAvailable; 60912992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 60922992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mH.removeMessages(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE); 60932992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mH.sendEmptyMessage(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE); 60942992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 60952992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown if (!mHardKeyboardEnabled) { 60962992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown config.keyboard = Configuration.KEYBOARD_NOKEYS; 60972992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 6098597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown 6099597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown // Update value of keyboardHidden, hardKeyboardHidden and navigationHidden 6100597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown // based on whether a hard or soft keyboard is present, whether navigation keys 6101597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown // are present and the lid switch state. 6102597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown config.keyboardHidden = Configuration.KEYBOARDHIDDEN_NO; 6103597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO; 6104597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown config.navigationHidden = Configuration.NAVIGATIONHIDDEN_NO; 6105597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown mPolicy.adjustConfigurationLw(config); 6106c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn return true; 61079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6108a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 61092992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public boolean isHardKeyboardAvailable() { 61102992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown synchronized (mWindowMap) { 61112992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown return mHardKeyboardAvailable; 61122992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 61132992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 61142992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 61152992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public boolean isHardKeyboardEnabled() { 61162992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown synchronized (mWindowMap) { 61172992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown return mHardKeyboardEnabled; 61182992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 61192992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 61202992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 61212992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public void setHardKeyboardEnabled(boolean enabled) { 61222992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown synchronized (mWindowMap) { 61232992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown if (mHardKeyboardEnabled != enabled) { 61242992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mHardKeyboardEnabled = enabled; 61252992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 61262992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 61272992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 61282992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 61292992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 61302992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public void setOnHardKeyboardStatusChangeListener( 61312992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown OnHardKeyboardStatusChangeListener listener) { 61322992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown synchronized (mWindowMap) { 61332992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mHardKeyboardStatusChangeListener = listener; 61342992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 61352992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 61362992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 61372992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown void notifyHardKeyboardStatusChange() { 61382992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown final boolean available, enabled; 61392992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown final OnHardKeyboardStatusChangeListener listener; 61402992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown synchronized (mWindowMap) { 61412992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown listener = mHardKeyboardStatusChangeListener; 61422992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown available = mHardKeyboardAvailable; 61432992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown enabled = mHardKeyboardEnabled; 61442992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 61452992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown if (listener != null) { 61462992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown listener.onHardKeyboardStatusChange(available, enabled); 61472992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 61482992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 61492992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 6150a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // ------------------------------------------------------------- 6151a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // Drag and drop 6152a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // ------------------------------------------------------------- 6153a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 6154a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate IBinder prepareDragSurface(IWindow window, SurfaceSession session, 615502d2b3ba9ba830a8147db2739613f7bbb2d0fcbfChristopher Tate int flags, int width, int height, Surface outSurface) { 6156a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) { 6157a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.d(TAG, "prepare drag surface: w=" + width + " h=" + height 615802d2b3ba9ba830a8147db2739613f7bbb2d0fcbfChristopher Tate + " flags=" + Integer.toHexString(flags) + " win=" + window 6159a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate + " asbinder=" + window.asBinder()); 6160a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6161a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 6162a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate final int callerPid = Binder.getCallingPid(); 6163a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate final long origId = Binder.clearCallingIdentity(); 6164a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate IBinder token = null; 6165a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 6166a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate try { 6167a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate synchronized (mWindowMap) { 6168a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate try { 6169a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (mDragState == null) { 6170a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Surface surface = new Surface(session, callerPid, "drag surface", 0, 6171a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate width, height, PixelFormat.TRANSLUCENT, Surface.HIDDEN); 6172ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, " DRAG " 6173ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn + surface + ": CREATE"); 6174a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate outSurface.copyFrom(surface); 61757b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate final IBinder winBinder = window.asBinder(); 6176a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate token = new Binder(); 61776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDragState = new DragState(this, token, surface, /*flags*/ 0, winBinder); 6178a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState.mSurface = surface; 6179a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate token = mDragState.mToken = new Binder(); 6180a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 6181a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // 5 second timeout for this window to actually begin the drag 61827b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate mH.removeMessages(H.DRAG_START_TIMEOUT, winBinder); 61837b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate Message msg = mH.obtainMessage(H.DRAG_START_TIMEOUT, winBinder); 6184a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mH.sendMessageDelayed(msg, 5000); 6185a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } else { 6186a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.w(TAG, "Drag already in progress"); 6187a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6188a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } catch (Surface.OutOfResourcesException e) { 6189a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.e(TAG, "Can't allocate drag surface w=" + width + " h=" + height, e); 6190a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (mDragState != null) { 6191a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState.reset(); 6192a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState = null; 6193a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6194a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6195a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6196a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } finally { 6197a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Binder.restoreCallingIdentity(origId); 6198a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6199a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 6200a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate return token; 6201a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6202a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 62039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 62049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Input Events and Focus Management 62059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 620646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 62076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final InputMonitor mInputMonitor = new InputMonitor(this); 62087fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 62099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void pauseKeyDispatching(IBinder _token) { 62109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 62119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "pauseKeyDispatching()")) { 6212cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 62139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 621406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 62159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 62169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mTokenMap.get(_token); 62179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token != null) { 621800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.pauseDispatchingLw(token); 62199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6222ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 62239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void resumeKeyDispatching(IBinder _token) { 62249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 62259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "resumeKeyDispatching()")) { 6226cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 6227e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan } 6228e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan 62299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 62309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mTokenMap.get(_token); 62319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token != null) { 623200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.resumeDispatchingLw(token); 6233e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan } 6234e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan } 62359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6236e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan 62379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setEventDispatching(boolean enabled) { 62389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 62399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "resumeKeyDispatching()")) { 6240cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 62419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 624206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 62439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 624400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.setEventDispatchingLw(enabled); 62459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 624706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 62489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 62499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Injects a keystroke event into the UI. 6250bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * Even when sync is false, this method may block while waiting for current 6251bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * input events to be dispatched. 625206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * 625306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * @param ev A motion event describing the keystroke action. (Be sure to use 62549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SystemClock#uptimeMillis()} as the timebase.) 62559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sync If true, wait for the event to be completed before returning to the caller. 62569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if event was dispatched, false if it was dropped for any reason 62579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 62589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean injectKeyEvent(KeyEvent ev, boolean sync) { 62599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long downTime = ev.getDownTime(); 62609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long eventTime = ev.getEventTime(); 626106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 62629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int action = ev.getAction(); 62639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int code = ev.getKeyCode(); 62649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int repeatCount = ev.getRepeatCount(); 62659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int metaState = ev.getMetaState(); 62669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int deviceId = ev.getDeviceId(); 62679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int scancode = ev.getScanCode(); 6268c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown int source = ev.getSource(); 6269c6ded10dd1ee08c887d0e81d683a7611fbe3ca4dMike Playle int flags = ev.getFlags(); 6270c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 6271c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown if (source == InputDevice.SOURCE_UNKNOWN) { 6272c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown source = InputDevice.SOURCE_KEYBOARD; 6273c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown } 627406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 62759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (eventTime == 0) eventTime = SystemClock.uptimeMillis(); 62769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (downTime == 0) downTime = eventTime; 627706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 62789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project KeyEvent newEvent = new KeyEvent(downTime, eventTime, action, code, repeatCount, metaState, 62794a88013a4a06a9ea80e8419f94694936e6b013f0Jean-Baptiste Queru deviceId, scancode, flags | KeyEvent.FLAG_FROM_SYSTEM, source); 628006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 62812bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int pid = Binder.getCallingPid(); 62822bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int uid = Binder.getCallingUid(); 62832bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final long ident = Binder.clearCallingIdentity(); 628446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 6285bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int result = mInputManager.injectInputEvent(newEvent, pid, uid, 6286bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH 6287bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT, 6288bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown INJECTION_TIMEOUT_MILLIS); 628946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 62902bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn Binder.restoreCallingIdentity(ident); 62917fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown return reportInjectionResult(result); 62929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 62959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inject a pointer (touch) event into the UI. 6296bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * Even when sync is false, this method may block while waiting for current 6297bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * input events to be dispatched. 629806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * 629906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * @param ev A motion event describing the pointer (touch) action. (As noted in 630006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use 63019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SystemClock#uptimeMillis()} as the timebase.) 63029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sync If true, wait for the event to be completed before returning to the caller. 63039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if event was dispatched, false if it was dropped for any reason 63049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 63059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean injectPointerEvent(MotionEvent ev, boolean sync) { 63062bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int pid = Binder.getCallingPid(); 63072bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int uid = Binder.getCallingUid(); 63082bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final long ident = Binder.clearCallingIdentity(); 630946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 6310c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown MotionEvent newEvent = MotionEvent.obtain(ev); 6311c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown if ((newEvent.getSource() & InputDevice.SOURCE_CLASS_POINTER) == 0) { 6312c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown newEvent.setSource(InputDevice.SOURCE_TOUCHSCREEN); 6313c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown } 6314c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 6315bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int result = mInputManager.injectInputEvent(newEvent, pid, uid, 6316bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH 6317bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT, 6318bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown INJECTION_TIMEOUT_MILLIS); 631946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 63202bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn Binder.restoreCallingIdentity(ident); 63217fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown return reportInjectionResult(result); 63229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 632306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 63249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 63259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inject a trackball (navigation device) event into the UI. 6326bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * Even when sync is false, this method may block while waiting for current 6327bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * input events to be dispatched. 632806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * 632906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * @param ev A motion event describing the trackball action. (As noted in 633006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use 63319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SystemClock#uptimeMillis()} as the timebase.) 63329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sync If true, wait for the event to be completed before returning to the caller. 63339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if event was dispatched, false if it was dropped for any reason 63349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 63359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean injectTrackballEvent(MotionEvent ev, boolean sync) { 63362bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int pid = Binder.getCallingPid(); 63372bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int uid = Binder.getCallingUid(); 63382bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final long ident = Binder.clearCallingIdentity(); 633946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 6340c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown MotionEvent newEvent = MotionEvent.obtain(ev); 6341c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown if ((newEvent.getSource() & InputDevice.SOURCE_CLASS_TRACKBALL) == 0) { 6342c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown newEvent.setSource(InputDevice.SOURCE_TRACKBALL); 6343c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown } 6344c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 6345bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int result = mInputManager.injectInputEvent(newEvent, pid, uid, 6346bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH 6347bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT, 6348bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown INJECTION_TIMEOUT_MILLIS); 6349bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown 6350bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown Binder.restoreCallingIdentity(ident); 6351bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown return reportInjectionResult(result); 6352bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown } 6353bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown 6354bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown /** 6355bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * Inject an input event into the UI without waiting for dispatch to commence. 6356bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * This variant is useful for fire-and-forget input event injection. It does not 6357bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * block any longer than it takes to enqueue the input event. 6358bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * 6359bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * @param ev An input event. (Be sure to set the input source correctly.) 6360bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * @return Returns true if event was dispatched, false if it was dropped for any reason 6361bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown */ 6362bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown public boolean injectInputEventNoWait(InputEvent ev) { 6363bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int pid = Binder.getCallingPid(); 6364bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int uid = Binder.getCallingUid(); 6365bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final long ident = Binder.clearCallingIdentity(); 6366bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown 6367bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int result = mInputManager.injectInputEvent(ev, pid, uid, 6368bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown InputManager.INPUT_EVENT_INJECTION_SYNC_NONE, 6369bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown INJECTION_TIMEOUT_MILLIS); 637046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 63712bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn Binder.restoreCallingIdentity(ident); 63727fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown return reportInjectionResult(result); 63737fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown } 63747fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 63757fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown private boolean reportInjectionResult(int result) { 637600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown switch (result) { 637700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown case InputManager.INPUT_EVENT_INJECTION_PERMISSION_DENIED: 637800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown Slog.w(TAG, "Input event injection permission denied."); 637900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown throw new SecurityException( 638000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown "Injecting to another application requires INJECT_EVENTS permission"); 638100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown case InputManager.INPUT_EVENT_INJECTION_SUCCEEDED: 638209e85dc0270ac9ce660c17ee8290ff2d136b395bChristopher Tate //Slog.v(TAG, "Input event injection succeeded."); 638300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return true; 638400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown case InputManager.INPUT_EVENT_INJECTION_TIMED_OUT: 638500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown Slog.w(TAG, "Input event injection timed out."); 638600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return false; 638700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown case InputManager.INPUT_EVENT_INJECTION_FAILED: 638800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown default: 638900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown Slog.w(TAG, "Input event injection failed."); 639000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return false; 6391cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn } 63929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 639306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 63941a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown /** 63951a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown * Temporarily set the pointer speed. Does not save the new setting. 63961a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown * Used by the settings application. 63971a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown */ 63981a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown public void setPointerSpeed(int speed) { 63991a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown if (!checkCallingPermission(android.Manifest.permission.SET_POINTER_SPEED, 64001a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown "setPointerSpeed()")) { 64011a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown throw new SecurityException("Requires SET_POINTER_SPEED permission"); 64021a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown } 64031a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 64041a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown mInputManager.setPointerSpeed(speed); 64051a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown } 64061a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 64079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WindowState getFocusedWindow() { 64089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 64099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getFocusedWindowLocked(); 64109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 64139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WindowState getFocusedWindowLocked() { 64149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentFocus; 64159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 641606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 64179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean detectSafeMode() { 6418b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown if (!mInputMonitor.waitForInputDevicesReady( 6419b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS)) { 6420b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown Slog.w(TAG, "Devices still not ready after waiting " 6421b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown + INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS 6422b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown + " milliseconds before attempting to detect safe mode."); 6423b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown } 6424b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown 64259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSafeMode = mPolicy.detectSafeMode(); 64269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSafeMode; 64279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 642806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6429661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn public void displayReady() { 64305132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn synchronized(mWindowMap) { 64315132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn if (mDisplay != null) { 64325132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn throw new IllegalStateException("Display already initialized"); 64335132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn } 64345132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); 64355132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn mDisplay = wm.getDefaultDisplay(); 64361fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn synchronized(mDisplaySizeLock) { 64371fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn mInitialDisplayWidth = mDisplay.getRawWidth(); 64381fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn mInitialDisplayHeight = mDisplay.getRawHeight(); 64391fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn int rot = mDisplay.getRotation(); 64401fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn if (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270) { 64411fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn // If the screen is currently rotated, we need to swap the 64421fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn // initial width and height to get the true natural values. 64431fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn int tmp = mInitialDisplayWidth; 64441fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn mInitialDisplayWidth = mInitialDisplayHeight; 64451fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn mInitialDisplayHeight = tmp; 64461fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn } 64471fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn mBaseDisplayWidth = mCurDisplayWidth = mAppDisplayWidth = mInitialDisplayWidth; 64481fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn mBaseDisplayHeight = mCurDisplayHeight = mAppDisplayHeight = mInitialDisplayHeight; 64491fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn } 6450bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mInputManager.setDisplaySize(Display.DEFAULT_DISPLAY, 6451bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mDisplay.getRawWidth(), mDisplay.getRawHeight(), 6452bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mDisplay.getRawExternalWidth(), mDisplay.getRawExternalHeight()); 64539d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn mPolicy.setInitialDisplaySize(mInitialDisplayWidth, mInitialDisplayHeight); 64545132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn } 64555132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn 64565132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn try { 64575132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn mActivityManager.updateConfiguration(null); 64585132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn } catch (RemoteException e) { 64595132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn } 6460661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn 6461571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato synchronized (mWindowMap) { 6462571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato readForcedDisplaySizeLocked(); 6463571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } 64645132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn } 64655132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn 6466661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn public void systemReady() { 6467661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn mPolicy.systemReady(); 6468661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn } 6469661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn 64706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // This is an animation that does nothing: it just immediately finishes 64716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // itself every time it is called. It is used as a stub animation in cases 64726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // where we want to synchronize multiple things that may be animating. 64736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn static final class DummyAnimation extends Animation { 64746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean getTransformation(long currentTime, Transformation outTransformation) { 64756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return false; 64766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 64776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 64786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn static final Animation sDummyAnimation = new DummyAnimation(); 64796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 64809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 64816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Async Handler 64829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 64839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 64846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final class H extends Handler { 64856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REPORT_FOCUS_CHANGE = 2; 64866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REPORT_LOSING_FOCUS = 3; 64876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int ANIMATE = 4; 64886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int ADD_STARTING = 5; 64896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REMOVE_STARTING = 6; 64906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int FINISHED_STARTING = 7; 64916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REPORT_APPLICATION_TOKEN_WINDOWS = 8; 64922c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn public static final int REPORT_APPLICATION_TOKEN_DRAWN = 9; 64936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int WINDOW_FREEZE_TIMEOUT = 11; 64946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int HOLD_SCREEN_CHANGED = 12; 64956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int APP_TRANSITION_TIMEOUT = 13; 64966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int PERSIST_ANIMATION_SCALE = 14; 64976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int FORCE_GC = 15; 64986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int ENABLE_SCREEN = 16; 64996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int APP_FREEZE_TIMEOUT = 17; 65006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int SEND_NEW_CONFIGURATION = 18; 65016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REPORT_WINDOWS_CHANGE = 19; 65026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int DRAG_START_TIMEOUT = 20; 65036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int DRAG_END_TIMEOUT = 21; 65046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REPORT_HARD_KEYBOARD_STATUS_CHANGE = 22; 650529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn public static final int BOOT_TIMEOUT = 23; 650638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn public static final int WAITING_FOR_DRAWN_TIMEOUT = 24; 650706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 65089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Session mLastReportedHold; 650906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 65109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public H() { 65119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 651206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 65139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 65149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 65159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (msg.what) { 65169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REPORT_FOCUS_CHANGE: { 65179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState lastFocus; 65189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState newFocus; 651906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 65209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 65219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastFocus = mLastFocus; 65229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newFocus = mCurrentFocus; 65239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lastFocus == newFocus) { 65249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Focus is not changing, so nothing to do. 65259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 65269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastFocus = newFocus; 65288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Focus moving from " + lastFocus 65299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " to " + newFocus); 65309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newFocus != null && lastFocus != null 65319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !newFocus.isDisplayedLw()) { 65328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Delaying loss of focus..."); 65339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLosingFocus.add(lastFocus); 65349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastFocus = null; 65359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 65389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lastFocus != newFocus) { 65399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //System.out.println("Changing focus from " + lastFocus 65409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " to " + newFocus); 65419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newFocus != null) { 65429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 65438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Gaining focus: " + newFocus); 65449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newFocus.mClient.windowFocusChanged(true, mInTouchMode); 65459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 65469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore if process has died. 65479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65485e7833a571967d1dbc8618ac96ad6a379bcdf66aKonstantin Lopyrev notifyFocusChanged(); 65499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 65519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lastFocus != null) { 65529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 65538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Losing focus: " + lastFocus); 65549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastFocus.mClient.windowFocusChanged(false, mInTouchMode); 65559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 65569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore if process has died. 65579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 65619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 65629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REPORT_LOSING_FOCUS: { 65639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<WindowState> losers; 656406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 65659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 65669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project losers = mLosingFocus; 65679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLosingFocus = new ArrayList<WindowState>(); 65689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 65709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = losers.size(); 65719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 65729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 65738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Losing delayed focus: " + losers.get(i)); 65749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project losers.get(i).mClient.windowFocusChanged(false, mInTouchMode); 65759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 65769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore if process has died. 65779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 65809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 65819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ANIMATE: { 65829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 65839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimationPending = false; 65849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 65859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 65879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 65889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ADD_STARTING: { 65899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = (AppWindowToken)msg.obj; 65909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final StartingData sd = wtoken.startingData; 65919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 65929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sd == null) { 65939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Animation has been canceled... do nothing. 65949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 65959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 659606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 65978a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Add starting " 65989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken + ": pkg=" + sd.pkg); 659906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 66009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View view = null; 66019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 66029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = mPolicy.addStartingWindow( 66032f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn wtoken.token, sd.pkg, sd.theme, sd.compatInfo, 66042f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn sd.nonLocalizedLabel, sd.labelRes, sd.icon, sd.windowFlags); 66059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 66068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception when adding starting window", e); 66079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 66099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view != null) { 66109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean abort = false; 66119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 66129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 66139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.removed || wtoken.startingData == null) { 66149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the window was successfully added, then 66159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need to remove it. 66169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.startingWindow != null) { 66178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, 66189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Aborted starting " + wtoken 66199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": removed=" + wtoken.removed 66209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " startingData=" + wtoken.startingData); 66219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingWindow = null; 66229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingData = null; 66239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project abort = true; 66249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 66269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingView = view; 66279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW && !abort) Slog.v(TAG, 66299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Added starting " + wtoken 66309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": startingWindow=" 66319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.startingWindow + " startingView=" 66329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.startingView); 66339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 66359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (abort) { 66369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 66379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.removeStartingWindow(wtoken.token, view); 66389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 66398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception when removing starting window", e); 66409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 66449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 66459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REMOVE_STARTING: { 66469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = (AppWindowToken)msg.obj; 66479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder token = null; 66489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View view = null; 66499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 66508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Remove starting " 66519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken + ": startingWindow=" 66529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.startingWindow + " startingView=" 66539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.startingView); 66549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.startingWindow != null) { 66559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = wtoken.startingView; 66569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token = wtoken.token; 66579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingData = null; 66589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingView = null; 66599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingWindow = null; 66609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view != null) { 66639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 66649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.removeStartingWindow(token, view); 66659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 66668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception when removing starting window", e); 66679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 66709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 66719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FINISHED_STARTING: { 66729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder token = null; 66739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View view = null; 66749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (true) { 66759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 66769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mFinishedStarting.size(); 66779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N <= 0) { 66789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 66799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mFinishedStarting.remove(N-1); 66819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 66828a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, 66839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Finished starting " + wtoken 66849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": startingWindow=" + wtoken.startingWindow 66859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " startingView=" + wtoken.startingView); 66869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 66879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.startingWindow == null) { 66889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 66899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 66919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = wtoken.startingView; 66929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token = wtoken.token; 66939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingData = null; 66949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingView = null; 66959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingWindow = null; 66969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 66989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 66999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.removeStartingWindow(token, view); 67009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 67018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception when removing starting window", e); 67029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 67059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 67062c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn case REPORT_APPLICATION_TOKEN_DRAWN: { 67072c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn final AppWindowToken wtoken = (AppWindowToken)msg.obj; 67082c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 67092c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn try { 67102c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (DEBUG_VISIBILITY) Slog.v( 67112c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn TAG, "Reporting drawn in " + wtoken); 67122c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn wtoken.appToken.windowsDrawn(); 67132c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } catch (RemoteException ex) { 67142c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 67152c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } break; 67162c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 67179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REPORT_APPLICATION_TOKEN_WINDOWS: { 67189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = (AppWindowToken)msg.obj; 67199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 67209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean nowVisible = msg.arg1 != 0; 67219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean nowGone = msg.arg2 != 0; 67229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 67239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 67248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.v( 67259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Reporting visible in " + wtoken 67269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " visible=" + nowVisible 67279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " gone=" + nowGone); 67289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nowVisible) { 67299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.appToken.windowsVisible(); 67309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 67319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.appToken.windowsGone(); 67329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 67349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 673606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 67379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WINDOW_FREEZE_TIMEOUT: { 67389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 67398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Window freeze timeout expired."); 67409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = mWindows.size(); 67419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i > 0) { 67429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 6743e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 67449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mOrientationChanging) { 67459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 67468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Force clearing orientation change: " + w); 67479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 67509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 67529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 675306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 67549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case HOLD_SCREEN_CHANGED: { 67559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Session oldHold; 67569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Session newHold; 67579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 67589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oldHold = mLastReportedHold; 67599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newHold = (Session)msg.obj; 67609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastReportedHold = newHold; 67619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 676206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 67639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldHold != newHold) { 67649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 67659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldHold != null) { 67669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mBatteryStats.noteStopWakelock(oldHold.mUid, -1, 67679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "window", 67689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStats.WAKE_TYPE_WINDOW); 67699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newHold != null) { 67719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mBatteryStats.noteStartWakelock(newHold.mUid, -1, 67729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "window", 67739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStats.WAKE_TYPE_WINDOW); 67749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 67769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 67799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 678006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 67819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case APP_TRANSITION_TIMEOUT: { 67829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 6783bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 67848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 67859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "*** APP TRANSITION TIMEOUT"); 67869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionReady = true; 67879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionTimeout = true; 67889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 67899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 67929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 679306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 67949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PERSIST_ANIMATION_SCALE: { 67959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.putFloat(mContext.getContentResolver(), 67969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.WINDOW_ANIMATION_SCALE, mWindowAnimationScale); 67979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.putFloat(mContext.getContentResolver(), 67989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.TRANSITION_ANIMATION_SCALE, mTransitionAnimationScale); 67999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 68009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 680106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 68029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FORCE_GC: { 68039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 68049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAnimationPending) { 68059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are animating, don't do the gc now but 68069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // delay a bit so we don't interrupt the animation. 68079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageDelayed(mH.obtainMessage(H.FORCE_GC), 68089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2000); 68099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 68109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are currently rotating the display, it will 68129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // schedule a new message when done. 68139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplayFrozen) { 68149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 68159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Runtime.getRuntime().gc(); 68189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 68199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 682006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 68219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ENABLE_SCREEN: { 68229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performEnableScreen(); 68239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 68249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 682506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 68269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case APP_FREEZE_TIMEOUT: { 68279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 68288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "App freeze timeout expired."); 68299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = mAppTokens.size(); 68309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i > 0) { 68319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 68329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken tok = mAppTokens.get(i); 68339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tok.freezingScreen) { 68348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Force clearing freeze: " + tok); 68359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsetAppFreezingScreenLocked(tok, true, true); 68369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 68409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 684106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6842e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn case SEND_NEW_CONFIGURATION: { 6843e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn removeMessages(SEND_NEW_CONFIGURATION); 6844e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn sendNewConfiguration(); 6845c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project break; 6846c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 684706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 68486e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev case REPORT_WINDOWS_CHANGE: { 6849dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev if (mWindowsChanged) { 6850dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev synchronized (mWindowMap) { 6851dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = false; 6852dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 6853dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev notifyWindowsChanged(); 6854dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 6855dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev break; 6856dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 6857dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev 6858a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate case DRAG_START_TIMEOUT: { 6859a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate IBinder win = (IBinder)msg.obj; 6860a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) { 6861a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.w(TAG, "Timeout starting drag by win " + win); 6862a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6863a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate synchronized (mWindowMap) { 6864a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // !!! TODO: ANR the app that has failed to start the drag in time 6865a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (mDragState != null) { 6866d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate mDragState.unregister(); 68672e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 6868a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState.reset(); 6869a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState = null; 6870a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6871a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6872d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate break; 6873a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6874a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 6875d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate case DRAG_END_TIMEOUT: { 6876d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate IBinder win = (IBinder)msg.obj; 6877d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate if (DEBUG_DRAG) { 6878d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate Slog.w(TAG, "Timeout ending drag to win " + win); 6879d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate } 6880d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate synchronized (mWindowMap) { 6881d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate // !!! TODO: ANR the drag-receiving app 6882d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate if (mDragState != null) { 6883d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate mDragState.mDragResult = false; 6884d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate mDragState.endDragLw(); 6885d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate } 6886d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate } 6887d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate break; 6888d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate } 68892992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 68902992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown case REPORT_HARD_KEYBOARD_STATUS_CHANGE: { 68912992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown notifyHardKeyboardStatusChange(); 68922992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown break; 68932992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 689438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn 689538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn case BOOT_TIMEOUT: { 689638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn performBootTimeout(); 689738e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn break; 689838e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } 689938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn 690038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn case WAITING_FOR_DRAWN_TIMEOUT: { 690138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn Pair<WindowState, IRemoteCallback> pair; 690238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn synchronized (mWindowMap) { 690338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn pair = (Pair<WindowState, IRemoteCallback>)msg.obj; 690438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn Slog.w(TAG, "Timeout waiting for drawn: " + pair.first); 690538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn if (!mWaitingForDrawn.remove(pair)) { 690638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn return; 690738e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } 690838e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } 690938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn try { 691038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn pair.second.sendResult(null); 691138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } catch (RemoteException e) { 691238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } 691338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn break; 691438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } 69159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 69199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 69209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IWindowManager API 69219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 69229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 69239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IWindowSession openSession(IInputMethodClient client, 69249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IInputContext inputContext) { 69259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (client == null) throw new IllegalArgumentException("null client"); 69269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (inputContext == null) throw new IllegalArgumentException("null inputContext"); 69276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Session session = new Session(this, client, inputContext); 692846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return session; 69299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 69319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean inputMethodClientHasFocus(IInputMethodClient client) { 69329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 69339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The focus for the client is the window immediately below 69349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // where we would place the input method window. 69359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int idx = findDesiredInputMethodWindowIndexLocked(false); 69369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState imFocus; 69379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (idx > 0) { 6938e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown imFocus = mWindows.get(idx-1); 6939e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //Log.i(TAG, "Desired input method target: " + imFocus); 6940e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //Log.i(TAG, "Current focus: " + this.mCurrentFocus); 6941e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //Log.i(TAG, "Last focus: " + this.mLastFocus); 69429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imFocus != null) { 6943e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // This may be a starting window, in which case we still want 6944e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // to count it as okay. 6945e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (imFocus.mAttrs.type == LayoutParams.TYPE_APPLICATION_STARTING 6946e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn && imFocus.mAppToken != null) { 6947e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // The client has definitely started, so it really should 6948e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // have a window in this app token. Let's look for it. 6949e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn for (int i=0; i<imFocus.mAppToken.windows.size(); i++) { 6950e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn WindowState w = imFocus.mAppToken.windows.get(i); 6951e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (w != imFocus) { 6952e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //Log.i(TAG, "Switching to real app window: " + w); 6953e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn imFocus = w; 6954e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn break; 6955e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 6956e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 6957e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 6958e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //Log.i(TAG, "IM target client: " + imFocus.mSession.mClient); 6959e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //if (imFocus.mSession.mClient != null) { 6960e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // Log.i(TAG, "IM target client binder: " + imFocus.mSession.mClient.asBinder()); 6961e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // Log.i(TAG, "Requesting client binder: " + client.asBinder()); 6962e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //} 69639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imFocus.mSession.mClient != null && 69649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imFocus.mSession.mClient.asBinder() == client.asBinder()) { 69659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 69669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6967e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn 6968e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // Okay, how about this... what is the current focus? 6969e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // It seems in some cases we may not have moved the IM 6970e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // target window, such as when it was in a pop-up window, 6971e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // so let's also look at the current focus. (An example: 6972e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // go to Gmail, start searching so the keyboard goes up, 6973e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // press home. Sometimes the IME won't go down.) 6974e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // Would be nice to fix this more correctly, but it's 6975e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // way at the end of a release, and this should be good enough. 6976e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (mCurrentFocus != null && mCurrentFocus.mSession.mClient != null && 6977e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn mCurrentFocus.mSession.mClient.asBinder() == client.asBinder()) { 6978e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn return true; 6979e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 69809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 69849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 698506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 698644bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn public void getDisplaySize(Point size) { 69871fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn synchronized(mDisplaySizeLock) { 698881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn size.x = mAppDisplayWidth; 698981e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn size.y = mAppDisplayHeight; 699044bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn } 699144bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn } 699244bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn 6993bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown public void getRealDisplaySize(Point size) { 69941fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn synchronized(mDisplaySizeLock) { 6995bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown size.x = mCurDisplayWidth; 6996bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown size.y = mCurDisplayHeight; 6997bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown } 69987d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 69997d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 70007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn public void getInitialDisplaySize(Point size) { 70011fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn synchronized(mDisplaySizeLock) { 70027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn size.x = mInitialDisplayWidth; 70037d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn size.y = mInitialDisplayHeight; 70047d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 7005bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown } 7006bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown 700744bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn public int getMaximumSizeDimension() { 70081fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn synchronized(mDisplaySizeLock) { 700944bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn // Do this based on the raw screen size, until we are smarter. 70107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn return mBaseDisplayWidth > mBaseDisplayHeight 70117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ? mBaseDisplayWidth : mBaseDisplayHeight; 70127916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 70137916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 70147916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 70157916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn public void setForcedDisplaySize(int longDimen, int shortDimen) { 70167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn synchronized(mWindowMap) { 70177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int width, height; 70187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mInitialDisplayWidth < mInitialDisplayHeight) { 70197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn width = shortDimen < mInitialDisplayWidth 70207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ? shortDimen : mInitialDisplayWidth; 70217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn height = longDimen < mInitialDisplayHeight 70227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ? longDimen : mInitialDisplayHeight; 70237916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else { 70247916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn width = longDimen < mInitialDisplayWidth 70257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ? longDimen : mInitialDisplayWidth; 70267916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn height = shortDimen < mInitialDisplayHeight 70277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ? shortDimen : mInitialDisplayHeight; 70287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 70297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn setForcedDisplaySizeLocked(width, height); 7030571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Settings.Secure.putString(mContext.getContentResolver(), 7031571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Settings.Secure.DISPLAY_SIZE_FORCED, width + "," + height); 70327916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 70337916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 70347916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 70357916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn private void rebuildBlackFrame(boolean inTransaction) { 70367916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (!inTransaction) { 703736991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 70387916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ">>> OPEN TRANSACTION rebuildBlackFrame"); 70397916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Surface.openTransaction(); 70407916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 70417916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn try { 70427916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mBlackFrame != null) { 70437916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBlackFrame.kill(); 70447916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBlackFrame = null; 70457916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 70467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mBaseDisplayWidth < mInitialDisplayWidth 70477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn || mBaseDisplayHeight < mInitialDisplayHeight) { 70488f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn int initW, initH, baseW, baseH; 70498f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn final boolean rotated = (mRotation == Surface.ROTATION_90 70508f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn || mRotation == Surface.ROTATION_270); 70518f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn if (rotated) { 70528f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn initW = mInitialDisplayHeight; 70538f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn initH = mInitialDisplayWidth; 70548f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn baseW = mBaseDisplayHeight; 70558f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn baseH = mBaseDisplayWidth; 70568f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn } else { 70578f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn initW = mInitialDisplayWidth; 70588f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn initH = mInitialDisplayHeight; 70598f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn baseW = mBaseDisplayWidth; 70608f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn baseH = mBaseDisplayHeight; 70618f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn } 70628f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn Rect outer = new Rect(0, 0, initW, initH); 70638f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn Rect inner = new Rect(0, 0, baseW, baseH); 70647916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn try { 70657916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBlackFrame = new BlackFrame(mFxSession, outer, inner, MASK_LAYER); 70667916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } catch (Surface.OutOfResourcesException e) { 70677916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 70687916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 70697916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } finally { 70707916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (!inTransaction) { 70717916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Surface.closeTransaction(); 707236991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 70737916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn "<<< CLOSE TRANSACTION rebuildBlackFrame"); 70747916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 70757916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 70767916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 70777916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 7078571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato private void readForcedDisplaySizeLocked() { 7079571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato final String str = Settings.Secure.getString(mContext.getContentResolver(), 7080571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Settings.Secure.DISPLAY_SIZE_FORCED); 7081571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato if (str == null || str.length() == 0) { 7082571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato return; 7083571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } 7084571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato final int pos = str.indexOf(','); 7085571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato if (pos <= 0 || str.lastIndexOf(',') != pos) { 7086571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato return; 7087571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } 7088571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato int width, height; 7089571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato try { 7090571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato width = Integer.parseInt(str.substring(0, pos)); 7091571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato height = Integer.parseInt(str.substring(pos+1)); 7092571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } catch (NumberFormatException ex) { 7093571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato return; 7094571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } 7095571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato setForcedDisplaySizeLocked(width, height); 7096571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } 7097571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato 70987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn private void setForcedDisplaySizeLocked(int width, int height) { 7099571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Slog.i(TAG, "Using new display size: " + width + "x" + height); 7100571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato 71011fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn synchronized(mDisplaySizeLock) { 71021fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn mBaseDisplayWidth = width; 71031fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn mBaseDisplayHeight = height; 71041fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn } 71057916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mPolicy.setInitialDisplaySize(mBaseDisplayWidth, mBaseDisplayHeight); 71067916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 71077916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mLayoutNeeded = true; 71087916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 71097916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn boolean configChanged = updateOrientationFromAppTokensLocked(false); 71107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mTempConfiguration.setToDefaults(); 71117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mTempConfiguration.fontScale = mCurConfiguration.fontScale; 71127916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (computeNewConfigurationLocked(mTempConfiguration)) { 71137916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mCurConfiguration.diff(mTempConfiguration) != 0) { 71147916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn configChanged = true; 71157916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 71167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 71177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 71187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (configChanged) { 71197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mWaitingForConfig = true; 71207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn startFreezingDisplayLocked(false); 71217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 71227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 71237916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 71247916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn rebuildBlackFrame(false); 71257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 71267916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn performLayoutAndPlaceSurfacesLocked(); 71277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 71287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 71297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn public void clearForcedDisplaySize() { 71307916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn synchronized(mWindowMap) { 71317916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn setForcedDisplaySizeLocked(mInitialDisplayWidth, mInitialDisplayHeight); 7132571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Settings.Secure.putString(mContext.getContentResolver(), 7133571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Settings.Secure.DISPLAY_SIZE_FORCED, ""); 713444bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn } 713544bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn } 713644bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn 713781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn public boolean canStatusBarHide() { 713881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn return mPolicy.canStatusBarHide(); 713981e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn } 714081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn 71419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 71429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Internals 71439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 71449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7145e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn final WindowState windowForClientLocked(Session session, IWindow client, 7146e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean throwOnError) { 7147e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return windowForClientLocked(session, client.asBinder(), throwOnError); 71489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 714906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7150e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn final WindowState windowForClientLocked(Session session, IBinder client, 7151e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean throwOnError) { 71529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = mWindowMap.get(client); 71538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 71549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Looking up client " + client + ": " + win); 71559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == null) { 7156e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn RuntimeException ex = new IllegalArgumentException( 7157e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn "Requested window " + client + " does not exist"); 7158e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (throwOnError) { 7159e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn throw ex; 7160e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 71618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Failed looking up window", ex); 71629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 71639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (session != null && win.mSession != session) { 7165e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn RuntimeException ex = new IllegalArgumentException( 7166e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn "Requested window " + client + " is in session " + 7167e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn win.mSession + ", not " + session); 7168e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (throwOnError) { 7169e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn throw ex; 7170e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 71718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Failed looking up window", ex); 71729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 71739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 71759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return win; 71769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7178a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn final void rebuildAppWindowListLocked() { 7179a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn int NW = mWindows.size(); 7180a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn int i; 71813b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int lastWallpaper = -1; 71829bfb707597898f54722460b48588007b682f3e2aDianne Hackborn int numRemoved = 0; 7183ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 7184f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (mRebuildTmp.length < NW) { 7185f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn mRebuildTmp = new WindowState[NW+10]; 7186f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 7187f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn 7188a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // First remove all existing app windows. 7189a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn i=0; 7190a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn while (i < NW) { 7191e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 71923b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (w.mAppToken != null) { 7193e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState win = mWindows.remove(i); 7194f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn win.mRebuilding = true; 7195f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn mRebuildTmp[numRemoved] = win; 7196dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 71978a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, 7198bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn "Rebuild removing window: " + win); 7199a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn NW--; 72009bfb707597898f54722460b48588007b682f3e2aDianne Hackborn numRemoved++; 7201a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn continue; 72023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER 72033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn && lastWallpaper == i-1) { 72043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn lastWallpaper = i; 7205a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 7206a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn i++; 7207a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 7208ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 72093b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // The wallpaper window(s) typically live at the bottom of the stack, 72103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // so skip them before adding app tokens. 72113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn lastWallpaper++; 72123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn i = lastWallpaper; 7213ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 7214bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn // First add all of the exiting app tokens... these are no longer 7215bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn // in the main app list, but still have windows shown. We put them 7216bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn // in the back because now that the animation is over we no longer 7217bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn // will care about them. 7218bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn int NT = mExitingAppTokens.size(); 7219a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn for (int j=0; j<NT; j++) { 7220bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn i = reAddAppWindowsLocked(i, mExitingAppTokens.get(j)); 7221bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn } 7222ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 7223bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn // And add in the still active app tokens in Z order. 7224bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn NT = mAppTokens.size(); 7225bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn for (int j=0; j<NT; j++) { 7226bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn i = reAddAppWindowsLocked(i, mAppTokens.get(j)); 7227a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 7228ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 72293b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn i -= lastWallpaper; 72309bfb707597898f54722460b48588007b682f3e2aDianne Hackborn if (i != numRemoved) { 72318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Rebuild removed " + numRemoved 72329bfb707597898f54722460b48588007b682f3e2aDianne Hackborn + " windows but added " + i); 7233f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn for (i=0; i<numRemoved; i++) { 7234f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn WindowState ws = mRebuildTmp[i]; 7235f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (ws.mRebuilding) { 7236f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn StringWriter sw = new StringWriter(); 7237f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn PrintWriter pw = new PrintWriter(sw); 7238a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn ws.dump(pw, "", true); 7239f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn pw.flush(); 7240f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.w(TAG, "This window was lost: " + ws); 7241f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.w(TAG, sw.toString()); 7242f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 7243f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 7244f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.w(TAG, "Current app token list:"); 7245f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn dumpAppTokensLocked(); 7246f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.w(TAG, "Final window list:"); 7247f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn dumpWindowsLocked(); 72489bfb707597898f54722460b48588007b682f3e2aDianne Hackborn } 7249a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 7250ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 72519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final void assignLayersLocked() { 72529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = mWindows.size(); 72539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int curBaseLayer = 0; 72549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int curLayer = 0; 72559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 725606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 72576c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (DEBUG_LAYERS) { 72586c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn RuntimeException here = new RuntimeException("here"); 72596c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn here.fillInStackTrace(); 72603ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn Slog.v(TAG, "Assigning layers", here); 72616c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 72626c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 72639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 7264e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 72657341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (w.mBaseLayer == curBaseLayer || w.mIsImWindow 72667341d7a104b47996445d069a695e155a07184606Dianne Hackborn || (i > 0 && w.mIsWallpaper)) { 72679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curLayer += WINDOW_LAYER_MULTIPLIER; 72689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLayer = curLayer; 72699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 72709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curBaseLayer = curLayer = w.mBaseLayer; 72719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLayer = curLayer; 72729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 72739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mTargetAppToken != null) { 72749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAnimLayer = w.mLayer + w.mTargetAppToken.animLayerAdjustment; 72759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (w.mAppToken != null) { 72769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAnimLayer = w.mLayer + w.mAppToken.animLayerAdjustment; 72779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 72789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAnimLayer = w.mLayer; 72799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 72809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mIsImWindow) { 72819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAnimLayer += mInputMethodAnimLayerAdjustment; 7282759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } else if (w.mIsWallpaper) { 7283759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn w.mAnimLayer += mWallpaperAnimLayerAdjustment; 72849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 72858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS) Slog.v(TAG, "Assign layer " + w + ": " 72869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + w.mAnimLayer); 72879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //System.out.println( 72889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // "Assigned layer " + curLayer + " to " + w.mClient.asBinder()); 72899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 72909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 72919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 72929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mInLayout = false; 72939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final void performLayoutAndPlaceSurfacesLocked() { 72949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInLayout) { 7295cfe6524071624b6679e5fa4db847328e8d0317c8Dave Bort if (DEBUG) { 72969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Recursive call!"); 72979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 72988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout"); 72999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 73009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7302e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (mWaitingForConfig) { 7303e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // Our configuration has changed (most likely rotation), but we 7304e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // don't yet have the complete configuration to report to 7305e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // applications. Don't do any window layout until we have it. 7306e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return; 7307e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 7308e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 7309ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn if (mDisplay == null) { 7310ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn // Not yet initialized, nothing to do. 7311ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn return; 7312ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 7313ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 73142e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn mInLayout = true; 73159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean recoveringMemory = false; 73162e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn 73172e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn try { 73182e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn if (mForceRemoves != null) { 73192e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn recoveringMemory = true; 7320f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn // Wait a little bit for things to settle down, and off we go. 73212e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn for (int i=0; i<mForceRemoves.size(); i++) { 73222e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn WindowState ws = mForceRemoves.get(i); 73232e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn Slog.i(TAG, "Force removing: " + ws); 73242e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn removeWindowInnerLocked(ws.mSession, ws); 73252e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn } 73262e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn mForceRemoves = null; 73272e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn Slog.w(TAG, "Due to memory failure, waiting a bit for next layout"); 73282e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn Object tmp = new Object(); 73292e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn synchronized (tmp) { 73302e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn try { 73312e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn tmp.wait(250); 73322e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn } catch (InterruptedException e) { 73332e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn } 73349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73362e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn } catch (RuntimeException e) { 73378962028b6e2f4176e6ceded281e584d223e44982Dianne Hackborn Log.wtf(TAG, "Unhandled exception while force removing for memory", e); 73389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73392e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn 73409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 73419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLockedInner(recoveringMemory); 734206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7343f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn int N = mPendingRemove.size(); 7344f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (N > 0) { 7345f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (mPendingRemoveTmp.length < N) { 7346f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn mPendingRemoveTmp = new WindowState[N+10]; 73479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7348f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn mPendingRemove.toArray(mPendingRemoveTmp); 73499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPendingRemove.clear(); 7350f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn for (int i=0; i<N; i++) { 7351f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn WindowState w = mPendingRemoveTmp[i]; 7352f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn removeWindowInnerLocked(w.mSession, w); 7353f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 73549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInLayout = false; 73569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayersLocked(); 73579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 73589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 73599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 73619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInLayout = false; 73629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLayoutNeeded) { 73639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestAnimationLocked(0); 73649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7366dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev if (mWindowsChanged && !mWindowChangeListeners.isEmpty()) { 73676e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev mH.removeMessages(H.REPORT_WINDOWS_CHANGE); 73686e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev mH.sendMessage(mH.obtainMessage(H.REPORT_WINDOWS_CHANGE)); 7369dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 73709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 73719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInLayout = false; 73728962028b6e2f4176e6ceded281e584d223e44982Dianne Hackborn Log.wtf(TAG, "Unhandled exception while laying out windows", e); 73739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73763a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown private final int performLayoutLockedInner(boolean initial, boolean updateInputWindows) { 7377b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!mLayoutNeeded) { 7378b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn return 0; 7379b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7380b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 7381b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutNeeded = false; 7382b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 738344bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn final int dw = mCurDisplayWidth; 738444bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn final int dh = mCurDisplayHeight; 73859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7386df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn final int NFW = mFakeWindows.size(); 7387df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn for (int i=0; i<NFW; i++) { 7388df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mFakeWindows.get(i).layout(dw, dh); 7389df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 7390df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 73919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mWindows.size(); 73929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 73939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73948a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYOUT) Slog.v(TAG, "performLayout: needed=" 73959b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn + mLayoutNeeded + " dw=" + dw + " dh=" + dh); 73969b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn 73971f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn mPolicy.beginLayoutLw(dw, dh, mRotation); 739806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7399b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn int seq = mLayoutSeq+1; 7400b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (seq < 0) seq = 0; 7401b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutSeq = seq; 7402b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 7403b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // First perform layout of any root windows (not attached 7404b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // to another window). 7405b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn int topAttached = -1; 7406b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn for (i = N-1; i >= 0; i--) { 7407e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState win = mWindows.get(i); 7408b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 7409b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // Don't do layout of a window if it is not visible, or 7410b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // soon won't be visible, to avoid wasting time and funky 7411b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // changes while a window is animating away. 7412b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn final AppWindowToken atoken = win.mAppToken; 7413b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn final boolean gone = win.mViewVisibility == View.GONE 7414b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn || !win.mRelayoutCalled 7415ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn || (atoken == null && win.mRootToken.hidden) 7416b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn || (atoken != null && atoken.hiddenRequested) 7417b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn || win.mAttachedHidden 7418b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn || win.mExiting || win.mDestroying; 7419b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 74201c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn if (DEBUG_LAYOUT && !win.mLayoutAttached) { 74211c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn Slog.v(TAG, "First pass " + win 7422b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame 7423b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + " mLayoutAttached=" + win.mLayoutAttached); 74241c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn if (gone) Slog.v(TAG, " (mViewVisibility=" 7425b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mViewVisibility + " mRelayoutCalled=" 7426b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mRelayoutCalled + " hidden=" 7427b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mRootToken.hidden + " hiddenRequested=" 7428b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + (atoken != null && atoken.hiddenRequested) 7429b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + " mAttachedHidden=" + win.mAttachedHidden); 7430b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7431e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 7432b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // If this view is GONE, then skip it -- keep the current 7433b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // frame, and let the caller know so they can ignore it 7434b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // if they want. (We do the normal layout for INVISIBLE 7435b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // windows, since that means "perform layout as normal, 7436b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // just don't display"). 7437b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!gone || !win.mHaveFrame) { 7438e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (!win.mLayoutAttached) { 74398e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn if (initial) { 74400f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial"); 74418e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn win.mContentChanged = false; 74428e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn } 7443e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn win.prelayout(); 7444b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mPolicy.layoutWindowLw(win, win.mAttrs, null); 7445b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn win.mLayoutSeq = seq; 7446b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame=" 7447b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mFrame + " mContainingFrame=" 7448b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mContainingFrame + " mDisplayFrame=" 7449b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mDisplayFrame); 7450b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } else { 7451b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (topAttached < 0) topAttached = i; 74529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7454b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 745506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7456b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // Now perform layout of attached windows, which usually 7457b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // depend on the position of the window they are attached to. 7458b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // XXX does not deal with windows that are attached to windows 7459b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // that are themselves attached. 7460b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn for (i = topAttached; i >= 0; i--) { 7461e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState win = mWindows.get(i); 74629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7463b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (win.mLayoutAttached) { 7464b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_LAYOUT) Slog.v(TAG, "Second pass " + win 7465b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + " mHaveFrame=" + win.mHaveFrame 7466b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + " mViewVisibility=" + win.mViewVisibility 7467b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + " mRelayoutCalled=" + win.mRelayoutCalled); 74681c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn // If this view is GONE, then skip it -- keep the current 74691c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn // frame, and let the caller know so they can ignore it 74701c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn // if they want. (We do the normal layout for INVISIBLE 74711c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn // windows, since that means "perform layout as normal, 74721c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn // just don't display"). 7473b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((win.mViewVisibility != View.GONE && win.mRelayoutCalled) 7474b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn || !win.mHaveFrame) { 74758e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn if (initial) { 74760f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial"); 74778e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn win.mContentChanged = false; 74788e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn } 7479e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn win.prelayout(); 7480b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mPolicy.layoutWindowLw(win, win.mAttrs, win.mAttachedWindow); 7481b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn win.mLayoutSeq = seq; 7482b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame=" 7483b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mFrame + " mContainingFrame=" 7484b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mContainingFrame + " mDisplayFrame=" 7485b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mDisplayFrame); 74869bfb707597898f54722460b48588007b682f3e2aDianne Hackborn } 7487958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn } 74889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7489349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 7490349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // Window frames may have changed. Tell the input dispatcher about it. 74913a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 74923a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown if (updateInputWindows) { 74932e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 74943a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown } 7495b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 7496b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn return mPolicy.finishLayoutLw(); 74979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 74993ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn void makeWindowFreezingScreenIfNeededLocked(WindowState w) { 75003ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn // If the screen is currently frozen or off, then keep 75013ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn // it frozen/off until this window draws at its new 75023ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn // orientation. 75033ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn if (mDisplayFrozen || !mPolicy.isScreenOnFully()) { 75043ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, 75053ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn "Changing surface while display frozen: " + w); 75063ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn w.mOrientationChanging = true; 75073ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn if (!mWindowsFreezingScreen) { 75083ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn mWindowsFreezingScreen = true; 75093ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn // XXX should probably keep timeout from 75103ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn // when we first froze the display. 75113ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT); 75123ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn mH.sendMessageDelayed(mH.obtainMessage( 75133ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn H.WINDOW_FREEZE_TIMEOUT), 2000); 75143ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn } 75153ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn } 75163ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn } 75173ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn 75186804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // "Something has changed! Let's make it correct now." 75199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final void performLayoutAndPlaceSurfacesLockedInner( 75209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean recoveringMemory) { 752134bcebca707187393263183aa4dab32728763f2fJoe Onorato if (mDisplay == null) { 752234bcebca707187393263183aa4dab32728763f2fJoe Onorato Slog.i(TAG, "skipping performLayoutAndPlaceSurfacesLockedInner with no mDisplay"); 752334bcebca707187393263183aa4dab32728763f2fJoe Onorato return; 752434bcebca707187393263183aa4dab32728763f2fJoe Onorato } 752534bcebca707187393263183aa4dab32728763f2fJoe Onorato 75269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long currentTime = SystemClock.uptimeMillis(); 7527dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn final int dw = mCurDisplayWidth; 7528dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn final int dh = mCurDisplayHeight; 752981e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int innerDw = mAppDisplayWidth; 753081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int innerDh = mAppDisplayHeight; 7531e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 75329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 75339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7534b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (mFocusMayChange) { 7535b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn mFocusMayChange = false; 75363a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 75373a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 7538b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn } 7539b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn 75409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Initialize state of exiting tokens. 75419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=mExitingTokens.size()-1; i>=0; i--) { 75429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingTokens.get(i).hasVisible = false; 75439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 75449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 75459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Initialize state of exiting applications. 75469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=mExitingAppTokens.size()-1; i>=0; i--) { 75479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingAppTokens.get(i).hasVisible = false; 75489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 75499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 75509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean orientationChangeComplete = true; 75519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Session holdScreen = null; 75529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float screenBrightness = -1; 7553fb73f79340375013225618a5d87f46b958f698efMike Lockwood float buttonBrightness = -1; 75549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean focusDisplayed = false; 75559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean animating = false; 7556fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn boolean createWatermark = false; 755789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn boolean updateRotation = false; 755850660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn boolean screenRotationFinished = false; 7559fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 7560fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn if (mFxSession == null) { 7561fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn mFxSession = new SurfaceSession(); 7562fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn createWatermark = true; 7563fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 7564fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 756536991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 756636991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn ">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces"); 75679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 75689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface.openTransaction(); 7569fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 7570fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn if (createWatermark) { 7571fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn createWatermark(); 7572fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 7573fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn if (mWatermark != null) { 7574fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn mWatermark.positionSurface(dw, dh); 7575fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 75766804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick if (mStrictModeFlash != null) { 75776804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick mStrictModeFlash.positionSurface(dw, dh); 75786804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 7579fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 75809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7581de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn boolean wallpaperForceHidingChanged = false; 7582b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn int repeats = 0; 7583b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn int changes = 0; 7584b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 75859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 7586b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn repeats++; 7587b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (repeats > 6) { 7588b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.w(TAG, "Animation repeat aborted after too many iterations"); 7589b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutNeeded = false; 7590b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn break; 7591b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7592b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 7593b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((changes&(WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER 7594b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG 7595b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn | WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT)) != 0) { 7596b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) { 7597b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((adjustWallpaperWindowsLocked()&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) { 7598b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn assignLayersLocked(); 7599b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutNeeded = true; 7600b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7601b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7602b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG) != 0) { 7603b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_LAYOUT) Slog.v(TAG, "Computing new config from layout"); 760494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (updateOrientationFromAppTokensLocked(true)) { 7605b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutNeeded = true; 7606b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 7607b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7608b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7609b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT) != 0) { 7610b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutNeeded = true; 7611b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7612b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7613b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 7614b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // FIRST LOOP: Perform a layout, if needed. 7615b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (repeats < 4) { 76163a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown changes = performLayoutLockedInner(repeats == 0, false /*updateInputWindows*/); 7617b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (changes != 0) { 7618b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn continue; 7619b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7620b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } else { 7621b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.w(TAG, "Layout repeat skipped after too many iterations"); 7622b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes = 0; 7623b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7624b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 76259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int transactionSequence = ++mTransactionSequence; 76269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 76279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Update animations of all applications, including those 76289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // associated with exiting/removed apps 76299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean tokensAnimating = false; 76309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NAT = mAppTokens.size(); 76319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NAT; i++) { 7632e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (mAppTokens.get(i).stepAnimationLocked(currentTime, 7633e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn innerDw, innerDh)) { 76349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokensAnimating = true; 76359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 76369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 76379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NEAT = mExitingAppTokens.size(); 76389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NEAT; i++) { 7639e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (mExitingAppTokens.get(i).stepAnimationLocked(currentTime, 7640e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn innerDw, innerDh)) { 76419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokensAnimating = true; 76429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 76439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 76449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7645b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // SECOND LOOP: Execute animations and update visibility of windows. 7646b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 76478a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: seq=" 7648de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn + transactionSequence + " tokensAnimating=" 7649de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn + tokensAnimating); 7650de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn 76519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animating = tokensAnimating; 76529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7653f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (mScreenRotationAnimation != null) { 7654f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (mScreenRotationAnimation.isAnimating()) { 7655f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (mScreenRotationAnimation.stepAnimation(currentTime)) { 7656f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn animating = true; 7657f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } else { 765850660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn screenRotationFinished = true; 765989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn updateRotation = true; 7660f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 7661f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 7662f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 7663f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn 76649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean tokenMayBeDrawn = false; 76656c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn boolean wallpaperMayChange = false; 7666b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn boolean forceHiding = false; 76676c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn WindowState windowDetachedWallpaper = null; 7668de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn WindowState windowAnimationBackground = null; 7669de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn int windowAnimationBackgroundColor = 0; 76709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 76719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.beginAnimationLw(dw, dh); 76729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7673bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn final int N = mWindows.size(); 7674ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 76759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=N-1; i>=0; i--) { 7676e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 76779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 76789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowManager.LayoutParams attrs = w.mAttrs; 76799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 76809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 76818e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // Take care of the window being ready to display. 76826c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn if (w.commitFinishDrawingLocked(currentTime)) { 76836c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn if ((w.mAttrs.flags 76846c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) { 76858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 76860586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn "First draw done in potential wallpaper target " + w); 76876c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn wallpaperMayChange = true; 76886c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn } 76896c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn } 7690ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 76916c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn final boolean wasAnimating = w.mAnimating; 76928e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn 7693e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn int animDw = innerDw; 7694e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn int animDh = innerDh; 76958e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn 76968e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // If the window has moved due to its containing 76978e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // content frame changing, then we'd like to animate 76988e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // it. The checks here are ordered by what is least 76993fe7f2f2e35692fe563ae00f62995030f1987c4fJoe Onorato // likely to be true first. 77001c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn if (w.shouldAnimateMove()) { 77018e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // Frame has moved, containing content frame 77028e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // has also moved, and we're not currently animating... 77038e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // let's do something. 77048e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn Animation a = AnimationUtils.loadAnimation(mContext, 77058e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn com.android.internal.R.anim.window_move_from_decor); 77068e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn w.setAnimation(a); 77078e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn animDw = w.mLastFrame.left - w.mFrame.left; 77088e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn animDh = w.mLastFrame.top - w.mFrame.top; 77098e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn } 77108e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn 77118e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // Execute animation. 77128e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn final boolean nowAnimating = w.stepAnimationLocked(currentTime, 77138e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn animDw, animDh); 77146c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 77156c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // If this window is animating, make a note that we have 77166c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // an animating window and take care of a request to run 77176c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // a detached wallpaper animation. 77186c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (nowAnimating) { 7719de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (w.mAnimation != null) { 77206d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if ((w.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0 77216d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn && w.mAnimation.getDetachWallpaper()) { 7722de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowDetachedWallpaper = w; 7723de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 7724de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (w.mAnimation.getBackgroundColor() != 0) { 7725d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn if (windowAnimationBackground == null || w.mAnimLayer < 7726d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn windowAnimationBackground.mAnimLayer) { 7727d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn windowAnimationBackground = w; 7728d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn windowAnimationBackgroundColor = 7729d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn w.mAnimation.getBackgroundColor(); 7730d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn } 7731de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 77326c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 77339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animating = true; 77349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 77356c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 77366c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // If this window's app token is running a detached wallpaper 77376c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // animation, make a note so we can ensure the wallpaper is 77386c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // displayed behind it. 7739d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn if (w.mAppToken != null && w.mAppToken.animation != null 7740d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn && w.mAppToken.animating) { 77416d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if ((w.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0 77426d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn && w.mAppToken.animation.getDetachWallpaper()) { 7743de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowDetachedWallpaper = w; 7744de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 7745de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (w.mAppToken.animation.getBackgroundColor() != 0) { 7746d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn if (windowAnimationBackground == null || w.mAnimLayer < 7747d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn windowAnimationBackground.mAnimLayer) { 7748d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn windowAnimationBackground = w; 7749d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn windowAnimationBackgroundColor = 7750d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn w.mAppToken.animation.getBackgroundColor(); 7751d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn } 7752de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 77536c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 77546c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 77556136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn if (wasAnimating && !w.mAnimating && mWallpaperTarget == w) { 77566136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn wallpaperMayChange = true; 77576136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn } 7758ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 77593b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (mPolicy.doesForceHide(w, attrs)) { 77606c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (!wasAnimating && nowAnimating) { 776120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (DEBUG_VISIBILITY) Slog.v(TAG, 77626c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn "Animation started that could impact force hide: " 776320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn + w); 77643b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn wallpaperForceHidingChanged = true; 7765b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn mFocusMayChange = true; 77663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (w.isReadyForDisplay() && w.mAnimation == null) { 77673b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn forceHiding = true; 77683b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 77693b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (mPolicy.canBeForceHidden(w, attrs)) { 77703b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn boolean changed; 77713b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (forceHiding) { 77723b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn changed = w.hideLw(false, false); 777320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (DEBUG_VISIBILITY && changed) Slog.v(TAG, 777420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn "Now policy hidden: " + w); 77753b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else { 77763b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn changed = w.showLw(false, false); 777720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (DEBUG_VISIBILITY && changed) Slog.v(TAG, 777820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn "Now policy shown: " + w); 777920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (changed) { 778020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (wallpaperForceHidingChanged 7781b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn && w.isVisibleNow() /*w.isReadyForDisplay()*/) { 778220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // Assume we will need to animate. If 778320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // we don't (because the wallpaper will 778420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // stay with the lock screen), then we will 778520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // clean up later. 778620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn Animation a = mPolicy.createForceHideEnterAnimation(); 778720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (a != null) { 778820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn w.setAnimation(a); 778920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } 779020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } 779120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (mCurrentFocus == null || 779220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn mCurrentFocus.mLayer < w.mLayer) { 779320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // We are showing on to of the current 779420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // focus, so re-evaluate focus to make 779520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // sure it is correct. 779620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn mFocusMayChange = true; 77973b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 77983b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 77993b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 78003b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (changed && (attrs.flags 78013b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) { 78023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn wallpaperMayChange = true; 78033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 78043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 7805ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 78069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.animatingWindowLw(w, attrs); 78079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 78099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken atoken = w.mAppToken; 78109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null && (!atoken.allDrawn || atoken.freezingScreen)) { 78119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken.lastTransactionSequence != transactionSequence) { 78129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.lastTransactionSequence = transactionSequence; 78139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.numInterestingWindows = atoken.numDrawnWindows = 0; 78149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.startingDisplayed = false; 78159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((w.isOnScreen() || w.mAttrs.type 78179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == WindowManager.LayoutParams.TYPE_BASE_APPLICATION) 78189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !w.mExiting && !w.mDestroying) { 78199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) { 78208a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Eval win " + w + ": isDrawn=" 78217433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn + w.isDrawnLw() 78229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", isAnimating=" + w.isAnimating()); 78237433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn if (!w.isDrawnLw()) { 78248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Not displayed: s=" + w.mSurface 78259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " pv=" + w.mPolicyVisibility 78269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " dp=" + w.mDrawPending 78279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " cdp=" + w.mCommitDrawPending 78289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " ah=" + w.mAttachedHidden 78299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " th=" + atoken.hiddenRequested 78309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " a=" + w.mAnimating); 78319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w != atoken.startingWindow) { 78349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!atoken.freezingScreen || !w.mAppFreezing) { 78359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.numInterestingWindows++; 78367433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn if (w.isDrawnLw()) { 78379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.numDrawnWindows++; 78388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) Slog.v(TAG, 78399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "tokenMayBeDrawn: " + atoken 78409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " freezingScreen=" + atoken.freezingScreen 78419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAppFreezing=" + w.mAppFreezing); 78429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokenMayBeDrawn = true; 78439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78457433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn } else if (w.isDrawnLw()) { 78469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.startingDisplayed = true; 78479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (w.mReadyToShow) { 78509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.performShowLocked(); 78519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7854b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= mPolicy.finishAnimationLw(); 78559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 78569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tokenMayBeDrawn) { 78579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // See if any windows have been drawn, so they (and others 78589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // associated with them) can now be shown. 7859f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn final int NT = mAppTokens.size(); 78609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NT; i++) { 7861f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn AppWindowToken wtoken = mAppTokens.get(i); 78629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.freezingScreen) { 78639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numInteresting = wtoken.numInterestingWindows; 78649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) { 78658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.v(TAG, 78669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "allDrawn: " + wtoken 78679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " interesting=" + numInteresting 78689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " drawn=" + wtoken.numDrawnWindows); 78699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.showAllWindowsLocked(); 78709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsetAppFreezingScreenLocked(wtoken, false, true); 78713ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn if (DEBUG_ORIENTATION) Slog.i(TAG, 78723ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn "Setting orientationChangeComplete=true because wtoken " 78733ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn + wtoken + " numInteresting=" + numInteresting 78743ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn + " numDrawn=" + wtoken.numDrawnWindows); 78759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project orientationChangeComplete = true; 78769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (!wtoken.allDrawn) { 78789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numInteresting = wtoken.numInterestingWindows; 78799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) { 78808a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.v(TAG, 78819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "allDrawn: " + wtoken 78829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " interesting=" + numInteresting 78839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " drawn=" + wtoken.numDrawnWindows); 78849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.allDrawn = true; 7885b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM; 78869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 78879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We can now show all of the drawn windows! 78889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mOpeningApps.contains(wtoken)) { 78899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.showAllWindowsLocked(); 78909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 78969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are ready to perform an app transition, check through 78979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // all of the app tokens to be shown and see if they are ready 78989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to go. 78999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAppTransitionReady) { 79009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NN = mOpeningApps.size(); 79019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean goodToGo = true; 79028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 79039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Checking " + NN + " opening apps (frozen=" 79049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mDisplayFrozen + " timeout=" 79059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mAppTransitionTimeout + ")..."); 79069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mDisplayFrozen && !mAppTransitionTimeout) { 79079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the display isn't frozen, wait to do anything until 79089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // all of the apps are ready. Otherwise just go because 79099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we'll unfreeze the display when everyone is ready. 79109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NN && goodToGo; i++) { 79119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mOpeningApps.get(i); 79128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 79139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Check opening app" + wtoken + ": allDrawn=" 79149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.allDrawn + " startingDisplayed=" 79159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.startingDisplayed); 79169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!wtoken.allDrawn && !wtoken.startingDisplayed 79179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !wtoken.startingMoved) { 79189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goodToGo = false; 79199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 79209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 79219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 79229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (goodToGo) { 79238a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO"); 79249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transit = mNextAppTransition; 79259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSkipAppTransitionAnimation) { 7926bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn transit = WindowManagerPolicy.TRANSIT_UNSET; 79279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7928bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET; 79299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionReady = false; 7930a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mAppTransitionRunning = true; 79319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionTimeout = false; 79329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartingIconInTransition = false; 79339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSkipAppTransitionAnimation = false; 79349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 79359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.APP_TRANSITION_TIMEOUT); 79369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7937a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // If there are applications waiting to come to the 7938a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // top of the stack, now is the time to move their windows. 7939a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // (Note that we don't do apps going to the bottom 7940a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // here -- we want to keep their windows in the old 7941a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // Z-order until the animation completes.) 7942a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (mToTopApps.size() > 0) { 7943a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn NN = mAppTokens.size(); 7944a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn for (i=0; i<NN; i++) { 7945a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn AppWindowToken wtoken = mAppTokens.get(i); 7946a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (wtoken.sendingToTop) { 7947a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.sendingToTop = false; 7948a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn moveAppWindowsLocked(wtoken, NN, false); 7949a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 7950a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 7951a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToTopApps.clear(); 7952a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 7953ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 795425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn WindowState oldWallpaper = mWallpaperTarget; 7955ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 79563be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn adjustWallpaperWindowsLocked(); 79576c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn wallpaperMayChange = false; 7958ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 7959bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // The top-most window will supply the layout params, 7960bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // and we will determine it below. 7961bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn LayoutParams animLp = null; 7962bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn int bestAnimLayer = -1; 796308121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn boolean fullscreenAnim = false; 7964ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 79658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 79663be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn "New wallpaper target=" + mWallpaperTarget 79673be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + ", lower target=" + mLowerWallpaperTarget 79683be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + ", upper target=" + mUpperWallpaperTarget); 796925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn int foundWallpapers = 0; 7970bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // Do a first pass through the tokens for two 7971bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // things: 7972bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // (1) Determine if both the closing and opening 7973bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // app token sets are wallpaper targets, in which 7974bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // case special animations are needed 7975bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // (since the wallpaper needs to stay static 7976bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // behind them). 7977bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // (2) Find the layout params of the top-most 7978bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // application window in the tokens, which is 7979bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // what will control the animation theme. 7980bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn final int NC = mClosingApps.size(); 7981bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn NN = NC + mOpeningApps.size(); 7982bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn for (i=0; i<NN; i++) { 7983bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn AppWindowToken wtoken; 7984bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn int mode; 7985bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (i < NC) { 7986bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn wtoken = mClosingApps.get(i); 7987bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn mode = 1; 7988bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn } else { 7989bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn wtoken = mOpeningApps.get(i-NC); 7990bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn mode = 2; 7991f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 7992bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (mLowerWallpaperTarget != null) { 7993bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (mLowerWallpaperTarget.mAppToken == wtoken 7994bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn || mUpperWallpaperTarget.mAppToken == wtoken) { 7995bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn foundWallpapers |= mode; 7996f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 7997bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn } 7998bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (wtoken.appFullscreen) { 7999bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn WindowState ws = wtoken.findMainWindow(); 8000bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (ws != null) { 8001ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn animLp = ws.mAttrs; 8002ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn bestAnimLayer = ws.mLayer; 800308121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn fullscreenAnim = true; 800408121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn } 800508121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn } else if (!fullscreenAnim) { 800608121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn WindowState ws = wtoken.findMainWindow(); 800708121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn if (ws != null) { 800808121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn if (ws.mLayer > bestAnimLayer) { 8009bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn animLp = ws.mAttrs; 8010bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn bestAnimLayer = ws.mLayer; 8011bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn } 8012f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 8013f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 801425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn } 8015ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 801625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn if (foundWallpapers == 3) { 80178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 801825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn "Wallpaper animation!"); 801925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn switch (transit) { 802025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN: 802125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_TASK_OPEN: 802225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT: 802325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN; 802425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn break; 802525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE: 802625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_TASK_CLOSE: 802725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_TASK_TO_BACK: 802825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE; 802925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn break; 8030f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 80318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 803225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn "New transit: " + transit); 803325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn } else if (oldWallpaper != null) { 803425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn // We are transitioning from an activity with 803525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn // a wallpaper to one without. 803625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn transit = WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE; 80378a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 803825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn "New transit away from wallpaper: " + transit); 803925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn } else if (mWallpaperTarget != null) { 804025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn // We are transitioning from an activity without 804125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn // a wallpaper to now showing the wallpaper 804225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn transit = WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN; 80438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 804425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn "New transit into wallpaper: " + transit); 8045f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 8046ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 8047de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // If all closing windows are obscured, then there is 8048de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // no need to do an animation. This is the case, for 8049de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // example, when this transition is being done behind 8050de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // the lock screen. 8051de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn if (!mPolicy.allowAppAnimationsLw()) { 8052de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn animLp = null; 8053de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn } 8054de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn 80559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NN = mOpeningApps.size(); 80569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NN; i++) { 80579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mOpeningApps.get(i); 80588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 80599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Now opening app" + wtoken); 80609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.reportedVisible = false; 80619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.inPendingTransaction = false; 806283360b3167f2c394125b74f655bc577070cb9ccaDianne Hackborn wtoken.animation = null; 8063e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn setTokenVisibilityLocked(wtoken, animLp, true, 8064ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn transit, false); 80659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.updateReportedVisibilityLocked(); 8066a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.waitingToShow = false; 80679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.showAllWindowsLocked(); 80689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NN = mClosingApps.size(); 80709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NN; i++) { 80719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mClosingApps.get(i); 80728a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 80739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Now closing app" + wtoken); 80749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.inPendingTransaction = false; 807583360b3167f2c394125b74f655bc577070cb9ccaDianne Hackborn wtoken.animation = null; 8076e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn setTokenVisibilityLocked(wtoken, animLp, false, 8077ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn transit, false); 80789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.updateReportedVisibilityLocked(); 8079a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.waitingToHide = false; 80809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Force the allDrawn flag, because we want to start 80819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this guy's animations regardless of whether it's 80829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // gotten drawn. 80839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.allDrawn = true; 80849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 80868b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn mNextAppTransitionPackage = null; 8087ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 80889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpeningApps.clear(); 80899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClosingApps.clear(); 80909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 80919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This has changed the visibility of windows, so perform 80929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // a new layout to get them all up-to-date. 809394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT 809494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG; 80959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 809620583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn if (!moveInputMethodWindowsIfNeededLocked(true)) { 809720583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn assignLayersLocked(); 809820583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn } 80993a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, 81003a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 8101b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn mFocusMayChange = false; 81029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8104ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 810516064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn int adjResult = 0; 810616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn 8107a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (!animating && mAppTransitionRunning) { 8108a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // We have finished the animation of an app transition. To do 8109a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // this, we have delayed a lot of operations like showing and 8110a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // hiding apps, moving apps in Z-order, etc. The app token list 8111a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // reflects the correct Z-order, but the window list may now 8112a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // be out of sync with it. So here we will just rebuild the 8113a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // entire app window list. Fun! 8114a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mAppTransitionRunning = false; 8115a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // Clear information about apps that were moving. 8116a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToBottomApps.clear(); 8117ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 8118a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn rebuildAppWindowListLocked(); 8119b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT; 812016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn adjResult |= ADJUST_WALLPAPER_LAYERS_CHANGED; 8121a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn moveInputMethodWindowsIfNeededLocked(false); 8122a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wallpaperMayChange = true; 8123c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu // Since the window list has been rebuilt, focus might 8124c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu // have to be recomputed since the actual order of windows 8125c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu // might have changed again. 8126b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn mFocusMayChange = true; 8127a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 8128ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 8129b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (wallpaperForceHidingChanged && changes == 0 && !mAppTransitionReady) { 81303b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // At this point, there was a window with a wallpaper that 81313b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // was force hiding other windows behind it, but now it 81323b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // is going away. This may be simple -- just animate 81333b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // away the wallpaper and its window -- or it may be 81343b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // hard -- the wallpaper now needs to be shown behind 81353b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // something that was hidden. 81363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn WindowState oldWallpaper = mWallpaperTarget; 8137de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn if (mLowerWallpaperTarget != null 8138de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn && mLowerWallpaperTarget.mAppToken != null) { 81398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 8140de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn "wallpaperForceHiding changed with lower=" 8141de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn + mLowerWallpaperTarget); 81428a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 8143de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn "hidden=" + mLowerWallpaperTarget.mAppToken.hidden + 8144de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn " hiddenRequested=" + mLowerWallpaperTarget.mAppToken.hiddenRequested); 8145de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn if (mLowerWallpaperTarget.mAppToken.hidden) { 8146de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // The lower target has become hidden before we 8147de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // actually started the animation... let's completely 8148de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // re-evaluate everything. 8149de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn mLowerWallpaperTarget = mUpperWallpaperTarget = null; 8150b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM; 8151de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn } 8152de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn } 815316064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn adjResult |= adjustWallpaperWindowsLocked(); 81543b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn wallpaperMayChange = false; 8155de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn wallpaperForceHidingChanged = false; 81568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "****** OLD: " + oldWallpaper 8157de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn + " NEW: " + mWallpaperTarget 8158de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn + " LOWER: " + mLowerWallpaperTarget); 81593b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (mLowerWallpaperTarget == null) { 81603b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // Whoops, we don't need a special wallpaper animation. 81613b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // Clear them out. 81623b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn forceHiding = false; 81633b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn for (i=N-1; i>=0; i--) { 8164e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 81653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (w.mSurface != null) { 81663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn final WindowManager.LayoutParams attrs = w.mAttrs; 8167c03d28b9e96f667d29ec6e480bed171bbd07169dSuchi Amalapurapu if (mPolicy.doesForceHide(w, attrs) && w.isVisibleLw()) { 81688a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_FOCUS) Slog.i(TAG, "win=" + w + " force hides other windows"); 81693b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn forceHiding = true; 81703b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (mPolicy.canBeForceHidden(w, attrs)) { 81713b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (!w.mAnimating) { 81723b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // We set the animation above so it 81733b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // is not yet running. 81743b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn w.clearAnimation(); 81753b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 81763b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 81773b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 81783b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 81793b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 81803b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 8181ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 81826c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (mWindowDetachedWallpaper != windowDetachedWallpaper) { 81836c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (DEBUG_WALLPAPER) Slog.v(TAG, 81846c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn "Detached wallpaper changed from " + mWindowDetachedWallpaper 8185ba24e4d8bbeb60e96d74f05e21691dad61ce497eDianne Hackborn + " to " + windowDetachedWallpaper); 81866c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn mWindowDetachedWallpaper = windowDetachedWallpaper; 81876c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn wallpaperMayChange = true; 81886c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 81896c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 8190de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (windowAnimationBackgroundColor != 0) { 8191ba24e4d8bbeb60e96d74f05e21691dad61ce497eDianne Hackborn // If the window that wants black is the current wallpaper 81929e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn // target, then the black goes *below* the wallpaper so we 81939e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn // don't cause the wallpaper to suddenly disappear. 81949e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn WindowState target = windowAnimationBackground; 81959e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn if (mWallpaperTarget == windowAnimationBackground 81969e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn || mLowerWallpaperTarget == windowAnimationBackground 81979e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn || mUpperWallpaperTarget == windowAnimationBackground) { 81989e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn for (i=0; i<mWindows.size(); i++) { 81999e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn WindowState w = mWindows.get(i); 82009e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn if (w.mIsWallpaper) { 82019e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn target = w; 82029e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn break; 82039e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn } 82049e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn } 82059e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn } 8206de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (mWindowAnimationBackgroundSurface == null) { 8207de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mWindowAnimationBackgroundSurface = new DimSurface(mFxSession); 8208de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 8209de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mWindowAnimationBackgroundSurface.show(dw, dh, 82109e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn target.mAnimLayer - LAYER_OFFSET_DIM, 8211de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowAnimationBackgroundColor); 8212de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } else if (mWindowAnimationBackgroundSurface != null) { 8213de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mWindowAnimationBackgroundSurface.hide(); 8214de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 8215de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn 82166c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn if (wallpaperMayChange) { 82178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 82180586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn "Wallpaper may change! Adjusting"); 821916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn adjResult |= adjustWallpaperWindowsLocked(); 82203b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 8221ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 82223b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if ((adjResult&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) { 82238a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 82243b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn "Wallpaper layer changed: assigning layers + relayout"); 8225b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT; 82263b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn assignLayersLocked(); 82273b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if ((adjResult&ADJUST_WALLPAPER_VISIBILITY_CHANGED) != 0) { 82288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 82293b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn "Wallpaper visibility changed: relayout"); 8230b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT; 82313b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 8232ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 8233b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (mFocusMayChange) { 8234b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn mFocusMayChange = false; 82353a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown if (updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, 82363a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/)) { 8237b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM; 82383b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn adjResult = 0; 8239a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 82406c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn } 82413b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn 82423b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (mLayoutNeeded) { 8243b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT; 82443b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 8245ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 8246b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: changes=0x" 8247b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + Integer.toHexString(changes)); 8248b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } while (changes != 0); 82499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 82509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // THIRD LOOP: Update the surfaces of all windows. 82519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 82529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean someoneLosingFocus = mLosingFocus.size() != 0; 82539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 82549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean obscured = false; 82559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean blurring = false; 82569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean dimming = false; 82579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean covered = false; 82589ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn boolean syswin = false; 82599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8260bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn final int N = mWindows.size(); 8261ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 82629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=N-1; i>=0; i--) { 8263e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 82649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 82659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean displayed = false; 82669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowManager.LayoutParams attrs = w.mAttrs; 82679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int attrFlags = attrs.flags; 82689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 82699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 8270ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // XXX NOTE: The logic here could be improved. We have 8271ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // the decision about whether to resize a window separated 8272ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // from whether to hide the surface. This can cause us to 8273ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // resize a surface even if we are going to hide it. You 8274ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // can see this by (1) holding device in landscape mode on 8275ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // home screen; (2) tapping browser icon (device will rotate 8276ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // to landscape; (3) tap home. The wallpaper will be resized 8277ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // in step 2 but then immediately hidden, causing us to 8278ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // have to resize and then redraw it again in step 3. It 8279ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // would be nice to figure out how to avoid this, but it is 8280ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // difficult because we do need to resize surfaces in some 8281ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // cases while they are hidden such as when first showing a 8282ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // window. 8283ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn 82849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.computeShownFrameLocked(); 82858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 82869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Placing surface #" + i + " " + w.mSurface 8287ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn + ": new=" + w.mShownFrame); 82889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8289fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (w.mSurface != null) { 8290b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn int width, height; 8291b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if ((w.mAttrs.flags & w.mAttrs.FLAG_SCALED) != 0) { 8292b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn // for a scaled surface, we just want to use 8293b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn // the requested size. 8294b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn width = w.mRequestedWidth; 8295b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn height = w.mRequestedHeight; 8296b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn } else { 8297b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn width = w.mCompatFrame.width(); 8298b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn height = w.mCompatFrame.height(); 8299b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn } 8300b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn 8301b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (width < 1) { 8302b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn width = 1; 8303b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn } 8304b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (height < 1) { 8305b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn height = 1; 8306b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn } 8307b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn final boolean surfaceResized = w.mSurfaceW != width || w.mSurfaceH != height; 8308b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (surfaceResized) { 8309b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn w.mSurfaceW = width; 8310b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn w.mSurfaceH = height; 8311b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn } 8312b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn 8313fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (w.mSurfaceX != w.mShownFrame.left 8314fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown || w.mSurfaceY != w.mShownFrame.top) { 8315fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown try { 8316fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (SHOW_TRANSACTIONS) logSurface(w, 8317fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown "POS " + w.mShownFrame.left 8318fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + ", " + w.mShownFrame.top, null); 8319fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown w.mSurfaceX = w.mShownFrame.left; 8320fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown w.mSurfaceY = w.mShownFrame.top; 8321fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown w.mSurface.setPosition(w.mShownFrame.left, w.mShownFrame.top); 8322fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown } catch (RuntimeException e) { 8323fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown Slog.w(TAG, "Error positioning surface of " + w 8324fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " pos=(" + w.mShownFrame.left 8325fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + "," + w.mShownFrame.top + ")", e); 8326fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (!recoveringMemory) { 8327648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn reclaimSomeSurfaceMemoryLocked(w, "position", true); 8328fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown } 8329fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown } 8330fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown } 8331fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown 8332b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (surfaceResized) { 83339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8334b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(w, 8335b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn "SIZE " + width + "x" + height, null); 8336ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn w.mSurfaceResized = true; 83379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.setSize(width, height); 83389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 83399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If something goes wrong with the surface (such 83409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // as running out of memory), don't take down the 83419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // entire system. 8342fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown Slog.e(TAG, "Error resizing surface of " + w 8343fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " size=(" + width + "x" + height + ")", e); 83449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!recoveringMemory) { 8345648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn reclaimSomeSurfaceMemoryLocked(w, "size", true); 83469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 83479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 83489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 83499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8350fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown 8351e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (!w.mAppFreezing && w.mLayoutSeq == mLayoutSeq) { 8352b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn w.mContentInsetsChanged |= 83539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project !w.mLastContentInsets.equals(w.mContentInsets); 8354b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn w.mVisibleInsetsChanged |= 83559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project !w.mLastVisibleInsets.equals(w.mVisibleInsets); 8356e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean configChanged = 8357e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn w.mConfiguration != mCurConfiguration 8358e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn && (w.mConfiguration == null 8359e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn || mCurConfiguration.diff(w.mConfiguration) != 0); 8360694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (DEBUG_CONFIGURATION && configChanged) { 8361694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn Slog.v(TAG, "Win " + w + " config changed: " 8362694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn + mCurConfiguration); 8363694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 83648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v(TAG, "Resizing " + w 8365e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn + ": configChanged=" + configChanged 8366b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn + " last=" + w.mLastFrame + " frame=" + w.mFrame); 8367b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn w.mLastFrame.set(w.mFrame); 8368b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (w.mContentInsetsChanged 8369e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn || w.mVisibleInsetsChanged 8370ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn || w.mSurfaceResized 8371e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn || configChanged) { 8372fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (DEBUG_RESIZE || DEBUG_ORIENTATION) { 8373fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown Slog.v(TAG, "Resize reasons: " 8374fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " contentInsetsChanged=" + w.mContentInsetsChanged 8375fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " visibleInsetsChanged=" + w.mVisibleInsetsChanged 8376fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " surfaceResized=" + w.mSurfaceResized 8377fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " configChanged=" + configChanged); 8378fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown } 8379fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown 83809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastContentInsets.set(w.mContentInsets); 83819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastVisibleInsets.set(w.mVisibleInsets); 83823ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn makeWindowFreezingScreenIfNeededLocked(w); 83839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the orientation is changing, then we need to 83849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // hold off on unfreezing the display until this 83859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // window has been redrawn; to do that, we need 83869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to go through the process of getting informed 83879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // by the application when it has finished drawing. 83889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mOrientationChanging) { 83898a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 83909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation start waiting for draw in " 83919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + w + ", surface " + w.mSurface); 83929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mDrawPending = true; 83939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mCommitDrawPending = false; 83949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mReadyToShow = false; 83959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mAppToken != null) { 83969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAppToken.allDrawn = false; 83979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 83989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8399b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (!mResizingWindows.contains(w)) { 8400b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG, 8401b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn "Resizing window " + w + " to " + w.mSurfaceW 8402b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn + "x" + w.mSurfaceH); 8403b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn mResizingWindows.add(w); 8404b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn } 84059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (w.mOrientationChanging) { 84069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!w.mDrawPending && !w.mCommitDrawPending) { 84078a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 84089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation not waiting for draw in " 84099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + w + ", surface " + w.mSurface); 84109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 84119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 84153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (w.mAttachedHidden || !w.isReadyForDisplay()) { 84169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!w.mLastHidden) { 84179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //dump(); 84189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastHidden = true; 8419b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(w, 8420b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn "HIDE (performLayout)", null); 84219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 842216064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn w.mSurfaceShown = false; 84239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 84249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.hide(); 84259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 84268a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception hiding surface in " + w); 84279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are waiting for this window to handle an 84319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // orientation change, well, it is hidden, so 84329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // doesn't really matter. Note that this does 84339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // introduce a potential glitch if the window 84349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // becomes unhidden before it has drawn for the 84359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // new orientation. 84369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mOrientationChanging) { 84379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 84388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 84399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation change skips hidden " + w); 84409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (w.mLastLayer != w.mAnimLayer 84429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastAlpha != w.mShownAlpha 84439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastDsDx != w.mDsDx 84449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastDtDx != w.mDtDx 84459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastDsDy != w.mDsDy 84469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastDtDy != w.mDtDy 84479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastHScale != w.mHScale 84489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastVScale != w.mVScale 84499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastHidden) { 84509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayed = true; 84519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastAlpha = w.mShownAlpha; 84529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastLayer = w.mAnimLayer; 84539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastDsDx = w.mDsDx; 84549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastDtDx = w.mDtDx; 84559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastDsDy = w.mDsDy; 84569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastDtDy = w.mDtDy; 84579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastHScale = w.mHScale; 84589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastVScale = w.mVScale; 8459b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(w, 8460b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn "alpha=" + w.mShownAlpha + " layer=" + w.mAnimLayer 84610586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn + " matrix=[" + (w.mDsDx*w.mHScale) 84620586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn + "," + (w.mDtDx*w.mVScale) 84630586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn + "][" + (w.mDsDy*w.mHScale) 8464b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + "," + (w.mDtDy*w.mVScale) + "]", null); 84659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 84669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 846716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn w.mSurfaceAlpha = w.mShownAlpha; 84689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.setAlpha(w.mShownAlpha); 846916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn w.mSurfaceLayer = w.mAnimLayer; 84709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.setLayer(w.mAnimLayer); 84719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.setMatrix( 84729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mDsDx*w.mHScale, w.mDtDx*w.mVScale, 84739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mDsDy*w.mHScale, w.mDtDy*w.mVScale); 84749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 84758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Error updating surface in " + w, e); 84769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!recoveringMemory) { 8477648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn reclaimSomeSurfaceMemoryLocked(w, "update", true); 84789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 84829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mLastHidden && !w.mDrawPending 84839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !w.mCommitDrawPending 84849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !w.mReadyToShow) { 8485b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(w, 8486b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn "SHOW (performLayout)", null); 84878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + w 84889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " during relayout"); 84899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (showSurfaceRobustlyLocked(w)) { 84909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mHasDrawn = true; 84919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastHidden = false; 84929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 84939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 84949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 84979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mToken.hasVisible = true; 84989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 85009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayed = true; 85019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 85039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (displayed) { 85049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!covered) { 8505980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy if (attrs.width == LayoutParams.MATCH_PARENT 8506980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy && attrs.height == LayoutParams.MATCH_PARENT) { 85079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project covered = true; 85089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mOrientationChanging) { 85119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mDrawPending || w.mCommitDrawPending) { 85129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project orientationChangeComplete = false; 85138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 85149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation continue waiting for draw in " + w); 85159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 85169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 85178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 85189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation change complete in " + w); 85199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mToken.hasVisible = true; 85229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (w.mOrientationChanging) { 85248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 85259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation change skips hidden " + w); 85269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 85279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 85290f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn if (w.mContentChanged) { 85300f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing"); 85310f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn w.mContentChanged = false; 85320f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn } 85330f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn 85349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean canBeSeen = w.isDisplayedLw(); 85359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 85369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (someoneLosingFocus && w == mCurrentFocus && canBeSeen) { 85379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project focusDisplayed = true; 85389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8540e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn final boolean obscuredChanged = w.mObscured != obscured; 8541ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 85429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Update effect. 85437341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (!(w.mObscured=obscured)) { 85449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 85459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((attrFlags&FLAG_KEEP_SCREEN_ON) != 0) { 85469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project holdScreen = w.mSession; 85479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85489ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn if (!syswin && w.mAttrs.screenBrightness >= 0 85499ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn && screenBrightness < 0) { 85509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project screenBrightness = w.mAttrs.screenBrightness; 85519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8552fb73f79340375013225618a5d87f46b958f698efMike Lockwood if (!syswin && w.mAttrs.buttonBrightness >= 0 8553fb73f79340375013225618a5d87f46b958f698efMike Lockwood && buttonBrightness < 0) { 8554fb73f79340375013225618a5d87f46b958f698efMike Lockwood buttonBrightness = w.mAttrs.buttonBrightness; 8555fb73f79340375013225618a5d87f46b958f698efMike Lockwood } 855646af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood if (canBeSeen 855746af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood && (attrs.type == WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG 855846af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood || attrs.type == WindowManager.LayoutParams.TYPE_KEYGUARD 855946af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood || attrs.type == WindowManager.LayoutParams.TYPE_SYSTEM_ERROR)) { 85609ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn syswin = true; 85619ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn } 85629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85631ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 856425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn boolean opaqueDrawn = canBeSeen && w.isOpaqueDrawn(); 8565e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (opaqueDrawn && w.isFullscreen(innerDw, innerDh)) { 85669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This window completely covers everything behind it, 85679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so we want to leave all of them as unblurred (for 85689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // performance reasons). 85699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obscured = true; 85703b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (canBeSeen && !obscured && 85719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (attrFlags&FLAG_BLUR_BEHIND|FLAG_DIM_BEHIND) != 0) { 85728a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v(TAG, "Win " + w 85739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": blurring=" + blurring 85749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " obscured=" + obscured 85759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " displayed=" + displayed); 85769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((attrFlags&FLAG_DIM_BEHIND) != 0) { 85779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!dimming) { 85788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "DIM BEHIND: " + w); 85799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dimming = true; 85800a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima if (mDimAnimator == null) { 85810a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima mDimAnimator = new DimAnimator(mFxSession); 85829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 858348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn mDimAnimator.show(innerDw, innerDh); 85841c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn mDimAnimator.updateParameters(mContext.getResources(), 85851c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn w, currentTime); 85869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((attrFlags&FLAG_BLUR_BEHIND) != 0) { 85899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!blurring) { 85908a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "BLUR BEHIND: " + w); 85919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project blurring = true; 85929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBlurSurface == null) { 85939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 859406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy mBlurSurface = new Surface(mFxSession, 0, 85955d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian "BlurSurface", 85969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -1, 16, 16, 85979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PixelFormat.OPAQUE, 85989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface.FX_SURFACE_BLUR); 85999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 86008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.e(TAG, "Exception creating Blur surface", e); 86019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8602ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " 8603ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn + mBlurSurface + ": CREATE"); 86049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBlurSurface != null) { 860616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " 860716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn + mBlurSurface + ": pos=(0,0) (" + 860816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn dw + "x" + dh + "), layer=" + (w.mAnimLayer-1)); 86099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlurSurface.setPosition(0, 0); 86109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlurSurface.setSize(dw, dh); 8611de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mBlurSurface.setLayer(w.mAnimLayer-LAYER_OFFSET_BLUR); 861216064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn if (!mBlurShown) { 861316064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn try { 861416064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " 861516064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn + mBlurSurface + ": SHOW"); 861616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn mBlurSurface.show(); 861716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn } catch (RuntimeException e) { 861816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn Slog.w(TAG, "Failure showing blur surface", e); 861916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn } 862016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn mBlurShown = true; 86219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8627ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 8628e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn if (obscuredChanged && mWallpaperTarget == w) { 8629e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn // This is the wallpaper target and its obscured state 8630e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn // changed... make sure the current wallaper's visibility 8631e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn // has been updated accordingly. 8632e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn updateWallpaperVisibilityLocked(); 8633e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 86349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8635ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 86360a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima if (mDimAnimator != null && mDimAnimator.mDimShown) { 8637de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn animating |= mDimAnimator.updateSurface(dimming, currentTime, 8638bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn mDisplayFrozen || !mDisplayEnabled || !mPolicy.isScreenOnFully()); 86399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 864006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 86419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!blurring && mBlurShown) { 86428a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " + mBlurSurface 86439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": HIDE"); 86449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 86459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlurSurface.hide(); 86469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalArgumentException e) { 86478a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Illegal argument exception hiding blur surface"); 86489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlurShown = false; 86509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86517916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 86527916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mBlackFrame != null) { 86537916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mScreenRotationAnimation != null) { 86547916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBlackFrame.setMatrix( 86557916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mScreenRotationAnimation.getEnterTransformation().getMatrix()); 86567916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else { 86577916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBlackFrame.clearMatrix(); 86587916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 86597916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 86609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 86618962028b6e2f4176e6ceded281e584d223e44982Dianne Hackborn Log.wtf(TAG, "Unhandled exception in Window Manager", e); 86629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 86649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface.closeTransaction(); 866506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 866636991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 866736991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces"); 866894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn 8669b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (mWatermark != null) { 8670b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn mWatermark.drawIfNeeded(); 8671b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 8672b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn 86738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION && mDisplayFrozen) Slog.v(TAG, 86749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "With display frozen, orientationChangeComplete=" 86759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + orientationChangeComplete); 86769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (orientationChangeComplete) { 86779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWindowsFreezingScreen) { 86789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowsFreezingScreen = false; 86799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT); 86809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8681e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn stopFreezingDisplayLocked(); 86829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 868306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 86849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i = mResizingWindows.size(); 86859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i > 0) { 86869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 86879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 86889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = mResizingWindows.get(i); 86899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8690ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG, 8691ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn "Reporting new frame to " + win + ": " + win.mCompatFrame); 8692694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn int diff = 0; 8693e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean configChanged = 8694e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn win.mConfiguration != mCurConfiguration 8695e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn && (win.mConfiguration == null 8696694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn || (diff=mCurConfiguration.diff(win.mConfiguration)) != 0); 8697694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if ((DEBUG_RESIZE || DEBUG_ORIENTATION || DEBUG_CONFIGURATION) 8698694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn && configChanged) { 86998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "Sending new config to window " + win + ": " 8700b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn + win.mSurfaceW + "x" + win.mSurfaceH 8701694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn + " / " + mCurConfiguration + " / 0x" 8702694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn + Integer.toHexString(diff)); 8703e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 8704694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn win.mConfiguration = mCurConfiguration; 87053ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn if (DEBUG_ORIENTATION && win.mDrawPending) Slog.i( 87063ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn TAG, "Resizing " + win + " WITH DRAW PENDING"); 8707d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn win.mClient.resized((int)win.mSurfaceW, (int)win.mSurfaceH, 8708d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn win.mLastContentInsets, win.mLastVisibleInsets, win.mDrawPending, 8709e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn configChanged ? win.mConfiguration : null); 87109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mContentInsetsChanged = false; 87119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mVisibleInsetsChanged = false; 8712ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn win.mSurfaceResized = false; 87139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 87149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mOrientationChanging = false; 87159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 87169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (i > 0); 87179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResizingWindows.clear(); 87189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 871906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 87209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Destroy the surface of any windows that are no longer visible. 87217341d7a104b47996445d069a695e155a07184606Dianne Hackborn boolean wallpaperDestroyed = false; 87229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i = mDestroySurface.size(); 87239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i > 0) { 87249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 87259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 87269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = mDestroySurface.get(i); 87279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mDestroying = false; 87289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInputMethodWindow == win) { 87299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodWindow = null; 87309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 87317341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (win == mWallpaperTarget) { 87327341d7a104b47996445d069a695e155a07184606Dianne Hackborn wallpaperDestroyed = true; 87337341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 87349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.destroySurfaceLocked(); 87359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (i > 0); 87369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDestroySurface.clear(); 87379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 87389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 87399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Time to remove any exiting tokens? 87409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=mExitingTokens.size()-1; i>=0; i--) { 87419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mExitingTokens.get(i); 87429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!token.hasVisible) { 87439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingTokens.remove(i); 87444c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (token.windowType == TYPE_WALLPAPER) { 87454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWallpaperTokens.remove(token); 87464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 87479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 87489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 87499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 87509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Time to remove any exiting applications? 87519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=mExitingAppTokens.size()-1; i>=0; i--) { 87529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken token = mExitingAppTokens.get(i); 87539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!token.hasVisible && !mClosingApps.contains(token)) { 87549bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // Make sure there is no animation running on this token, 87559bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // so any windows associated with it will be removed as 87569bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // soon as their animations are complete 87579bfb707597898f54722460b48588007b682f3e2aDianne Hackborn token.animation = null; 87589bfb707597898f54722460b48588007b682f3e2aDianne Hackborn token.animating = false; 8759f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, 8760f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "performLayout: App token exiting now removed" + token); 87619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.remove(token); 87629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingAppTokens.remove(i); 87639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 87649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 87659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8766a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn boolean needRelayout = false; 8767ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 8768a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (!animating && mAppTransitionRunning) { 8769a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // We have finished the animation of an app transition. To do 8770a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // this, we have delayed a lot of operations like showing and 8771a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // hiding apps, moving apps in Z-order, etc. The app token list 8772a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // reflects the correct Z-order, but the window list may now 8773a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // be out of sync with it. So here we will just rebuild the 8774a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // entire app window list. Fun! 8775a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mAppTransitionRunning = false; 8776a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn needRelayout = true; 8777a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn rebuildAppWindowListLocked(); 877816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn assignLayersLocked(); 8779a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // Clear information about apps that were moving. 8780a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToBottomApps.clear(); 8781a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 8782ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 87839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (focusDisplayed) { 87849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendEmptyMessage(H.REPORT_LOSING_FOCUS); 87859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 87867341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (wallpaperDestroyed) { 87870586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn needRelayout = adjustWallpaperWindowsLocked() != 0; 87887341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 8789a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (needRelayout) { 87907341d7a104b47996445d069a695e155a07184606Dianne Hackborn requestAnimationLocked(0); 87917341d7a104b47996445d069a695e155a07184606Dianne Hackborn } else if (animating) { 8792222357f33a105ce08177b94334c7d14af29df8f6Mathias Agopian final int refreshTimeUs = (int)(1000 / mDisplay.getRefreshRate()); 8793222357f33a105ce08177b94334c7d14af29df8f6Mathias Agopian requestAnimationLocked(currentTime + refreshTimeUs - SystemClock.uptimeMillis()); 87949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8795eb857f12d605659b385d168ef1ea7d4ba5193585Jeff Brown 87963a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown // Finally update all input windows now that the window changes have stabilized. 87972e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 8798eb857f12d605659b385d168ef1ea7d4ba5193585Jeff Brown 87998e03b7566c42621fda01186b66b019142eb84fbfJeff Brown setHoldScreenLocked(holdScreen != null); 8800428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (!mDisplayFrozen) { 8801428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (screenBrightness < 0 || screenBrightness > 1.0f) { 8802428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn mPowerManager.setScreenBrightnessOverride(-1); 8803428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } else { 8804428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn mPowerManager.setScreenBrightnessOverride((int) 8805428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn (screenBrightness * Power.BRIGHTNESS_ON)); 8806428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } 8807428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (buttonBrightness < 0 || buttonBrightness > 1.0f) { 8808428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn mPowerManager.setButtonBrightnessOverride(-1); 8809428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } else { 8810428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn mPowerManager.setButtonBrightnessOverride((int) 8811428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn (buttonBrightness * Power.BRIGHTNESS_ON)); 8812428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } 8813fb73f79340375013225618a5d87f46b958f698efMike Lockwood } 88149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (holdScreen != mHoldingScreenOn) { 88159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHoldingScreenOn = holdScreen; 88169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = mH.obtainMessage(H.HOLD_SCREEN_CHANGED, holdScreen); 88179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessage(m); 88189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8819ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 882093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn if (mTurnOnScreen) { 8821b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (DEBUG_VISIBILITY) Slog.v(TAG, "Turning screen on after layout!"); 882293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn mPowerManager.userActivity(SystemClock.uptimeMillis(), false, 882393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn LocalPowerManager.BUTTON_EVENT, true); 882493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn mTurnOnScreen = false; 882593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } 8826f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn 882750660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn if (screenRotationFinished && mScreenRotationAnimation != null) { 882850660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn mScreenRotationAnimation.kill(); 882950660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn mScreenRotationAnimation = null; 883050660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn } 883150660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn 883289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (updateRotation) { 883389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation"); 883401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown boolean changed = updateRotationUncheckedLocked(false); 883589ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (changed) { 88363e4f9d0452a2592338c15cf1b6d774761b929a28Dianne Hackborn mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 8837bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn } else { 8838bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn updateRotation = false; 883989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn } 884089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn } 884129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn 8842bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn if (orientationChangeComplete && !needRelayout && !updateRotation) { 8843bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn checkDrawnWindowsLocked(); 8844bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn } 884529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn 8846f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn // Check to see if we are now in a state where the screen should 8847f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn // be enabled, because the window obscured flags have changed. 8848f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn enableScreenIfNeededLocked(); 88499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 885029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn 885138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn void checkDrawnWindowsLocked() { 885238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn if (mWaitingForDrawn.size() > 0) { 885338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn for (int j=mWaitingForDrawn.size()-1; j>=0; j--) { 885438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn Pair<WindowState, IRemoteCallback> pair = mWaitingForDrawn.get(j); 885538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn WindowState win = pair.first; 885638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn //Slog.i(TAG, "Waiting for drawn " + win + ": removed=" 885738e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn // + win.mRemoved + " visible=" + win.isVisibleLw() 885838e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn // + " shown=" + win.mSurfaceShown); 885938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn if (win.mRemoved || !win.isVisibleLw()) { 886038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn // Window has been removed or made invisible; no draw 886138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn // will now happen, so stop waiting. 886238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn Slog.w(TAG, "Aborted waiting for drawn: " + pair.first); 886338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn try { 886438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn pair.second.sendResult(null); 886538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } catch (RemoteException e) { 886629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 886738e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn mWaitingForDrawn.remove(pair); 886838e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT, pair); 886938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } else if (win.mSurfaceShown) { 887038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn // Window is now drawn (and shown). 887138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn try { 887238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn pair.second.sendResult(null); 887338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } catch (RemoteException e) { 887429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 887538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn mWaitingForDrawn.remove(pair); 887638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT, pair); 887729aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 887829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 887929aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 888029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 888129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn 888238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn public void waitForWindowDrawn(IBinder token, IRemoteCallback callback) { 888338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn synchronized (mWindowMap) { 888438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn WindowState win = windowForClientLocked(null, token, true); 888538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn if (win != null) { 888638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn Pair<WindowState, IRemoteCallback> pair = 888738e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn new Pair<WindowState, IRemoteCallback>(win, callback); 888838e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn Message m = mH.obtainMessage(H.WAITING_FOR_DRAWN_TIMEOUT, pair); 888938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn mH.sendMessageDelayed(m, 2000); 889038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn mWaitingForDrawn.add(pair); 889138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn checkDrawnWindowsLocked(); 889238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } 889338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } 889438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } 889538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn 889646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /** 889746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Must be called with the main window manager lock held. 889846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 889946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown void setHoldScreenLocked(boolean holding) { 890046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown boolean state = mHoldingScreenWakeLock.isHeld(); 890146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (holding != state) { 890246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (holding) { 89030601eb7953cbf77d92826bef3ca37e208d922de7Daniel Sandler mPolicy.screenOnStartedLw(); 890446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mHoldingScreenWakeLock.acquire(); 890546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } else { 890646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mPolicy.screenOnStoppedLw(); 890746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mHoldingScreenWakeLock.release(); 890846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 890946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 891046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 89119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 89129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void requestAnimationLocked(long delay) { 89139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mAnimationPending) { 89149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimationPending = true; 89159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageDelayed(mH.obtainMessage(H.ANIMATE), delay); 89169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 891806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 89199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 89209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Have the surface flinger show a surface, robustly dealing with 89219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * error conditions. In particular, if there is not enough memory 89229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to show the surface, then we will try to get rid of other surfaces 89239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in order to succeed. 892406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * 89259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the surface was successfully shown. 89269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 89279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean showSurfaceRobustlyLocked(WindowState win) { 89289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 89299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mSurface != null) { 893016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn win.mSurfaceShown = true; 89319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mSurface.show(); 893293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn if (win.mTurnOnScreen) { 8933b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (DEBUG_VISIBILITY) Slog.v(TAG, 8934b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn "Show surface turning screen on: " + win); 893593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn win.mTurnOnScreen = false; 893693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn mTurnOnScreen = true; 893793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } 89389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 89409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 894194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn Slog.w(TAG, "Failure showing surface " + win.mSurface + " in " + win, e); 89429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 894306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8944648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn reclaimSomeSurfaceMemoryLocked(win, "show", true); 894506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 89469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 89479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 894806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8949648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn boolean reclaimSomeSurfaceMemoryLocked(WindowState win, String operation, boolean secure) { 89509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Surface surface = win.mSurface; 8951648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn boolean leakedSurface = false; 8952648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn boolean killedApps = false; 895306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8954ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker EventLog.writeEvent(EventLogTags.WM_NO_SURFACE_MEMORY, win.toString(), 89559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mSession.mPid, operation); 895606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 89579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mForceRemoves == null) { 89589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForceRemoves = new ArrayList<WindowState>(); 89599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 896006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 89619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long callingIdentity = Binder.clearCallingIdentity(); 89629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 89639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // There was some problem... first, do a sanity check of the 89649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // window list to make sure we haven't left any dangling surfaces 89659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // around. 89669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = mWindows.size(); 89678a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "Out of memory for surface! Looking for leaks..."); 89689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8969e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState ws = mWindows.get(i); 89709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ws.mSurface != null) { 89719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mSessions.contains(ws.mSession)) { 89728a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "LEAKED SURFACE (session doesn't exist): " 89739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ws + " surface=" + ws.mSurface 89749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " token=" + win.mToken 89759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " pid=" + ws.mSession.mPid 89769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " uid=" + ws.mSession.mUid); 897794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null); 89780586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn ws.mSurface.destroy(); 897916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn ws.mSurfaceShown = false; 89809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ws.mSurface = null; 89819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForceRemoves.add(ws); 89829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 89839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 89849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project leakedSurface = true; 898594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } else if (ws.mAppToken != null && ws.mAppToken.clientHidden) { 89868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "LEAKED SURFACE (app token hidden): " 89879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ws + " surface=" + ws.mSurface 89889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " token=" + win.mAppToken); 898994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null); 89900586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn ws.mSurface.destroy(); 899116064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn ws.mSurfaceShown = false; 89929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ws.mSurface = null; 89939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project leakedSurface = true; 89949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 899706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 89989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!leakedSurface) { 89998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "No leaked surfaces; killing applicatons!"); 90009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SparseIntArray pidCandidates = new SparseIntArray(); 90019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9002e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState ws = mWindows.get(i); 90039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ws.mSurface != null) { 90049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pidCandidates.append(ws.mSession.mPid, ws.mSession.mPid); 90059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 90069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 90079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pidCandidates.size() > 0) { 90089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] pids = new int[pidCandidates.size()]; 90099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<pids.length; i++) { 90109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pids[i] = pidCandidates.keyAt(i); 90119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 90129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9013648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn if (mActivityManager.killPids(pids, "Free memory", secure)) { 90149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project killedApps = true; 90159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 90169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 90179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 90189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 90199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 902006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 90219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (leakedSurface || killedApps) { 90229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We managed to reclaim some memory, so get rid of the trouble 90239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // surface and ask the app to request another one. 90248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Looks like we have reclaimed some memory, clearing surface for retry."); 90259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (surface != null) { 90265fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) logSurface(win, 90275fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn "RECOVER DESTROY", null); 90280586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn surface.destroy(); 902916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn win.mSurfaceShown = false; 90309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mSurface = null; 90319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 903206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 90339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 90349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mClient.dispatchGetNewSurface(); 90359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 90369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 90379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 90389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 90399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(callingIdentity); 90409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9041648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn 9042648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn return leakedSurface || killedApps; 90439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 904406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 90453a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown private boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) { 90469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState newFocus = computeFocusedWindowLocked(); 90479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrentFocus != newFocus) { 90489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This check makes sure that we don't already have the focus 90499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // change message pending. 90509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.REPORT_FOCUS_CHANGE); 90519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendEmptyMessage(H.REPORT_FOCUS_CHANGE); 90528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 90539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Changing focus from " + mCurrentFocus + " to " + newFocus); 90549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowState oldFocus = mCurrentFocus; 90559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentFocus = newFocus; 90569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLosingFocus.remove(newFocus); 9057df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn int focusChanged = mPolicy.focusChangedLw(oldFocus, newFocus); 905806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 90599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowState imWindow = mInputMethodWindow; 90609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newFocus != imWindow && oldFocus != imWindow) { 9061c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project if (moveInputMethodWindowsIfNeededLocked( 90629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS && 9063c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project mode != UPDATE_FOCUS_WILL_PLACE_SURFACES)) { 9064c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project mLayoutNeeded = true; 9065c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project } 90669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mode == UPDATE_FOCUS_PLACING_SURFACES) { 90673a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown performLayoutLockedInner(true /*initial*/, updateInputWindows); 9068df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn focusChanged &= ~WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT; 9069c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project } else if (mode == UPDATE_FOCUS_WILL_PLACE_SURFACES) { 9070c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project // Client will do the layout, but we need to assign layers 9071c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project // for handleNewWindowLocked() below. 9072c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project assignLayersLocked(); 90739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 90749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9075df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 9076df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn if ((focusChanged&WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT) != 0) { 9077df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn // The change in focus caused us to need to do a layout. Okay. 9078df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mLayoutNeeded = true; 9079df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn if (mode == UPDATE_FOCUS_PLACING_SURFACES) { 9080df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn performLayoutLockedInner(true /*initial*/, updateInputWindows); 9081df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 9082df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 9083df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 9084349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown if (mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS) { 9085349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // If we defer assigning layers, then the caller is responsible for 9086349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // doing this part. 90873a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown finishUpdateFocusedWindowAfterAssignLayersLocked(updateInputWindows); 9088c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project } 90899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 90909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 90919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 90929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9093349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 90943a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown private void finishUpdateFocusedWindowAfterAssignLayersLocked(boolean updateInputWindows) { 90953a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown mInputMonitor.setInputFocusLw(mCurrentFocus, updateInputWindows); 9096349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } 90979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 90989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WindowState computeFocusedWindowLocked() { 90999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState result = null; 91009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win; 91019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 91029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = mWindows.size() - 1; 91039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nextAppIndex = mAppTokens.size()-1; 91049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken nextApp = nextAppIndex >= 0 91059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? mAppTokens.get(nextAppIndex) : null; 91069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 91079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i >= 0) { 9108e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown win = mWindows.get(i); 91099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 91108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV || DEBUG_FOCUS) Slog.v( 91119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Looking for focus: " + i 91129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " = " + win 91139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", flags=" + win.mAttrs.flags 91149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", canReceive=" + win.canReceiveKeys()); 91159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 91169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken thisApp = win.mAppToken; 911706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 91189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this window's application has been removed, just skip it. 91199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (thisApp != null && thisApp.removed) { 91209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 91219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 91229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 912306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 91249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If there is a focused app, don't allow focus to go to any 91259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // windows below it. If this is an application window, step 91269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // through the app tokens until we find its app. 91279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (thisApp != null && nextApp != null && thisApp != nextApp 91289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && win.mAttrs.type != TYPE_APPLICATION_STARTING) { 91299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int origAppIndex = nextAppIndex; 91309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (nextAppIndex > 0) { 91319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nextApp == mFocusedApp) { 91329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Whoops, we are below the focused app... no focus 91339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for you! 91348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV || DEBUG_FOCUS) Slog.v( 91359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Reached focused app: " + mFocusedApp); 91369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 91379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 91389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nextAppIndex--; 91399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nextApp = mAppTokens.get(nextAppIndex); 91409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nextApp == thisApp) { 91419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 91429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 91439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 91449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (thisApp != nextApp) { 91459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Uh oh, the app token doesn't exist! This shouldn't 91469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // happen, but if it does we can get totally hosed... 91479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so restart at the original app. 91489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nextAppIndex = origAppIndex; 91499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nextApp = mAppTokens.get(nextAppIndex); 91509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 91519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 91529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 91539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dispatch to this window if it is wants key events. 91549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.canReceiveKeys()) { 91558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_FOCUS) Slog.v( 91569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Found focus @ " + i + " = " + win); 91579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = win; 91589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 91599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 91609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 91619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 91629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 91639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 91649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 91659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 91669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 916794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn private void startFreezingDisplayLocked(boolean inTransaction) { 91689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplayFrozen) { 91699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 91709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 917106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 9172bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn if (mDisplay == null || !mPolicy.isScreenOnFully()) { 91738e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn // No need to freeze the screen before the system is ready or if 91748e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn // the screen is off. 91758e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn return; 91768e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn } 91778e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn 91789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenFrozenLock.acquire(); 917906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 91809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisplayFrozen = true; 9181349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 918200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.freezeInputDispatchingLw(); 9183349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 9184bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 9185bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET; 91863b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn mNextAppTransitionPackage = null; 91879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionReady = true; 91889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 918906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 91909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (PROFILE_ORIENTATION) { 91919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File file = new File("/data/system/frozen"); 91929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Debug.startMethodTracing(file.toString(), 8 * 1024 * 1024); 91939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9194a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn 9195a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn if (CUSTOM_SCREEN_ROTATION) { 9196f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) { 9197f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mScreenRotationAnimation.kill(); 9198f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mScreenRotationAnimation = null; 9199f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 9200a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn if (mScreenRotationAnimation == null) { 9201f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mScreenRotationAnimation = new ScreenRotationAnimation(mContext, 9202bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mFxSession, inTransaction, mCurDisplayWidth, mCurDisplayHeight, 9203bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mDisplay.getRotation()); 9204a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } 9205de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (!mScreenRotationAnimation.hasScreenshot()) { 9206de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn Surface.freezeDisplay(0); 9207de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 9208a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } else { 9209a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn Surface.freezeDisplay(0); 9210a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } 92119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 921206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 92139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void stopFreezingDisplayLocked() { 92149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mDisplayFrozen) { 92159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 92169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 921706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 9218e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (mWaitingForConfig || mAppsFreezingScreen > 0 || mWindowsFreezingScreen) { 9219e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return; 9220e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 9221e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 92229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisplayFrozen = false; 92239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.APP_FREEZE_TIMEOUT); 92249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (PROFILE_ORIENTATION) { 92259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Debug.stopMethodTracing(); 92269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9227a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn 922889ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn boolean updateRotation = false; 922989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn 9230de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (CUSTOM_SCREEN_ROTATION && mScreenRotationAnimation != null 9231de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn && mScreenRotationAnimation.hasScreenshot()) { 92323ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn if (DEBUG_ORIENTATION) Slog.i(TAG, "**** Dismissing screen rotation animation"); 9233de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (mScreenRotationAnimation.dismiss(mFxSession, MAX_ANIMATION_DURATION, 9234bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mTransitionAnimationScale, mCurDisplayWidth, mCurDisplayHeight)) { 9235de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn requestAnimationLocked(0); 9236de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } else { 9237de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mScreenRotationAnimation = null; 9238de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn updateRotation = true; 9239a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } 9240a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } else { 9241de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (mScreenRotationAnimation != null) { 9242de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mScreenRotationAnimation.kill(); 9243de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mScreenRotationAnimation = null; 9244de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 9245de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn updateRotation = true; 9246a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } 9247161dc80ea754d987a905bc5814872168d581040dDianne Hackborn Surface.unfreezeDisplay(0); 924806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 924900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.thawInputDispatchingLw(); 92509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9251420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn boolean configChanged; 9252420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn 9253b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate // While the display is frozen we don't re-compute the orientation 9254b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate // to avoid inconsistent states. However, something interesting 9255b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate // could have actually changed during that time so re-evaluate it 9256b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate // now to catch that. 9257420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn configChanged = updateOrientationFromAppTokensLocked(false); 9258b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate 92599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // A little kludge: a lot could have happened while the 92609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // display was frozen, so now that we are coming back we 92619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // do a gc so that any remote references the system 92629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // processes holds on others can be released if they are 92639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // no longer needed. 92649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.FORCE_GC); 92659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageDelayed(mH.obtainMessage(H.FORCE_GC), 92669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2000); 926706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 92689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenFrozenLock.release(); 926989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn 927089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (updateRotation) { 927189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation"); 927201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown configChanged |= updateRotationUncheckedLocked(false); 9273420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn } 9274420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn 9275420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn if (configChanged) { 9276420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 927789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn } 92789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 927906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 9280b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn static int getPropertyInt(String[] tokens, int index, int defUnits, int defDps, 9281b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn DisplayMetrics dm) { 9282b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (index < tokens.length) { 9283b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn String str = tokens[index]; 9284b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (str != null && str.length() > 0) { 9285b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn try { 9286b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn int val = Integer.parseInt(str); 9287b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn return val; 9288b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } catch (Exception e) { 9289b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 9290b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 9291fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 9292fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn if (defUnits == TypedValue.COMPLEX_UNIT_PX) { 9293fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn return defDps; 9294fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 9295fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn int val = (int)TypedValue.applyDimension(defUnits, defDps, dm); 9296fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn return val; 9297fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 9298fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 9299fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn void createWatermark() { 9300fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn if (mWatermark != null) { 9301fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn return; 9302fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 9303fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 9304b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn File file = new File("/system/etc/setup.conf"); 9305b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn FileInputStream in = null; 9306b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn try { 9307b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn in = new FileInputStream(file); 9308b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn DataInputStream ind = new DataInputStream(in); 9309b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn String line = ind.readLine(); 9310b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (line != null) { 9311b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn String[] toks = line.split("%"); 9312b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (toks != null && toks.length > 0) { 9313bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mWatermark = new Watermark(mRealDisplayMetrics, mFxSession, toks); 9314b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 9315b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 9316b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } catch (FileNotFoundException e) { 9317b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } catch (IOException e) { 9318b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } finally { 9319b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (in != null) { 9320b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn try { 9321b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn in.close(); 9322b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } catch (IOException e) { 9323b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 9324b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 9325fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 9326fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 9327fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 93289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9329664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato public void statusBarVisibilityChanged(int visibility) { 9330df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR) 9331df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn != PackageManager.PERMISSION_GRANTED) { 9332df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn throw new SecurityException("Caller does not hold permission " 9333df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn + android.Manifest.permission.STATUS_BAR); 9334df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 9335df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 9336df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn synchronized (mWindowMap) { 9337df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mLastStatusBarVisibility = visibility; 9338df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn visibility = mPolicy.adjustSystemUiVisibilityLw(visibility); 9339df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn updateStatusBarVisibilityLocked(visibility); 9340df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 9341df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 9342df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 9343df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn void updateStatusBarVisibilityLocked(int visibility) { 934405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mInputManager.setSystemUiVisibility(visibility); 9345df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn final int N = mWindows.size(); 9346df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn for (int i = 0; i < N; i++) { 9347df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn WindowState ws = mWindows.get(i); 9348df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn try { 9349df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn int curValue = ws.mSystemUiVisibility; 9350df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn int diff = curValue ^ visibility; 9351df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn // We are only interested in differences of one of the 9352df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn // clearable flags... 9353df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn diff &= View.SYSTEM_UI_CLEARABLE_FLAGS; 9354df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn // ...if it has actually been cleared. 9355df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn diff &= ~visibility; 9356df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn int newValue = (curValue&~diff) | (visibility&diff); 9357df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn if (newValue != curValue) { 9358df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn ws.mSeq++; 9359df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn ws.mSystemUiVisibility = newValue; 9360df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 9361df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn if (newValue != curValue || ws.mAttrs.hasSystemUiListeners) { 9362df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn ws.mClient.dispatchSystemUiVisibilityChanged(ws.mSeq, 9363df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn visibility, newValue, diff); 9364df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 9365df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } catch (RemoteException e) { 9366df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn // so sorry 9367df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 9368df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 9369df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 9370df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 9371df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn @Override 9372df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn public void reevaluateStatusBarVisibility() { 9373df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn synchronized (mWindowMap) { 9374df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn int visibility = mPolicy.adjustSystemUiVisibilityLw(mLastStatusBarVisibility); 9375df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn updateStatusBarVisibilityLocked(visibility); 9376df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn performLayoutAndPlaceSurfacesLocked(); 9377df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 9378df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 93799a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn 9380df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn @Override 9381df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn public FakeWindow addFakeWindow(Looper looper, InputHandler inputHandler, 9382df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn String name, int windowType, int layoutParamsFlags, boolean canReceiveKeys, 9383df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn boolean hasFocus, boolean touchFullscreen) { 9384664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato synchronized (mWindowMap) { 9385df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn FakeWindowImpl fw = new FakeWindowImpl(this, looper, inputHandler, name, windowType, 9386df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn layoutParamsFlags, canReceiveKeys, hasFocus, touchFullscreen); 9387df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn int i=0; 9388df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn while (i<mFakeWindows.size()) { 9389df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn if (mFakeWindows.get(i).mWindowLayer <= fw.mWindowLayer) { 9390df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn break; 9391664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } 9392664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } 9393df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mFakeWindows.add(i, fw); 9394df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mInputMonitor.updateInputWindowsLw(true); 9395df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn return fw; 9396df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 9397df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 9398df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 9399df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn boolean removeFakeWindowLocked(FakeWindow window) { 9400df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn synchronized (mWindowMap) { 9401df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn if (mFakeWindows.remove(window)) { 9402df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mInputMonitor.updateInputWindowsLw(true); 9403df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn return true; 9404df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 9405df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn return false; 9406664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } 9407664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } 9408664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato 94090c4ccff36930ff4f0292b94ad51e164c9fa060a3Daniel Sandler @Override 94100c4ccff36930ff4f0292b94ad51e164c9fa060a3Daniel Sandler public boolean hasNavigationBar() { 94110c4ccff36930ff4f0292b94ad51e164c9fa060a3Daniel Sandler return mPolicy.hasNavigationBar(); 94120c4ccff36930ff4f0292b94ad51e164c9fa060a3Daniel Sandler } 94130c4ccff36930ff4f0292b94ad51e164c9fa060a3Daniel Sandler 9414a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn void dumpInput(FileDescriptor fd, PrintWriter pw, boolean dumpAll) { 9415a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("WINDOW MANAGER INPUT (dumpsys window input)"); 941600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputManager.dump(pw); 9417a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9418a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9419a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn void dumpPolicyLocked(FileDescriptor fd, PrintWriter pw, String[] args, boolean dumpAll) { 9420a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("WINDOW MANAGER POLICY STATE (dumpsys window policy)"); 9421a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn mPolicy.dump(" ", fd, pw, args); 9422a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9423a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9424a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn void dumpTokensLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll) { 9425a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("WINDOW MANAGER TOKENS (dumpsys window tokens)"); 9426a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mTokenMap.size() > 0) { 9427a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" All tokens:"); 9428a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn Iterator<WindowToken> it = mTokenMap.values().iterator(); 9429a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn while (it.hasNext()) { 9430a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowToken token = it.next(); 9431a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Token "); pw.print(token.token); 9432a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9433a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(':'); 9434a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn token.dump(pw, " "); 9435a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9436a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 94379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 94389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9439a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9440a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mWallpaperTokens.size() > 0) { 9441a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9442a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Wallpaper tokens:"); 9443a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mWallpaperTokens.size()-1; i>=0; i--) { 9444a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowToken token = mWallpaperTokens.get(i); 9445a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Wallpaper #"); pw.print(i); 9446a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(' '); pw.print(token); 9447a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9448a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(':'); 9449a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn token.dump(pw, " "); 9450a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9451a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 94529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 94539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9454a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9455a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mAppTokens.size() > 0) { 9456a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9457a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Application tokens in Z order:"); 9458a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mAppTokens.size()-1; i>=0; i--) { 9459a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" App #"); pw.print(i); pw.print(": "); 9460a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(mAppTokens.get(i)); 94619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9462a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9463a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mFinishedStarting.size() > 0) { 9464a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9465a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Finishing start of application tokens:"); 9466a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mFinishedStarting.size()-1; i>=0; i--) { 9467a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowToken token = mFinishedStarting.get(i); 9468a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Finished Starting #"); pw.print(i); 9469a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(' '); pw.print(token); 9470a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9471a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(':'); 9472a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn token.dump(pw, " "); 9473a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9474a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 94759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 94769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9477a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9478a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mExitingTokens.size() > 0) { 9479a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9480a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Exiting tokens:"); 9481a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mExitingTokens.size()-1; i>=0; i--) { 9482a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowToken token = mExitingTokens.get(i); 9483a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Exiting #"); pw.print(i); 9484a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(' '); pw.print(token); 9485a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9486a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(':'); 9487a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn token.dump(pw, " "); 9488a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9489a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 94909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 94919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9492a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9493a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mExitingAppTokens.size() > 0) { 9494a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9495a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Exiting application tokens:"); 9496a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mExitingAppTokens.size()-1; i>=0; i--) { 9497a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowToken token = mExitingAppTokens.get(i); 9498a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Exiting App #"); pw.print(i); 9499a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(' '); pw.print(token); 9500a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9501a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(':'); 95029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.dump(pw, " "); 9503a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9504a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 95059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 95069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9507a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9508a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9509a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mOpeningApps.size() > 0) { 9510a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mOpeningApps="); pw.println(mOpeningApps); 9511a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9512a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mClosingApps.size() > 0) { 9513a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mClosingApps="); pw.println(mClosingApps); 9514a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9515a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mToTopApps.size() > 0) { 9516a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mToTopApps="); pw.println(mToTopApps); 9517a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9518a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mToBottomApps.size() > 0) { 9519a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mToBottomApps="); pw.println(mToBottomApps); 9520a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9521a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9522a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9523a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn void dumpSessionsLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll) { 9524a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("WINDOW MANAGER SESSIONS (dumpsys window sessions)"); 9525a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mSessions.size() > 0) { 9526a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn Iterator<Session> it = mSessions.iterator(); 9527a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn while (it.hasNext()) { 9528a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn Session s = it.next(); 9529a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Session "); pw.print(s); pw.println(':'); 9530a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn s.dump(pw, " "); 9531a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9532a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9533a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9534a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9535a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn void dumpWindowsLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll, 9536a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn ArrayList<WindowState> windows) { 9537a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("WINDOW MANAGER WINDOWS (dumpsys window windows)"); 9538a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mWindows.size()-1; i>=0; i--) { 9539a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mWindows.get(i); 9540a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (windows == null || windows.contains(w)) { 9541a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Window #"); pw.print(i); pw.print(' '); 9542a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(w); pw.println(":"); 95438962028b6e2f4176e6ceded281e584d223e44982Dianne Hackborn w.dump(pw, " ", dumpAll || windows != null); 9544a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9545a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9546a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mInputMethodDialogs.size() > 0) { 9547a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9548a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Input method dialogs:"); 9549a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mInputMethodDialogs.size()-1; i>=0; i--) { 9550a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mInputMethodDialogs.get(i); 9551a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (windows == null || windows.contains(w)) { 9552a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" IM Dialog #"); pw.print(i); pw.print(": "); pw.println(w); 95534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 95544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 9555a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9556a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mPendingRemove.size() > 0) { 9557a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9558a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Remove pending for:"); 9559a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mPendingRemove.size()-1; i>=0; i--) { 9560a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mPendingRemove.get(i); 9561a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (windows == null || windows.contains(w)) { 9562a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Remove #"); pw.print(i); pw.print(' '); 9563a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(w); 9564a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9565a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(":"); 9566a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn w.dump(pw, " ", true); 9567a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9568a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9569a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 95709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 95719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9572a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9573a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mForceRemoves != null && mForceRemoves.size() > 0) { 9574a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9575a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Windows force removing:"); 9576a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mForceRemoves.size()-1; i>=0; i--) { 9577a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mForceRemoves.get(i); 9578a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Removing #"); pw.print(i); pw.print(' '); 9579a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(w); 9580a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9581a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(":"); 9582a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn w.dump(pw, " ", true); 9583a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9584a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 95859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 95869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9587a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9588a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mDestroySurface.size() > 0) { 9589a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9590a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Windows waiting to destroy their surface:"); 9591a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mDestroySurface.size()-1; i>=0; i--) { 9592a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mDestroySurface.get(i); 9593a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (windows == null || windows.contains(w)) { 9594a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Destroy #"); pw.print(i); pw.print(' '); 9595a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(w); 9596a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9597a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(":"); 9598a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn w.dump(pw, " ", true); 9599a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9600a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9601a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 96029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 96039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9604a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9605a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mLosingFocus.size() > 0) { 9606a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9607a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Windows losing focus:"); 9608a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mLosingFocus.size()-1; i>=0; i--) { 9609a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mLosingFocus.get(i); 9610a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (windows == null || windows.contains(w)) { 9611a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Losing #"); pw.print(i); pw.print(' '); 9612a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(w); 9613a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9614a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(":"); 9615a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn w.dump(pw, " ", true); 9616a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9617a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9618a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9619a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9620a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9621a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9622a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mResizingWindows.size() > 0) { 9623a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9624a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Windows waiting to resize:"); 9625a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mResizingWindows.size()-1; i>=0; i--) { 9626a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mResizingWindows.get(i); 9627a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (windows == null || windows.contains(w)) { 9628a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Resizing #"); pw.print(i); pw.print(' '); 9629a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(w); 9630a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9631a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(":"); 9632a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn w.dump(pw, " ", true); 9633a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9634a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9635a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 96369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 96379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9638a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 963938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn if (mWaitingForDrawn.size() > 0) { 964038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn pw.println(); 964138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn pw.println(" Clients waiting for these windows to be drawn:"); 964238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn for (int i=mWaitingForDrawn.size()-1; i>=0; i--) { 964338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn Pair<WindowState, IRemoteCallback> pair = mWaitingForDrawn.get(i); 964438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn pw.print(" Waiting #"); pw.print(i); pw.print(' '); pw.print(pair.first); 964538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn pw.print(": "); pw.println(pair.second); 964638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } 964738e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn } 9648a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9649a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mDisplay != null) { 9650a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Display: init="); pw.print(mInitialDisplayWidth); pw.print("x"); 9651a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(mInitialDisplayHeight); pw.print(" base="); 9652a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(mBaseDisplayWidth); pw.print("x"); pw.print(mBaseDisplayHeight); 9653a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" cur="); 9654a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(mCurDisplayWidth); pw.print("x"); pw.print(mCurDisplayHeight); 9655a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" app="); 9656a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(mAppDisplayWidth); pw.print("x"); pw.print(mAppDisplayHeight); 9657a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" raw="); pw.print(mDisplay.getRawWidth()); 9658a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print("x"); pw.println(mDisplay.getRawHeight()); 9659a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9660a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" NO DISPLAY"); 9661a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9662a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mCurConfiguration="); pw.println(this.mCurConfiguration); 9663a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mCurrentFocus="); pw.println(mCurrentFocus); 9664a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mLastFocus != mCurrentFocus) { 96651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mLastFocus="); pw.println(mLastFocus); 9666a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9667a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mFocusedApp="); pw.println(mFocusedApp); 9668a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mInputMethodTarget != null) { 96691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mInputMethodTarget="); pw.println(mInputMethodTarget); 9670a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9671a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mInTouchMode="); pw.print(mInTouchMode); 9672a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mLayoutSeq="); pw.println(mLayoutSeq); 9673a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9674df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn if (mLastStatusBarVisibility != 0) { 9675df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn pw.print(" mLastStatusBarVisibility=0x"); 9676df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn pw.println(Integer.toHexString(mLastStatusBarVisibility)); 9677df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 9678a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mInputMethodWindow != null) { 9679a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mInputMethodWindow="); pw.println(mInputMethodWindow); 9680a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9681f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn pw.print(" mWallpaperTarget="); pw.println(mWallpaperTarget); 9682284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (mLowerWallpaperTarget != null && mUpperWallpaperTarget != null) { 9683284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn pw.print(" mLowerWallpaperTarget="); pw.println(mLowerWallpaperTarget); 9684284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn pw.print(" mUpperWallpaperTarget="); pw.println(mUpperWallpaperTarget); 9685284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 96866c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (mWindowDetachedWallpaper != null) { 96876c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn pw.print(" mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper); 96886c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 9689a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mLastWallpaperX="); pw.print(mLastWallpaperX); 9690a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mLastWallpaperY="); pw.println(mLastWallpaperY); 9691a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mInputMethodAnimLayerAdjustment != 0 || 9692a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn mWallpaperAnimLayerAdjustment != 0) { 9693a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mInputMethodAnimLayerAdjustment="); 9694a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(mInputMethodAnimLayerAdjustment); 9695a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mWallpaperAnimLayerAdjustment="); 9696a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(mWallpaperAnimLayerAdjustment); 9697a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9698de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (mWindowAnimationBackgroundSurface != null) { 9699de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn pw.println(" mWindowAnimationBackgroundSurface:"); 9700de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mWindowAnimationBackgroundSurface.printTo(" ", pw); 9701de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 97021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mSystemBooted="); pw.print(mSystemBooted); 97031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mDisplayEnabled="); pw.println(mDisplayEnabled); 97041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mLayoutNeeded="); pw.print(mLayoutNeeded); 97051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mBlurShown="); pw.println(mBlurShown); 97060a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima if (mDimAnimator != null) { 9707de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn pw.println(" mDimAnimator:"); 9708de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mDimAnimator.printTo(" ", pw); 97090a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima } else { 9710a2e92266b3f768f74ab7fcb42972a22d6c739b39Dianne Hackborn pw.println( " no DimAnimator "); 97110a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima } 97121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mDisplayFrozen="); pw.print(mDisplayFrozen); 97131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mWindowsFreezingScreen="); pw.print(mWindowsFreezingScreen); 9714e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn pw.print(" mAppsFreezingScreen="); pw.print(mAppsFreezingScreen); 9715e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn pw.print(" mWaitingForConfig="); pw.println(mWaitingForConfig); 97161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mRotation="); pw.print(mRotation); 9717dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn pw.print(" mAltOrientation="); pw.println(mAltOrientation); 9718bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn pw.print(" mLastWindowForcedOrientation"); pw.print(mLastWindowForcedOrientation); 9719bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn pw.print(" mForcedAppOrientation="); pw.println(mForcedAppOrientation); 972001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown pw.print(" mDeferredRotationPauseCount="); pw.println(mDeferredRotationPauseCount); 97211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mAnimationPending="); pw.print(mAnimationPending); 97221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mWindowAnimationScale="); pw.print(mWindowAnimationScale); 97231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mTransitionWindowAnimationScale="); pw.println(mTransitionAnimationScale); 97241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mNextAppTransition=0x"); 97251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(Integer.toHexString(mNextAppTransition)); 97269d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn pw.print(" mAppTransitionReady="); pw.println(mAppTransitionReady); 97279d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn pw.print(" mAppTransitionRunning="); pw.print(mAppTransitionRunning); 97289d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn pw.print(" mAppTransitionTimeout="); pw.println( mAppTransitionTimeout); 97293b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (mNextAppTransitionPackage != null) { 97303b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn pw.print(" mNextAppTransitionPackage="); 97313b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn pw.print(mNextAppTransitionPackage); 97329d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn pw.print(" mNextAppTransitionEnter=0x"); 97333b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn pw.print(Integer.toHexString(mNextAppTransitionEnter)); 97349d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn pw.print(" mNextAppTransitionExit=0x"); 97353b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn pw.print(Integer.toHexString(mNextAppTransitionExit)); 97363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 97371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mStartingIconInTransition="); pw.print(mStartingIconInTransition); 97381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(", mSkipAppTransitionAnimation="); pw.println(mSkipAppTransitionAnimation); 9739a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9740a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9741a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9742a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn boolean dumpWindows(FileDescriptor fd, PrintWriter pw, String name, String[] args, 9743a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn int opti, boolean dumpAll) { 9744a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn ArrayList<WindowState> windows = new ArrayList<WindowState>(); 9745a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if ("visible".equals(name)) { 9746a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9747a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mWindows.size()-1; i>=0; i--) { 9748a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mWindows.get(i); 9749a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (w.mSurfaceShown) { 9750a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn windows.add(w); 9751a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9752a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 97531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 9754a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9755a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn int objectId = 0; 9756a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn // See if this is an object ID. 9757a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn try { 9758a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn objectId = Integer.parseInt(name, 16); 9759a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn name = null; 9760a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } catch (RuntimeException e) { 97611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 9762a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9763a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mWindows.size()-1; i>=0; i--) { 9764a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mWindows.get(i); 9765a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (name != null) { 9766a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (w.mAttrs.getTitle().toString().contains(name)) { 9767a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn windows.add(w); 9768a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9769a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else if (System.identityHashCode(w) == objectId) { 9770a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn windows.add(w); 9771a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9772a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9773a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 9774a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9775a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9776a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (windows.size() <= 0) { 9777a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return false; 9778a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9779a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9780a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9781a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpWindowsLocked(fd, pw, dumpAll, windows); 9782a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9783a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return true; 9784a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9785a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9786a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn @Override 9787a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 9788a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mContext.checkCallingOrSelfPermission("android.permission.DUMP") 9789a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn != PackageManager.PERMISSION_GRANTED) { 9790a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("Permission Denial: can't dump WindowManager from from pid=" 9791a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn + Binder.getCallingPid() 9792a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn + ", uid=" + Binder.getCallingUid()); 9793a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 9794a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9795a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9796a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn boolean dumpAll = false; 9797a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9798a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn int opti = 0; 9799a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn while (opti < args.length) { 9800a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn String opt = args[opti]; 9801a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (opt == null || opt.length() <= 0 || opt.charAt(0) != '-') { 9802a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn break; 9803a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 9804a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn opti++; 9805a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if ("-a".equals(opt)) { 9806a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpAll = true; 9807a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else if ("-h".equals(opt)) { 9808a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("Window manager dump options:"); 9809a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" [-a] [-h] [cmd] ..."); 9810a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" cmd may be one of:"); 9811a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" i[input]: input subsystem state"); 9812a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" p[policy]: policy state"); 9813a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" s[essions]: active sessions"); 9814a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" t[okens]: token list"); 9815a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" w[indows]: window list"); 9816a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" cmd may also be a NAME to dump windows. NAME may"); 9817a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" be a partial substring in a window name, a"); 9818a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Window hex object identifier, or"); 9819a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" \"all\" for all windows, or"); 9820a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" \"visible\" for the visible windows."); 9821a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" -a: include all available server state."); 9822a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 982387fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn } else { 9824a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("Unknown argument: " + opt + "; use -h for help"); 9825a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9826a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9827a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9828a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn // Is the caller requesting to dump a particular piece of data? 9829a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (opti < args.length) { 9830a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn String cmd = args[opti]; 9831a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn opti++; 9832a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if ("input".equals(cmd) || "i".equals(cmd)) { 9833a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpInput(fd, pw, true); 9834a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 9835a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else if ("policy".equals(cmd) || "p".equals(cmd)) { 9836a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9837a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpPolicyLocked(fd, pw, args, true); 9838a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9839a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 9840a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else if ("sessions".equals(cmd) || "s".equals(cmd)) { 9841a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9842a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpSessionsLocked(fd, pw, true); 9843a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9844a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 9845a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else if ("tokens".equals(cmd) || "t".equals(cmd)) { 9846a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9847a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpTokensLocked(fd, pw, true); 9848a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9849a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 9850a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else if ("windows".equals(cmd) || "w".equals(cmd)) { 9851a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9852a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpWindowsLocked(fd, pw, true, null); 9853a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9854a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 9855a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else if ("all".equals(cmd) || "a".equals(cmd)) { 9856a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9857a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpWindowsLocked(fd, pw, true, null); 9858a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9859a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 9860a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9861a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn // Dumping a single name? 9862a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (!dumpWindows(fd, pw, cmd, args, opti, dumpAll)) { 9863a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("Bad window command, or no windows match: " + cmd); 9864a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("Use -h for help."); 9865a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9866a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 9867a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9868a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9869a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9870a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpInput(fd, pw, dumpAll); 9871a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9872a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9873a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9874a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("-------------------------------------------------------------------------------"); 9875a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9876a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpPolicyLocked(fd, pw, args, dumpAll); 9877a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9878a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9879a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("-------------------------------------------------------------------------------"); 9880a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9881a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpSessionsLocked(fd, pw, dumpAll); 9882a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9883a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9884a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("-------------------------------------------------------------------------------"); 9885a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9886a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpTokensLocked(fd, pw, dumpAll); 9887a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9888a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9889a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("-------------------------------------------------------------------------------"); 989087fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn } 9891a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpWindowsLocked(fd, pw, dumpAll, null); 98929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 98939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 98949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9895349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // Called by the heartbeat to ensure locks are not held indefnitely (for deadlock detection). 98969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void monitor() { 98979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { } 9898983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood synchronized (mKeyguardTokenWatcher) { } 9899ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn } 9900ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 99012992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public interface OnHardKeyboardStatusChangeListener { 99022992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public void onHardKeyboardStatusChange(boolean available, boolean enabled); 99032992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 99049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9905