1e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr/* 2e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * Copyright (C) 2017 The Android Open Source Project 3e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * 4e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * Licensed under the Apache License, Version 2.0 (the "License"); 5e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * you may not use this file except in compliance with the License. 6e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * You may obtain a copy of the License at 7e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * 8e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * http://www.apache.org/licenses/LICENSE-2.0 9e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * 10e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * Unless required by applicable law or agreed to in writing, software 11e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * distributed under the License is distributed on an "AS IS" BASIS, 12e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * See the License for the specific language governing permissions and 14e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * limitations under the License 15e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr */ 16e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale 174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskipackage com.android.server.wm; 184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 193878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_SNAPSHOT; 203878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_SPLASH_SCREEN; 21275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_WINDOWS_DRAWN; 2264b8d562115e632ff65a17fab8923a931b0a5000Tony Mak 23935772129d244122e23308b812765d4591a3c04fAdrian Roosimport static android.view.WindowManager.TRANSIT_CRASHING_ACTIVITY_CLOSE; 24c1674270b588f07ae000237708aabd6871d839a5Winson Chungimport static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS; 2598a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggiimport static android.view.WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE; 2698a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggiimport static android.view.WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_OPEN; 27e99bc0501a288735d337f2ff64f8fa47f766a59bAdrian Roosimport static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG; 28e99bc0501a288735d337f2ff64f8fa47f766a59bAdrian Roosimport static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT; 29f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE; 30f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN; 31f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION; 32f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE; 33f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER; 34f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY; 35f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER; 36f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_NONE; 37f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_TASK_CLOSE; 38f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_TASK_IN_PLACE; 39f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_TASK_OPEN; 40f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_TASK_TO_BACK; 41f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_TASK_TO_FRONT; 42f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_WALLPAPER_CLOSE; 43f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_WALLPAPER_INTRA_CLOSE; 44f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_WALLPAPER_INTRA_OPEN; 45f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_WALLPAPER_OPEN; 46a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggiimport static com.android.server.wm.AppTransition.isKeyguardGoingAwayTransit; 4798a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggiimport static com.android.server.wm.AppTransition.isTaskTransit; 480bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG; 490bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; 500bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS; 51192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; 520bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; 53192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.NOTIFY_APP_TRANSITION_STARTING; 54192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.REPORT_WINDOWS_CHANGE; 55192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.LAYOUT_REPEAT_THRESHOLD; 564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES; 574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggiimport android.app.WindowConfiguration; 594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.Debug; 604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.Trace; 6149b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynskiimport android.util.ArraySet; 624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.util.Slog; 633878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport android.util.SparseIntArray; 644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.Display; 65f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport android.view.RemoteAnimationAdapter; 66f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport android.view.RemoteAnimationDefinition; 67f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport android.view.WindowManager; 684cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynskiimport android.view.WindowManager.LayoutParams; 69f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport android.view.WindowManager.TransitionType; 704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.animation.Animation; 714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 7298a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggiimport com.android.internal.annotations.VisibleForTesting; 73d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggiimport com.android.server.wm.WindowManagerService.H; 74d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggi 7524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynskiimport java.io.PrintWriter; 76f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport java.util.function.Predicate; 774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski/** 794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * Positions windows and their surfaces. 804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * 814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * It sets positions of windows by calculating their frames and then applies this by positioning 824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * surfaces according to these frames. Z layer is still assigned withing WindowManagerService. 834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski */ 844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiclass WindowSurfacePlacer { 85ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowSurfacePlacer" : TAG_WM; 864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private final WindowManagerService mService; 874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private final WallpaperController mWallpaperControllerLocked; 884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mInLayout = false; 904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski /** Only do a maximum of 6 repeated layouts. After that quit */ 924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private int mLayoutRepeatCount; 934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_UPDATE_ROTATION = 1 << 0; 954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_WALLPAPER_MAY_CHANGE = 1 << 1; 964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_FORCE_HIDING_CHANGED = 1 << 2; 974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_ORIENTATION_CHANGE_COMPLETE = 1 << 3; 98042059d0ca5cd0138748e70f5b7753ae2c5710bbchaviw static final int SET_WALLPAPER_ACTION_PENDING = 1 << 4; 994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski private boolean mTraversalScheduled; 101c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi private int mDeferDepth = 0; 10224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 1034cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski private static final class LayerAndToken { 1044cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski public int layer; 1054cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski public AppWindowToken token; 1064cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 1074cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski private final LayerAndToken mTmpLayerAndToken = new LayerAndToken(); 1084cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski 1093878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi private final SparseIntArray mTempTransitionReasons = new SparseIntArray(); 1103dac63a18d9115405404561d327010604420b07bJorim Jaggi 111ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi private final Runnable mPerformSurfacePlacement; 112ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi 1134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski public WindowSurfacePlacer(WindowManagerService service) { 1144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService = service; 1150303c5723edfdb4f2db37543544d7cbe9b14df97Wale Ogunwale mWallpaperControllerLocked = mService.mRoot.mWallpaperController; 116ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi mPerformSurfacePlacement = () -> { 117ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi synchronized (mService.mWindowMap) { 118ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi performSurfacePlacement(); 119ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi } 120ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi }; 1214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 123c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi /** 124c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi * See {@link WindowManagerService#deferSurfaceLayout()} 125c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi */ 126c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi void deferLayout() { 127c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi mDeferDepth++; 128c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi } 129c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi 130c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi /** 131c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi * See {@link WindowManagerService#continueSurfaceLayout()} 132c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi */ 133c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi void continueLayout() { 134c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi mDeferDepth--; 135c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi if (mDeferDepth <= 0) { 136c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi performSurfacePlacement(); 137c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi } 138c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi } 139c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi 1401f83308556cb5bb0df3fb64f03b9b68f0aad6c0dJorim Jaggi boolean isLayoutDeferred() { 1411f83308556cb5bb0df3fb64f03b9b68f0aad6c0dJorim Jaggi return mDeferDepth > 0; 1421f83308556cb5bb0df3fb64f03b9b68f0aad6c0dJorim Jaggi } 1431f83308556cb5bb0df3fb64f03b9b68f0aad6c0dJorim Jaggi 1444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final void performSurfacePlacement() { 14502886a82d876aa5e31a92444fec70208599c509cJorim Jaggi performSurfacePlacement(false /* force */); 14602886a82d876aa5e31a92444fec70208599c509cJorim Jaggi } 14702886a82d876aa5e31a92444fec70208599c509cJorim Jaggi 14802886a82d876aa5e31a92444fec70208599c509cJorim Jaggi final void performSurfacePlacement(boolean force) { 14902886a82d876aa5e31a92444fec70208599c509cJorim Jaggi if (mDeferDepth > 0 && !force) { 150c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi return; 151c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi } 1524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int loopCount = 6; 1534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski do { 15424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mTraversalScheduled = false; 1554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski performSurfacePlacementLoop(); 156ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi mService.mAnimationHandler.removeCallbacks(mPerformSurfacePlacement); 1574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski loopCount--; 15824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } while (mTraversalScheduled && loopCount > 0); 159e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale mService.mRoot.mWallpaperActionPending = false; 1604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void performSurfacePlacementLoop() { 1634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mInLayout) { 1644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG) { 1654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski throw new RuntimeException("Recursive call!"); 1664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 167ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout. Callers=" 1684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + Debug.getCallers(3)); 1694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 1704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWaitingForConfig) { 1734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Our configuration has changed (most likely rotation), but we 1744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // don't yet have the complete configuration to report to 1754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // applications. Don't do any window layout until we have it. 1764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 1774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mDisplayReady) { 1804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Not yet initialized, nothing to do. 1814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 1824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "wmLayout"); 1854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mInLayout = true; 1864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean recoveringMemory = false; 1884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mForceRemoves.isEmpty()) { 1894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski recoveringMemory = true; 1904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Wait a little bit for things to settle down, and off we go. 1914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski while (!mService.mForceRemoves.isEmpty()) { 192adde52ee32b656bb436f7e92f39f7d0d97cc9306Wale Ogunwale final WindowState ws = mService.mForceRemoves.remove(0); 193ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.i(TAG, "Force removing: " + ws); 194571771c3fc912e63f83b75693c0f3c85ec9622daWale Ogunwale ws.removeImmediately(); 1954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 196ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.w(TAG, "Due to memory failure, waiting a bit for next layout"); 1974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Object tmp = new Object(); 1984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski synchronized (tmp) { 1994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 2004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski tmp.wait(250); 2014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (InterruptedException e) { 2024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 207e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale mService.mRoot.performSurfacePlacement(recoveringMemory); 2084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mInLayout = false; 2104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2112b06bfc6e90aa293c7058fc6b1d1cf22fbb2ada2Wale Ogunwale if (mService.mRoot.isLayoutNeeded()) { 2124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (++mLayoutRepeatCount < 6) { 21324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski requestTraversal(); 2144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 215ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.e(TAG, "Performed 6 layouts in a row. Skipping"); 2164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mLayoutRepeatCount = 0; 2174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 2194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mLayoutRepeatCount = 0; 2204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWindowsChanged && !mService.mWindowChangeListeners.isEmpty()) { 2234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.removeMessages(REPORT_WINDOWS_CHANGE); 2244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.sendEmptyMessage(REPORT_WINDOWS_CHANGE); 2254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (RuntimeException e) { 2274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mInLayout = false; 228ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.wtf(TAG, "Unhandled exception while laying out windows", e); 2294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); 2324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski void debugLayoutRepeats(final String msg, int pendingLayoutChanges) { 2354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mLayoutRepeatCount >= LAYOUT_REPEAT_THRESHOLD) { 236ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "Layouts looping: " + msg + 2374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ", mPendingLayoutChanges = 0x" + Integer.toHexString(pendingLayoutChanges)); 2384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean isInLayout() { 2424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return mInLayout; 2434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski /** 2464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * @return bitmap indicating if another pass through layout must be made. 2474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski */ 2480303c5723edfdb4f2db37543544d7cbe9b14df97Wale Ogunwale int handleAppTransitionReadyLocked() { 2494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int appsCount = mService.mOpeningApps.size(); 250dbaad384bb79579eb3dfff965b344073ee193572Jorim Jaggi if (!transitionGoodToGo(appsCount, mTempTransitionReasons)) { 2514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return 0; 2524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2538784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "AppTransitionReady"); 2548784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang 255ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO"); 2564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int transit = mService.mAppTransition.getAppTransition(); 257a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi if (mService.mSkipAppTransitionAnimation && !isKeyguardGoingAwayTransit(transit)) { 258f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi transit = WindowManager.TRANSIT_UNSET; 2594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mSkipAppTransitionAnimation = false; 2614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mNoAnimationNotifyOnTransitionFinished.clear(); 2624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 263d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggi mService.mH.removeMessages(H.APP_TRANSITION_TIMEOUT); 2644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2659adfe5776d42c9ddfd4394958993304c9d355229Wale Ogunwale final DisplayContent displayContent = mService.getDefaultDisplayContentLocked(); 2664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 267e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale mService.mRoot.mWallpaperMayChange = false; 2684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 269ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang int i; 270ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang for (i = 0; i < appsCount; i++) { 271ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang final AppWindowToken wtoken = mService.mOpeningApps.valueAt(i); 2720c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale // Clearing the mAnimatingExit flag before entering animation. It's set to true if app 2730c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale // window is removed, or window relayout to invisible. This also affects window 2740c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale // visibility. We need to clear it *before* maybeUpdateTransitToWallpaper() as the 2750c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale // transition selection depends on wallpaper target visibility. 276ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang wtoken.clearAnimatingFlags(); 277ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang } 2780c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale 279ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang // Adjust wallpaper before we pull the lower/upper target, since pending changes 280ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang // (like the clearAnimatingFlags() above) might affect wallpaper target result. 2810c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale // Or, the opening app window should be a wallpaper target. 2820c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale mWallpaperControllerLocked.adjustWallpaperWindowsForAppTransitionIfNeeded(displayContent, 2830303c5723edfdb4f2db37543544d7cbe9b14df97Wale Ogunwale mService.mOpeningApps); 284ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang 285f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi // Determine if closing and opening app token sets are wallpaper targets, in which case 286f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi // special animations are needed. 287f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi final boolean hasWallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget() != null; 288f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi final boolean openingAppHasWallpaper = canBeWallpaperTarget(mService.mOpeningApps) 289f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi && hasWallpaperTarget; 290f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi final boolean closingAppHasWallpaper = canBeWallpaperTarget(mService.mClosingApps) 291f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi && hasWallpaperTarget; 2924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 29398a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi transit = maybeUpdateTransitToTranslucentAnim(transit); 2944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = maybeUpdateTransitToWallpaper(transit, openingAppHasWallpaper, 295f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale closingAppHasWallpaper); 2964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 297f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi // Find the layout params of the top-most application window in the tokens, which is 298f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi // what will control the animation theme. If all closing windows are obscured, then there is 299f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi // no need to do an animation. This is the case, for example, when this transition is being 300f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi // done behind a dream window. 30177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi final ArraySet<Integer> activityTypes = collectActivityTypes(mService.mOpeningApps, 30277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi mService.mClosingApps); 303f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi final AppWindowToken animLpToken = mService.mPolicy.allowAppAnimationsLw() 30477be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi ? findAnimLayoutParamsToken(transit, activityTypes) 305f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi : null; 306f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 307f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi final LayoutParams animLp = getAnimLp(animLpToken); 30877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi overrideWithRemoteAnimationIfSet(animLpToken, transit, activityTypes); 309f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 310f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi final boolean voiceInteraction = containsVoiceInteraction(mService.mOpeningApps) 311f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi || containsVoiceInteraction(mService.mOpeningApps); 3124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 313d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi final int layoutRedo; 314d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi mService.mSurfaceAnimationRunner.deferStartingAnimations(); 315d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi try { 316d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi processApplicationsAnimatingInPlace(transit); 317d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi 318d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi mTmpLayerAndToken.token = null; 319d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi handleClosingApps(transit, animLp, voiceInteraction, mTmpLayerAndToken); 320d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi final AppWindowToken topClosingApp = mTmpLayerAndToken.token; 321d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi final AppWindowToken topOpeningApp = handleOpeningApps(transit, animLp, 322d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi voiceInteraction); 323d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi 324d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi mService.mAppTransition.setLastAppTransition(transit, topOpeningApp, topClosingApp); 325d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi 326d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi final int flags = mService.mAppTransition.getTransitFlags(); 327d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi layoutRedo = mService.mAppTransition.goodToGo(transit, topOpeningApp, 328d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi topClosingApp, mService.mOpeningApps, mService.mClosingApps); 329d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi handleNonAppWindowsInTransition(transit, flags); 330d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi mService.mAppTransition.postAnimationCallback(); 331d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi mService.mAppTransition.clear(); 332d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi } finally { 333d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi mService.mSurfaceAnimationRunner.continueStartingAnimations(); 334d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi } 3354cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski 33602886a82d876aa5e31a92444fec70208599c509cJorim Jaggi mService.mTaskSnapshotController.onTransitionStarting(); 33702886a82d876aa5e31a92444fec70208599c509cJorim Jaggi 3384cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.mOpeningApps.clear(); 3394cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.mClosingApps.clear(); 3405a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi mService.mUnknownAppVisibilityController.clear(); 3414cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski 3424cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // This has changed the visibility of windows, so perform 3434cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // a new layout to get them all up-to-date. 3442b06bfc6e90aa293c7058fc6b1d1cf22fbb2ada2Wale Ogunwale displayContent.setLayoutNeeded(); 3454cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski 3464cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // TODO(multidisplay): IMEs are only supported on the default display. 347ae9adbfb758712caaf11b4ba5c5fd15848dcc3c5Wale Ogunwale final DisplayContent dc = mService.getDefaultDisplayContentLocked(); 3486213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale dc.computeImeTarget(true /* updateImeTarget */); 3494cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, 3504cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski true /*updateInputWindows*/); 3514cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.mFocusMayChange = false; 3528784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang 353dbaad384bb79579eb3dfff965b344073ee193572Jorim Jaggi mService.mH.obtainMessage(NOTIFY_APP_TRANSITION_STARTING, 354dbaad384bb79579eb3dfff965b344073ee193572Jorim Jaggi mTempTransitionReasons.clone()).sendToTarget(); 355dbaad384bb79579eb3dfff965b344073ee193572Jorim Jaggi 3568784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); 3578784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang 358fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi return layoutRedo | FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_CONFIG; 3594cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 3604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 361f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi private static LayoutParams getAnimLp(AppWindowToken wtoken) { 362f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi final WindowState mainWindow = wtoken != null ? wtoken.findMainWindow() : null; 363f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi return mainWindow != null ? mainWindow.mAttrs : null; 364f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 365f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 366f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi /** 367f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * Overrides the pending transition with the remote animation defined for the transition in the 368f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * set of defined remote animations in the app window token. 369f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi */ 37077be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi private void overrideWithRemoteAnimationIfSet(AppWindowToken animLpToken, int transit, 37177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi ArraySet<Integer> activityTypes) { 372935772129d244122e23308b812765d4591a3c04fAdrian Roos if (transit == TRANSIT_CRASHING_ACTIVITY_CLOSE) { 373935772129d244122e23308b812765d4591a3c04fAdrian Roos // The crash transition has higher priority than any involved remote animations. 374935772129d244122e23308b812765d4591a3c04fAdrian Roos return; 375935772129d244122e23308b812765d4591a3c04fAdrian Roos } 376f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi if (animLpToken == null) { 377f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi return; 378f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 379f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi final RemoteAnimationDefinition definition = animLpToken.getRemoteAnimationDefinition(); 380f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi if (definition != null) { 38177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi final RemoteAnimationAdapter adapter = definition.getAdapter(transit, activityTypes); 382f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi if (adapter != null) { 383f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi mService.mAppTransition.overridePendingAppTransitionRemote(adapter); 384f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 385f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 386f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 387f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 388f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi /** 389f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi * @return The window token that determines the animation theme. 390f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi */ 39177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi private AppWindowToken findAnimLayoutParamsToken(@TransitionType int transit, 39277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi ArraySet<Integer> activityTypes) { 393f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi AppWindowToken result; 394f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 395f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi // Remote animations always win, but fullscreen tokens override non-fullscreen tokens. 396f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi result = lookForHighestTokenWithFilter(mService.mClosingApps, mService.mOpeningApps, 397f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi w -> w.getRemoteAnimationDefinition() != null 39877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi && w.getRemoteAnimationDefinition().hasTransition(transit, activityTypes)); 399f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi if (result != null) { 400f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi return result; 401f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 402f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi result = lookForHighestTokenWithFilter(mService.mClosingApps, mService.mOpeningApps, 403f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi w -> w.fillsParent() && w.findMainWindow() != null); 404f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi if (result != null) { 405f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi return result; 406f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 407f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi return lookForHighestTokenWithFilter(mService.mClosingApps, mService.mOpeningApps, 408f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi w -> w.findMainWindow() != null); 409f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 410f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 41177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi /** 41277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi * @return The set of {@link WindowConfiguration.ActivityType}s contained in the set of apps in 41377be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi * {@code array1} and {@code array2}. 41477be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi */ 41577be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi private ArraySet<Integer> collectActivityTypes(ArraySet<AppWindowToken> array1, 41677be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi ArraySet<AppWindowToken> array2) { 41777be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi final ArraySet<Integer> result = new ArraySet<>(); 41877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi for (int i = array1.size() - 1; i >= 0; i--) { 41977be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi result.add(array1.valueAt(i).getActivityType()); 42077be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi } 42177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi for (int i = array2.size() - 1; i >= 0; i--) { 42277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi result.add(array2.valueAt(i).getActivityType()); 42377be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi } 42477be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi return result; 42577be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi } 42677be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi 427f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi private AppWindowToken lookForHighestTokenWithFilter(ArraySet<AppWindowToken> array1, 428f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi ArraySet<AppWindowToken> array2, Predicate<AppWindowToken> filter) { 429f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi final int array1count = array1.size(); 430f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi final int count = array1count + array2.size(); 431f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi int bestPrefixOrderIndex = Integer.MIN_VALUE; 432f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi AppWindowToken bestToken = null; 433f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi for (int i = 0; i < count; i++) { 43477be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi final AppWindowToken wtoken = i < array1count 43577be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi ? array1.valueAt(i) 43677be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi : array2.valueAt(i - array1count); 437f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi final int prefixOrderIndex = wtoken.getPrefixOrderIndex(); 438f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi if (filter.test(wtoken) && prefixOrderIndex > bestPrefixOrderIndex) { 439f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi bestPrefixOrderIndex = prefixOrderIndex; 440f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi bestToken = wtoken; 441f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 442f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 443f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi return bestToken; 444f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 445f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 446f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi private boolean containsVoiceInteraction(ArraySet<AppWindowToken> apps) { 447f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi for (int i = apps.size() - 1; i >= 0; i--) { 448f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi if (apps.valueAt(i).mVoiceInteraction) { 449f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi return true; 450f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 451f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 452f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi return false; 453f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi } 454f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi 4554cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski private AppWindowToken handleOpeningApps(int transit, LayoutParams animLp, 456b7e8a13b5d39ad153132a4a76e732136732afe33Matthew Ng boolean voiceInteraction) { 4574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken topOpeningApp = null; 458b7e8a13b5d39ad153132a4a76e732136732afe33Matthew Ng int topOpeningLayer = Integer.MIN_VALUE; 4594cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final int appsCount = mService.mOpeningApps.size(); 4604cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski for (int i = 0; i < appsCount; i++) { 4614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken wtoken = mService.mOpeningApps.valueAt(i); 462ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now opening app" + wtoken); 4634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 464ab9fcb2197796ab80cbfb226c443e4eb3ffbc15bJorim Jaggi if (!wtoken.setVisibility(animLp, true, transit, false, voiceInteraction)) { 4654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This token isn't going to be animating. Add it to the list of tokens to 4664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // be notified of app transition complete since the notification will not be 4674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // sent be the app window animator. 4684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mNoAnimationNotifyOnTransitionFinished.add(wtoken.token); 4694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.updateReportedVisibilityLocked(); 4714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.waitingToShow = false; 472ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 473974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski ">>> OPEN TRANSACTION handleAppTransitionReadyLocked()"); 47468e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr mService.openSurfaceTransaction(); 475974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski try { 476f5f9e12146a3857c28b8c0fc96c2fa68a2ae40deJorim Jaggi wtoken.showAllWindowsLocked(); 477974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski } finally { 478111aff959919c7b838b107e62e1baef77e3f6382Adrian Roos mService.closeSurfaceTransaction("handleAppTransitionReadyLocked"); 479ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 480974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski "<<< CLOSE TRANSACTION handleAppTransitionReadyLocked()"); 481974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski } 4824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (animLp != null) { 4849f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale final int layer = wtoken.getHighestAnimLayer(); 4854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (topOpeningApp == null || layer > topOpeningLayer) { 4864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topOpeningApp = wtoken; 4874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topOpeningLayer = layer; 4884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4904cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski if (mService.mAppTransition.isNextAppTransitionThumbnailUp()) { 491988f66885cce2149c73e1ea12304fb98163d5efcJorim Jaggi wtoken.attachThumbnailAnimation(); 49264b8d562115e632ff65a17fab8923a931b0a5000Tony Mak } else if (mService.mAppTransition.isNextAppTransitionOpenCrossProfileApps()) { 49364b8d562115e632ff65a17fab8923a931b0a5000Tony Mak wtoken.attachCrossProfileAppsThumbnailAnimation(); 4944cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 4954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4964cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski return topOpeningApp; 4974cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 4984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4994cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski private void handleClosingApps(int transit, LayoutParams animLp, boolean voiceInteraction, 5004cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski LayerAndToken layerAndToken) { 5014cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final int appsCount; 5024cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski appsCount = mService.mClosingApps.size(); 5034cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski for (int i = 0; i < appsCount; i++) { 5044cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski AppWindowToken wtoken = mService.mClosingApps.valueAt(i); 505f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang 506ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now closing app " + wtoken); 50787e5d55e98857bd43984c2395660d88ae20efcfcWinson Chung // TODO: Do we need to add to mNoAnimationNotifyOnTransitionFinished like above if not 50887e5d55e98857bd43984c2395660d88ae20efcfcWinson Chung // animating? 5099f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale wtoken.setVisibility(animLp, false, transit, false, voiceInteraction); 5104cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski wtoken.updateReportedVisibilityLocked(); 5114cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // Force the allDrawn flag, because we want to start 5124cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // this guy's animations regardless of whether it's 5134cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // gotten drawn. 5144cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski wtoken.allDrawn = true; 5154cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski wtoken.deferClearAllDrawn = false; 5164cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // Ensure that apps that are mid-starting are also scheduled to have their 5174cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // starting windows removed after the animation is complete 518ba41f4b9e3629c097cdd7b6538c5bcf4602728b8Jorim Jaggi if (wtoken.startingWindow != null && !wtoken.startingWindow.mAnimatingExit 519ba41f4b9e3629c097cdd7b6538c5bcf4602728b8Jorim Jaggi && wtoken.getController() != null) { 520ba41f4b9e3629c097cdd7b6538c5bcf4602728b8Jorim Jaggi wtoken.getController().removeStartingWindow(); 5214cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 5224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5234cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski if (animLp != null) { 524e4da0c145e89274f98c683d4e045644400ea1a18Wale Ogunwale int layer = wtoken.getHighestAnimLayer(); 5254cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski if (layerAndToken.token == null || layer > layerAndToken.layer) { 5264cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski layerAndToken.token = wtoken; 5274cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski layerAndToken.layer = layer; 5284cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 5294cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 5304cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski if (mService.mAppTransition.isNextAppTransitionThumbnailDown()) { 531988f66885cce2149c73e1ea12304fb98163d5efcJorim Jaggi wtoken.attachThumbnailAnimation(); 5324cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 5334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 536fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi private void handleNonAppWindowsInTransition(int transit, int flags) { 537fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi if (transit == TRANSIT_KEYGUARD_GOING_AWAY) { 538fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi if ((flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER) != 0 539fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi && (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION) == 0) { 540fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi Animation anim = mService.mPolicy.createKeyguardWallpaperExit( 541fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0); 542fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi if (anim != null) { 543fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi mService.getDefaultDisplayContentLocked().mWallpaperController 544fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi .startWallpaperAnimation(anim); 545fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi } 546fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi } 547fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi } 548fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi if (transit == TRANSIT_KEYGUARD_GOING_AWAY 549fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi || transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER) { 550fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi mService.getDefaultDisplayContentLocked().startKeyguardExitOnNonAppWindows( 551fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER, 552fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0); 553fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi } 554fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi } 555fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi 556dbaad384bb79579eb3dfff965b344073ee193572Jorim Jaggi private boolean transitionGoodToGo(int appsCount, SparseIntArray outReasons) { 557ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 5584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Checking " + appsCount + " opening apps (frozen=" 5594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + mService.mDisplayFrozen + " timeout=" 5604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + mService.mAppTransition.isTimeout() + ")..."); 56142769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr final ScreenRotationAnimation screenRotationAnimation = 56242769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr mService.mAnimator.getScreenRotationAnimationLocked( 56342769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr Display.DEFAULT_DISPLAY); 56442769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr 565dbaad384bb79579eb3dfff965b344073ee193572Jorim Jaggi outReasons.clear(); 5664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mAppTransition.isTimeout()) { 56742769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr // Imagine the case where we are changing orientation due to an app transition, but a previous 56842769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr // orientation change is still in progress. We won't process the orientation change 56942769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr // for our transition because we need to wait for the rotation animation to finish. 57042769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr // If we start the app transition at this point, we will interrupt it halfway with a new rotation 57142769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr // animation after the old one finally finishes. It's better to defer the 57242769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr // app transition. 57342769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr if (screenRotationAnimation != null && screenRotationAnimation.isAnimating() && 57442769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr mService.rotationNeedsUpdateLocked()) { 57542769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr if (DEBUG_APP_TRANSITIONS) { 57642769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr Slog.v(TAG, "Delaying app transition for screen rotation animation to finish"); 57742769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr } 57842769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr return false; 57942769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr } 5804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int i = 0; i < appsCount; i++) { 5814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken wtoken = mService.mOpeningApps.valueAt(i); 582ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 5834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Check opening app=" + wtoken + ": allDrawn=" 5844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + wtoken.allDrawn + " startingDisplayed=" 5854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + wtoken.startingDisplayed + " startingMoved=" 586d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang + wtoken.startingMoved + " isRelaunching()=" 58760f9c97a4893644dde4cff4e595091afce5fb099Jorim Jaggi + wtoken.isRelaunching() + " startingWindow=" 58860f9c97a4893644dde4cff4e595091afce5fb099Jorim Jaggi + wtoken.startingWindow); 589d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang 590bfc2f8f6c8ac4156e76a50c88a9ac36d864cee36Chong Zhang 59102886a82d876aa5e31a92444fec70208599c509cJorim Jaggi final boolean allDrawn = wtoken.allDrawn && !wtoken.isRelaunching(); 59202886a82d876aa5e31a92444fec70208599c509cJorim Jaggi if (!allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) { 5934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return false; 5944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5959b58f2ddf83f919241413a7fb523a281a03f1c30Jorim Jaggi final int windowingMode = wtoken.getWindowingMode(); 59602886a82d876aa5e31a92444fec70208599c509cJorim Jaggi if (allDrawn) { 5979b58f2ddf83f919241413a7fb523a281a03f1c30Jorim Jaggi outReasons.put(windowingMode, APP_TRANSITION_WINDOWS_DRAWN); 598275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } else { 5999b58f2ddf83f919241413a7fb523a281a03f1c30Jorim Jaggi outReasons.put(windowingMode, 6009b58f2ddf83f919241413a7fb523a281a03f1c30Jorim Jaggi wtoken.startingData instanceof SplashScreenStartingData 6019b58f2ddf83f919241413a7fb523a281a03f1c30Jorim Jaggi ? APP_TRANSITION_SPLASH_SCREEN 6029b58f2ddf83f919241413a7fb523a281a03f1c30Jorim Jaggi : APP_TRANSITION_SNAPSHOT); 603275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 6044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 6054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 6062f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi // We also need to wait for the specs to be fetched, if needed. 6072f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi if (mService.mAppTransition.isFetchingAppTransitionsSpecs()) { 608ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "isFetchingAppTransitionSpecs=true"); 6092f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi return false; 6102f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi } 6112f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi 6125a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi if (!mService.mUnknownAppVisibilityController.allResolved()) { 6135a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi if (DEBUG_APP_TRANSITIONS) { 6145a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi Slog.v(TAG, "unknownApps is not empty: " 6155a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi + mService.mUnknownAppVisibilityController.getDebugMessage()); 6165a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi } 6175a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi return false; 6185a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi } 6195a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi 6204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If the wallpaper is visible, we need to check it's ready too. 621275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi boolean wallpaperReady = !mWallpaperControllerLocked.isWallpaperVisible() || 6224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.wallpaperTransitionReady(); 623275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi if (wallpaperReady) { 624275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi return true; 625275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 626275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi return false; 6274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 6284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return true; 6294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 6304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 6314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private int maybeUpdateTransitToWallpaper(int transit, boolean openingAppHasWallpaper, 632f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale boolean closingAppHasWallpaper) { 633935772129d244122e23308b812765d4591a3c04fAdrian Roos // Given no app transition pass it through instead of a wallpaper transition. 634935772129d244122e23308b812765d4591a3c04fAdrian Roos // Never convert the crashing transition. 635c1674270b588f07ae000237708aabd6871d839a5Winson Chung // Never update the transition for the wallpaper if we are just docking from recents 636935772129d244122e23308b812765d4591a3c04fAdrian Roos if (transit == TRANSIT_NONE || transit == TRANSIT_CRASHING_ACTIVITY_CLOSE 637935772129d244122e23308b812765d4591a3c04fAdrian Roos || transit == TRANSIT_DOCK_TASK_FROM_RECENTS) { 638935772129d244122e23308b812765d4591a3c04fAdrian Roos return transit; 639c1674270b588f07ae000237708aabd6871d839a5Winson Chung } 64026a1cecd2f9e99d7024d80748f165762a82df1e1Matthew Ng 6414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // if wallpaper is animating in or out set oldWallpaper to null else to wallpaper 6424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget(); 6430c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale final WindowState oldWallpaper = mWallpaperControllerLocked.isWallpaperTargetAnimating() 6440c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale ? null : wallpaperTarget; 64549b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski final ArraySet<AppWindowToken> openingApps = mService.mOpeningApps; 64649b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski final ArraySet<AppWindowToken> closingApps = mService.mClosingApps; 647a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi final AppWindowToken topOpeningApp = getTopApp(mService.mOpeningApps, 648a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi false /* ignoreHidden */); 649a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi final AppWindowToken topClosingApp = getTopApp(mService.mClosingApps, 650a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi true /* ignoreHidden */); 651a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi 652fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi boolean openingCanBeWallpaperTarget = canBeWallpaperTarget(openingApps); 653ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 6544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "New wallpaper target=" + wallpaperTarget 6554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + ", oldWallpaper=" + oldWallpaper 65649b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski + ", openingApps=" + openingApps 65749b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski + ", closingApps=" + closingApps); 658a5e105728fb87264b9dc2e66b3703168f8864110Jorim Jaggi 659a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi if (openingCanBeWallpaperTarget && transit == TRANSIT_KEYGUARD_GOING_AWAY) { 660fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi transit = TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER; 661fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 662fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi "New transit: " + AppTransition.appTransitionToString(transit)); 663a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi } 664a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi // We never want to change from a Keyguard transit to a non-Keyguard transit, as our logic 665a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi // relies on the fact that we always execute a Keyguard transition after preparing one. 666a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi else if (!isKeyguardGoingAwayTransit(transit)) { 667a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi if (closingAppHasWallpaper && openingAppHasWallpaper) { 668a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Wallpaper animation!"); 669a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi switch (transit) { 670a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi case TRANSIT_ACTIVITY_OPEN: 671a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi case TRANSIT_TASK_OPEN: 672a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi case TRANSIT_TASK_TO_FRONT: 673a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi transit = TRANSIT_WALLPAPER_INTRA_OPEN; 674a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi break; 675a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi case TRANSIT_ACTIVITY_CLOSE: 676a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi case TRANSIT_TASK_CLOSE: 677a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi case TRANSIT_TASK_TO_BACK: 678a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi transit = TRANSIT_WALLPAPER_INTRA_CLOSE; 679a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi break; 680a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi } 681a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 682a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi "New transit: " + AppTransition.appTransitionToString(transit)); 683a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi } else if (oldWallpaper != null && !mService.mOpeningApps.isEmpty() 684a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi && !openingApps.contains(oldWallpaper.mAppToken) 685a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi && closingApps.contains(oldWallpaper.mAppToken) 686a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi && topClosingApp == oldWallpaper.mAppToken) { 687a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi // We are transitioning from an activity with a wallpaper to one without. 688a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi transit = TRANSIT_WALLPAPER_CLOSE; 689a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit away from wallpaper: " 690a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi + AppTransition.appTransitionToString(transit)); 69198a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw() 69298a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi && openingApps.contains(wallpaperTarget.mAppToken) 693a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi && topOpeningApp == wallpaperTarget.mAppToken 69498a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi && transit != TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE) { 695a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi // We are transitioning from an activity without 696a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi // a wallpaper to now showing the wallpaper 697a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi transit = TRANSIT_WALLPAPER_OPEN; 698a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit into wallpaper: " 699a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi + AppTransition.appTransitionToString(transit)); 700a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi } 7014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 7024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return transit; 7034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 7044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 70598a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi /** 70698a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi * There are cases where we open/close a new task/activity, but in reality only a translucent 70798a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi * activity on top of existing activities is opening/closing. For that one, we have a different 70898a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi * animation because non of the task/activity animations actually work well with translucent 70998a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi * apps. 71098a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi * 71198a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi * @param transit The current transition type. 71298a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi * @return The current transition type or 71398a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi * {@link WindowManager#TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE}/ 71498a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi * {@link WindowManager#TRANSIT_TRANSLUCENT_ACTIVITY_OPEN} if appropriate for the 71598a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi * situation. 71698a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi */ 71798a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi @VisibleForTesting 71898a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi int maybeUpdateTransitToTranslucentAnim(int transit) { 71998a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi final boolean taskOrActivity = AppTransition.isTaskTransit(transit) 72098a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi || AppTransition.isActivityTransit(transit); 72198a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi boolean allOpeningVisible = true; 72298a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi boolean allTranslucentOpeningApps = !mService.mOpeningApps.isEmpty(); 72398a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi for (int i = mService.mOpeningApps.size() - 1; i >= 0; i--) { 72498a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi final AppWindowToken token = mService.mOpeningApps.valueAt(i); 72598a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi if (!token.isVisible()) { 72698a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi allOpeningVisible = false; 72798a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi if (token.fillsParent()) { 72898a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi allTranslucentOpeningApps = false; 72998a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi } 73098a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi } 73198a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi } 73298a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi boolean allTranslucentClosingApps = !mService.mClosingApps.isEmpty(); 73398a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi for (int i = mService.mClosingApps.size() - 1; i >= 0; i--) { 73498a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi if (mService.mClosingApps.valueAt(i).fillsParent()) { 73598a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi allTranslucentClosingApps = false; 73698a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi break; 73798a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi } 73898a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi } 73998a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi 74098a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi if (taskOrActivity && allTranslucentClosingApps && allOpeningVisible) { 74198a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi return TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE; 74298a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi } 74398a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi if (taskOrActivity && allTranslucentOpeningApps && mService.mClosingApps.isEmpty()) { 74498a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi return TRANSIT_TRANSLUCENT_ACTIVITY_OPEN; 74598a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi } 74698a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi return transit; 74798a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi } 74898a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi 749fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi private boolean canBeWallpaperTarget(ArraySet<AppWindowToken> apps) { 750fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi for (int i = apps.size() - 1; i >= 0; i--) { 751fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi if (apps.valueAt(i).windowsCanBeWallpaperTarget()) { 752fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi return true; 753fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi } 754fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi } 755fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi return false; 756fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi } 757fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi 758a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi /** 759a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi * Finds the top app in a list of apps, using its {@link AppWindowToken#getPrefixOrderIndex} to 760a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi * compare z-order. 761a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi * 762a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi * @param apps The list of apps to search. 763a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi * @param ignoreHidden If set to true, ignores apps that are {@link AppWindowToken#isHidden}. 764a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi * @return The top {@link AppWindowToken}. 765a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi */ 766a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi private AppWindowToken getTopApp(ArraySet<AppWindowToken> apps, boolean ignoreHidden) { 767a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi int topPrefixOrderIndex = Integer.MIN_VALUE; 768a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi AppWindowToken topApp = null; 769a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi for (int i = apps.size() - 1; i >= 0; i--) { 770a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi final AppWindowToken app = apps.valueAt(i); 771a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi if (ignoreHidden && app.isHidden()) { 772a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi continue; 773a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi } 774a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi final int prefixOrderIndex = app.getPrefixOrderIndex(); 775a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi if (prefixOrderIndex > topPrefixOrderIndex) { 776a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi topPrefixOrderIndex = prefixOrderIndex; 777a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi topApp = app; 778a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi } 779a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi } 780a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi return topApp; 781a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi } 782a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi 7834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void processApplicationsAnimatingInPlace(int transit) { 7840c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale if (transit == TRANSIT_TASK_IN_PLACE) { 7854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Find the focused window 78663d4ecc7a5c23f1ebbd3d71e5054041d90df9762Wale Ogunwale final WindowState win = mService.getDefaultDisplayContentLocked().findFocusedWindow(); 7874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win != null) { 7884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken wtoken = win.mAppToken; 7894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) 790ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "Now animating app in place " + wtoken); 791f5f9e12146a3857c28b8c0fc96c2fa68a2ae40deJorim Jaggi wtoken.cancelAnimation(); 792f5f9e12146a3857c28b8c0fc96c2fa68a2ae40deJorim Jaggi wtoken.applyAnimationLocked(null, transit, false, false); 7934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.updateReportedVisibilityLocked(); 794f5f9e12146a3857c28b8c0fc96c2fa68a2ae40deJorim Jaggi wtoken.showAllWindowsLocked(); 7954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 7964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 7974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 7984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 79924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski void requestTraversal() { 80024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (!mTraversalScheduled) { 80124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mTraversalScheduled = true; 802ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi mService.mAnimationHandler.post(mPerformSurfacePlacement); 80324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 80424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 80524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 80624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski public void dump(PrintWriter pw, String prefix) { 807e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale pw.println(prefix + "mTraversalScheduled=" + mTraversalScheduled); 808e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale pw.println(prefix + "mHoldScreenWindow=" + mService.mRoot.mHoldScreenWindow); 809d4a00a027265e5abfae335e38bd17fd744e3a2c3Wale Ogunwale pw.println(prefix + "mObscuringWindow=" + mService.mRoot.mObscuringWindow); 81024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 8114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski} 812