14501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskipackage com.android.server.wm; 24501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_SAVED_SURFACE; 4275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_STARTING_WINDOW; 5275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_TIMEOUT; 6275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_WINDOWS_DRAWN; 74501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; 84501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; 94501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; 104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; 1143e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoiimport static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE; 124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; 134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_DREAM; 144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG; 154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG; 164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; 174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; 184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM; 194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG; 204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT; 214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; 220bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG; 230bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; 240bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; 250bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT; 260bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS; 270bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; 280bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_POWER; 290bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW; 300bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TOKEN_MOVEMENT; 310bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; 320bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT; 330bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_TRACE; 344ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhangimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEEP_SCREEN_ON; 350bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS; 360bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; 374ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhangimport static com.android.server.wm.WindowManagerDebugConfig.TAG_KEEP_SCREEN_ON; 38192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; 390bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; 40192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.DO_TRAVERSAL; 41192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.NOTIFY_ACTIVITY_DRAWN; 42192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.NOTIFY_APP_TRANSITION_STARTING; 43192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.NOTIFY_STARTING_WINDOW_DRAWN; 44192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.REPORT_LOSING_FOCUS; 45192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.REPORT_WINDOWS_CHANGE; 46192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.SEND_NEW_CONFIGURATION; 47192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.UPDATE_DOCKED_STACK_DIVIDER; 48192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.WINDOW_FREEZE_TIMEOUT; 49192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.LAYOUT_REPEAT_THRESHOLD; 50192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.MAX_ANIMATION_DURATION; 514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES; 524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES; 534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.WINDOWS_FREEZING_SCREENS_NONE; 544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.Bitmap; 564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.Canvas; 574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.PixelFormat; 584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.Rect; 594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.Debug; 604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.PowerManager; 614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.RemoteException; 624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.SystemClock; 634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.Trace; 644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.provider.Settings; 6549b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynskiimport android.util.ArraySet; 664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.util.Slog; 674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.Display; 684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.DisplayInfo; 694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.Surface; 704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.SurfaceControl; 714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.View; 724cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynskiimport android.view.WindowManager.LayoutParams; 734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.animation.Animation; 744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 75d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggiimport com.android.server.wm.WindowManagerService.H; 76d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggi 7724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynskiimport java.io.PrintWriter; 784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport java.util.ArrayList; 794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski/** 814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * Positions windows and their surfaces. 824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * 834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * It sets positions of windows by calculating their frames and then applies this by positioning 844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * surfaces according to these frames. Z layer is still assigned withing WindowManagerService. 854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski */ 864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiclass WindowSurfacePlacer { 87ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowSurfacePlacer" : TAG_WM; 884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private final WindowManagerService mService; 894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private final WallpaperController mWallpaperControllerLocked; 904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mInLayout = false; 924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski /** Only do a maximum of 6 repeated layouts. After that quit */ 944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private int mLayoutRepeatCount; 954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_UPDATE_ROTATION = 1 << 0; 974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_WALLPAPER_MAY_CHANGE = 1 << 1; 984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_FORCE_HIDING_CHANGED = 1 << 2; 994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_ORIENTATION_CHANGE_COMPLETE = 1 << 3; 1004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_TURN_ON_SCREEN = 1 << 4; 1014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_WALLPAPER_ACTION_PENDING = 1 << 5; 1024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean mWallpaperMayChange = false; 1044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean mOrientationChangeComplete = true; 1054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean mWallpaperActionPending = false; 1064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mWallpaperForceHidingChanged = false; 1084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private Object mLastWindowFreezeSource = null; 1094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private Session mHoldScreen = null; 1104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mObscured = false; 1114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mSyswin = false; 1124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private float mScreenBrightness = -1; 1134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private float mButtonBrightness = -1; 1144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private long mUserActivityTimeout = -1; 1154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mUpdateRotation = false; 1164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private final Rect mTmpStartRect = new Rect(); 117b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale private final Rect mTmpContentRect = new Rect(); 1184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Set to true when the display contains content to show the user. 1204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // When false, the display manager may choose to mirror or blank the display. 1214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mDisplayHasContent = false; 1224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Only set while traversing the default display based on its content. 1244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Affects the behavior of mirroring on secondary displays. 1254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mObscureApplicationContentOnSecondaryDisplays = false; 1264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private float mPreferredRefreshRate = 0; 1284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private int mPreferredModeId = 0; 1304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski private boolean mTraversalScheduled; 132c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi private int mDeferDepth = 0; 13324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 13443e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi private boolean mSustainedPerformanceModeEnabled = false; 13543e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi private boolean mSustainedPerformanceModeCurrent = false; 13643e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi 1374ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang // Following variables are for debugging screen wakelock only. 1384ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang // Last window that requires screen wakelock 1394ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang WindowState mHoldScreenWindow = null; 1404ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang // Last window that obscures all windows below 1414ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang WindowState mObsuringWindow = null; 1424ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang 1434cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski private static final class LayerAndToken { 1444cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski public int layer; 1454cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski public AppWindowToken token; 1464cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 1474cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski private final LayerAndToken mTmpLayerAndToken = new LayerAndToken(); 1484cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski 1493dac63a18d9115405404561d327010604420b07bJorim Jaggi private final ArrayList<SurfaceControl> mPendingDestroyingSurfaces = new ArrayList<>(); 1503dac63a18d9115405404561d327010604420b07bJorim Jaggi 1514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski public WindowSurfacePlacer(WindowManagerService service) { 1524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService = service; 1534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked = mService.mWallpaperControllerLocked; 1544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 156c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi /** 157c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi * See {@link WindowManagerService#deferSurfaceLayout()} 158c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi */ 159c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi void deferLayout() { 160c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi mDeferDepth++; 161c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi } 162c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi 163c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi /** 164c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi * See {@link WindowManagerService#continueSurfaceLayout()} 165c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi */ 166c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi void continueLayout() { 167c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi mDeferDepth--; 168c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi if (mDeferDepth <= 0) { 169c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi performSurfacePlacement(); 170c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi } 171c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi } 172c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi 1734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final void performSurfacePlacement() { 174c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi if (mDeferDepth > 0) { 175c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi return; 176c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi } 1774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int loopCount = 6; 1784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski do { 17924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mTraversalScheduled = false; 1804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski performSurfacePlacementLoop(); 1814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.removeMessages(DO_TRAVERSAL); 1824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski loopCount--; 18324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } while (mTraversalScheduled && loopCount > 0); 1844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperActionPending = false; 1854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void performSurfacePlacementLoop() { 1884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mInLayout) { 1894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG) { 1904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski throw new RuntimeException("Recursive call!"); 1914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 192ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout. Callers=" 1934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + Debug.getCallers(3)); 1944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 1954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWaitingForConfig) { 1984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Our configuration has changed (most likely rotation), but we 1994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // don't yet have the complete configuration to report to 2004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // applications. Don't do any window layout until we have it. 2014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 2024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mDisplayReady) { 2054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Not yet initialized, nothing to do. 2064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 2074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "wmLayout"); 2104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mInLayout = true; 2114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean recoveringMemory = false; 2134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mForceRemoves.isEmpty()) { 2144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski recoveringMemory = true; 2154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Wait a little bit for things to settle down, and off we go. 2164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski while (!mService.mForceRemoves.isEmpty()) { 2174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState ws = mService.mForceRemoves.remove(0); 218ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.i(TAG, "Force removing: " + ws); 2194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.removeWindowInnerLocked(ws); 2204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 221ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.w(TAG, "Due to memory failure, waiting a bit for next layout"); 2224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Object tmp = new Object(); 2234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski synchronized (tmp) { 2244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 2254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski tmp.wait(250); 2264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (InterruptedException e) { 2274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 2324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski performSurfacePlacementInner(recoveringMemory); 2334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mInLayout = false; 2354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.needsLayout()) { 2374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (++mLayoutRepeatCount < 6) { 23824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski requestTraversal(); 2394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 240ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.e(TAG, "Performed 6 layouts in a row. Skipping"); 2414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mLayoutRepeatCount = 0; 2424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 2444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mLayoutRepeatCount = 0; 2454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWindowsChanged && !mService.mWindowChangeListeners.isEmpty()) { 2484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.removeMessages(REPORT_WINDOWS_CHANGE); 2494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.sendEmptyMessage(REPORT_WINDOWS_CHANGE); 2504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (RuntimeException e) { 2524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mInLayout = false; 253ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.wtf(TAG, "Unhandled exception while laying out windows", e); 2544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); 2574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski void debugLayoutRepeats(final String msg, int pendingLayoutChanges) { 2604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mLayoutRepeatCount >= LAYOUT_REPEAT_THRESHOLD) { 261ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "Layouts looping: " + msg + 2624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ", mPendingLayoutChanges = 0x" + Integer.toHexString(pendingLayoutChanges)); 2634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // "Something has changed! Let's make it correct now." 2674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void performSurfacePlacementInner(boolean recoveringMemory) { 268ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_WINDOW_TRACE) Slog.v(TAG, "performSurfacePlacementInner: entry. Called by " 269ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski + Debug.getCallers(3)); 2704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int i; 2724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean updateInputWindowsNeeded = false; 2734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mFocusMayChange) { 2754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mFocusMayChange = false; 2764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski updateInputWindowsNeeded = mService.updateFocusedWindowLocked( 2774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/); 2784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Initialize state of exiting tokens. 2814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int numDisplays = mService.mDisplayContents.size(); 2824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 2834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx); 2844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i=displayContent.mExitingTokens.size()-1; i>=0; i--) { 2854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.mExitingTokens.get(i).hasVisible = false; 2864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int stackNdx = mService.mStackIdToStack.size() - 1; stackNdx >= 0; --stackNdx) { 2904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Initialize state of exiting applications. 2914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppTokenList exitingAppTokens = 2924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mStackIdToStack.valueAt(stackNdx).mExitingAppTokens; 2934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int tokenNdx = exitingAppTokens.size() - 1; tokenNdx >= 0; --tokenNdx) { 2944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski exitingAppTokens.get(tokenNdx).hasVisible = false; 2954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mHoldScreen = null; 2994ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang mHoldScreenWindow = null; 3004ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang mObsuringWindow = null; 3014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mScreenBrightness = -1; 3024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mButtonBrightness = -1; 3034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUserActivityTimeout = -1; 3044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mObscureApplicationContentOnSecondaryDisplays = false; 30543e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi mSustainedPerformanceModeCurrent = false; 3064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mTransactionSequence++; 3074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent defaultDisplay = mService.getDefaultDisplayContentLocked(); 3094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayInfo defaultInfo = defaultDisplay.getDisplayInfo(); 3104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int defaultDw = defaultInfo.logicalWidth; 3114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int defaultDh = defaultInfo.logicalHeight; 3124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 313ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 3144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces"); 3154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski SurfaceControl.openTransaction(); 3164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 31724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski applySurfaceChangesTransaction(recoveringMemory, numDisplays, defaultDw, defaultDh); 3184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (RuntimeException e) { 319ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.wtf(TAG, "Unhandled exception in Window Manager", e); 3204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } finally { 3214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski SurfaceControl.closeTransaction(); 322ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 3234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces"); 3244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowList defaultWindows = defaultDisplay.getWindowList(); 3274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If we are ready to perform an app transition, check through 3294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // all of the app tokens to be shown and see if they are ready 3304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // to go. 3314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mAppTransition.isReady()) { 3324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= handleAppTransitionReadyLocked(defaultWindows); 3334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) 3344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski debugLayoutRepeats("after handleAppTransitionReadyLocked", 3354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mAnimator.mAppWindowAnimating && mService.mAppTransition.isRunning()) { 3394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // We have finished the animation of an app transition. To do 3404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // this, we have delayed a lot of operations like showing and 3414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // hiding apps, moving apps in Z-order, etc. The app token list 3424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // reflects the correct Z-order, but the window list may now 3434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // be out of sync with it. So here we will just rebuild the 3444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // entire app window list. Fun! 3454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= 3464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.handleAnimatingStoppedAndTransitionLocked(); 3474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) 3484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski debugLayoutRepeats("after handleAnimStopAndXitionLock", 3494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mWallpaperForceHidingChanged && defaultDisplay.pendingLayoutChanges == 0 3534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && !mService.mAppTransition.isReady()) { 3544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // At this point, there was a window with a wallpaper that 3554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // was force hiding other windows behind it, but now it 3564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // is going away. This may be simple -- just animate 3574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // away the wallpaper and its window -- or it may be 3584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // hard -- the wallpaper now needs to be shown behind 3594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // something that was hidden. 3604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_LAYOUT; 3614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) 3624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski debugLayoutRepeats("after animateAwayWallpaperLocked", 3634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperForceHidingChanged = false; 3664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mWallpaperMayChange) { 3684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_WALLPAPER_LIGHT) 369ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "Wallpaper may change! Adjusting"); 3704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; 3714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("WallpaperMayChange", 3724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mFocusMayChange) { 3764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mFocusMayChange = false; 3774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, 3784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski false /*updateInputWindows*/)) { 3794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski updateInputWindowsNeeded = true; 3804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_ANIM; 3814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.needsLayout()) { 3854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_LAYOUT; 3864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("mLayoutNeeded", 3874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = mService.mResizingWindows.size() - 1; i >= 0; i--) { 3914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState win = mService.mResizingWindows.get(i); 3924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mAppFreezing) { 3934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Don't remove this window until rotation has completed. 3944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski continue; 3954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 396db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang // Discard the saved surface if window size is changed, it can't be reused. 397bef461f6129044bc092f0c3693bfc122d1acb6d1Chong Zhang if (win.mAppToken != null) { 398bef461f6129044bc092f0c3693bfc122d1acb6d1Chong Zhang win.mAppToken.destroySavedSurfaces(); 399db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang } 4004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.reportResized(); 4014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mResizingWindows.remove(i); 4024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 404ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_ORIENTATION && mService.mDisplayFrozen) Slog.v(TAG, 405ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski "With display frozen, orientationChangeComplete=" + mOrientationChangeComplete); 4064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mOrientationChangeComplete) { 4074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_NONE) { 4084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mWindowsFreezingScreen = WINDOWS_FREEZING_SCREENS_NONE; 4094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mLastFinishedFreezeSource = mLastWindowFreezeSource; 4104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.removeMessages(WINDOW_FREEZE_TIMEOUT); 4114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.stopFreezingDisplayLocked(); 4134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Destroy the surface of any windows that are no longer visible. 41619723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski boolean wallpaperDestroyed = false; 41719723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski i = mService.mDestroySurface.size(); 41819723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski if (i > 0) { 41919723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski do { 42019723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski i--; 42119723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski WindowState win = mService.mDestroySurface.get(i); 42219723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski win.mDestroying = false; 42319723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski if (mService.mInputMethodWindow == win) { 42419723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski mService.mInputMethodWindow = null; 42519723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski } 42619723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski if (mWallpaperControllerLocked.isWallpaperTarget(win)) { 42719723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski wallpaperDestroyed = true; 42819723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski } 42913f7be9e0424266be4bf3b5c8c7fdc161e4fe091Robert Carr win.destroyOrSaveSurface(); 43019723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski } while (i > 0); 43119723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski mService.mDestroySurface.clear(); 43219723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski } 4334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Time to remove any exiting tokens? 4354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 4364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx); 4374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ArrayList<WindowToken> exitingTokens = displayContent.mExitingTokens; 4384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = exitingTokens.size() - 1; i >= 0; i--) { 4394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowToken token = exitingTokens.get(i); 4404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!token.hasVisible) { 4414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski exitingTokens.remove(i); 4424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (token.windowType == TYPE_WALLPAPER) { 4434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.removeWallpaperToken(token); 4444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Time to remove any exiting applications? 4504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int stackNdx = mService.mStackIdToStack.size() - 1; stackNdx >= 0; --stackNdx) { 4514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Initialize state of exiting applications. 4524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppTokenList exitingAppTokens = 4534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mStackIdToStack.valueAt(stackNdx).mExitingAppTokens; 4544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = exitingAppTokens.size() - 1; i >= 0; i--) { 4554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken token = exitingAppTokens.get(i); 4564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!token.hasVisible && !mService.mClosingApps.contains(token) && 4574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski (!token.mIsExiting || token.allAppWindows.isEmpty())) { 4584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Make sure there is no animation running on this token, 4594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // so any windows associated with it will be removed as 4604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // soon as their animations are complete 4614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski token.mAppAnimator.clearAnimation(); 4624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski token.mAppAnimator.animating = false; 463ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, 464ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski "performLayout: App token exiting now removed" + token); 4654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski token.removeAppFromTaskLocked(); 4664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (wallpaperDestroyed) { 4714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; 4724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.layoutNeeded = true; 4734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 4764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx); 4774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (displayContent.pendingLayoutChanges != 0) { 4784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.layoutNeeded = true; 4794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Finally update all input windows now that the window changes have stabilized. 4834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputMonitor.updateInputWindowsLw(true /*force*/); 4844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.setHoldScreenLocked(mHoldScreen); 4864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mDisplayFrozen) { 4874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mScreenBrightness < 0 || mScreenBrightness > 1.0f) { 4884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager(-1); 4894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 4904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager( 4914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski toBrightnessOverride(mScreenBrightness)); 4924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mButtonBrightness < 0 4944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || mButtonBrightness > 1.0f) { 4954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManagerInternal.setButtonBrightnessOverrideFromWindowManager(-1); 4964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 4974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManagerInternal.setButtonBrightnessOverrideFromWindowManager( 4984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski toBrightnessOverride(mButtonBrightness)); 4994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManagerInternal.setUserActivityTimeoutOverrideFromWindowManager( 5014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUserActivityTimeout); 5024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 50443e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi if (mSustainedPerformanceModeCurrent != mSustainedPerformanceModeEnabled) { 50543e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi mSustainedPerformanceModeEnabled = mSustainedPerformanceModeCurrent; 50643e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi mService.mPowerManagerInternal.powerHint( 50743e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi mService.mPowerManagerInternal.POWER_HINT_SUSTAINED_PERFORMANCE_MODE, 50843e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi (mSustainedPerformanceModeEnabled ? 1 : 0)); 50943e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi } 51043e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi 5114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mTurnOnScreen) { 5124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mAllowTheaterModeWakeFromLayout 5134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || Settings.Global.getInt(mService.mContext.getContentResolver(), 5144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Settings.Global.THEATER_MODE_ON, 0) == 0) { 5154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_VISIBILITY || DEBUG_POWER) { 516ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "Turning screen on after layout!"); 5174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManager.wakeUp(SystemClock.uptimeMillis(), 5194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "android.server.wm:TURN_ON"); 5204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mTurnOnScreen = false; 5224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mUpdateRotation) { 525ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation"); 5264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.updateRotationUncheckedLocked(false)) { 5274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.sendEmptyMessage(SEND_NEW_CONFIGURATION); 5284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 5294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUpdateRotation = false; 5304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWaitingForDrawnCallback != null || 5344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski (mOrientationChangeComplete && !defaultDisplay.layoutNeeded && 5354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski !mUpdateRotation)) { 5364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.checkDrawnWindowsLocked(); 5374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int N = mService.mPendingRemove.size(); 5404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (N > 0) { 5414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mPendingRemoveTmp.length < N) { 5424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPendingRemoveTmp = new WindowState[N+10]; 5434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPendingRemove.toArray(mService.mPendingRemoveTmp); 5454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPendingRemove.clear(); 5464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski DisplayContentList displayList = new DisplayContentList(); 5474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = 0; i < N; i++) { 5484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState w = mService.mPendingRemoveTmp[i]; 5494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.removeWindowInnerLocked(w); 5504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = w.getDisplayContent(); 5514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (displayContent != null && !displayList.contains(displayContent)) { 5524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayList.add(displayContent); 5534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (DisplayContent displayContent : displayList) { 55792e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski mService.mLayersController.assignLayersLocked(displayContent.getWindowList()); 5584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.layoutNeeded = true; 5594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Remove all deferred displays stacks, tasks, and activities. 5634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int displayNdx = mService.mDisplayContents.size() - 1; displayNdx >= 0; --displayNdx) { 5644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mDisplayContents.valueAt(displayNdx).checkForDeferredActions(); 5654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (updateInputWindowsNeeded) { 5684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputMonitor.updateInputWindowsLw(false /*force*/); 5694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 570b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang mService.setFocusTaskRegionLocked(); 5714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Check to see if we are now in a state where the screen should 5734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // be enabled, because the window obscured flags have changed. 5744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.enableScreenIfNeededLocked(); 5754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.scheduleAnimationLocked(); 5773dac63a18d9115405404561d327010604420b07bJorim Jaggi mService.mWindowPlacerLocked.destroyPendingSurfaces(); 5784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 579ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_WINDOW_TRACE) Slog.e(TAG, 58069cf50f759e264aea0fc7d389ae85cd3121e4cb9Wale Ogunwale "performSurfacePlacementInner exit: animating=" + mService.mAnimator.isAnimating()); 5814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 58324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski private void applySurfaceChangesTransaction(boolean recoveringMemory, int numDisplays, 58424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski int defaultDw, int defaultDh) { 58524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mWatermark != null) { 58624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mWatermark.positionSurface(defaultDw, defaultDh); 58724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 58824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mStrictModeFlash != null) { 58924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mStrictModeFlash.positionSurface(defaultDw, defaultDh); 59024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 59124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mCircularDisplayMask != null) { 59224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mCircularDisplayMask.positionSurface(defaultDw, defaultDh, 59324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mRotation); 59424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 59524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mEmulatorDisplayOverlay != null) { 59624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mEmulatorDisplayOverlay.positionSurface(defaultDw, defaultDh, 59724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mRotation); 59824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 59924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 60024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski boolean focusDisplayed = false; 60124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 60224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 60324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx); 60424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski boolean updateAllDrawn = false; 60524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski WindowList windows = displayContent.getWindowList(); 60624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski DisplayInfo displayInfo = displayContent.getDisplayInfo(); 60724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int displayId = displayContent.getDisplayId(); 60824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int dw = displayInfo.logicalWidth; 60924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int dh = displayInfo.logicalHeight; 61024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int innerDw = displayInfo.appWidth; 61124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int innerDh = displayInfo.appHeight; 61224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY); 61324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 61424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Reset for each display. 61524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mDisplayHasContent = false; 61624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mPreferredRefreshRate = 0; 61724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mPreferredModeId = 0; 61824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 61924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski int repeats = 0; 62024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski do { 62124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski repeats++; 62224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (repeats > 6) { 623ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.w(TAG, "Animation repeat aborted after too many iterations"); 62424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.layoutNeeded = false; 62524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski break; 62624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 62724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 62824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats( 62924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski "On entry to LockedInner", displayContent.pendingLayoutChanges); 63024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 63124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if ((displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0 && 63224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mWallpaperControllerLocked.adjustWallpaperWindows()) { 63392e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski mService.mLayersController.assignLayersLocked(windows); 63424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.layoutNeeded = true; 63524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 63624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 63724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay 63824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && (displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_CONFIG) != 0) { 639ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_LAYOUT) Slog.v(TAG, "Computing new config from layout"); 64024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.updateOrientationFromAppTokensLocked(true)) { 64124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.layoutNeeded = true; 64224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mH.sendEmptyMessage(SEND_NEW_CONFIGURATION); 64324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 64424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 64524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 64624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if ((displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_LAYOUT) != 0) { 64724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.layoutNeeded = true; 64824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 64924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 65024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // FIRST LOOP: Perform a layout, if needed. 65124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (repeats < LAYOUT_REPEAT_THRESHOLD) { 65224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski performLayoutLockedInner(displayContent, repeats == 1, 65324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski false /* updateInputWindows */); 65424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } else { 655ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.w(TAG, "Layout repeat skipped after too many iterations"); 65624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 65724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 65824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // FIRST AND ONE HALF LOOP: Make WindowManagerPolicy think 65924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // it is animating. 66024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges = 0; 66124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 66224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay) { 66324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mPolicy.beginPostLayoutPolicyLw(dw, dh); 66424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski for (int i = windows.size() - 1; i >= 0; i--) { 66524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski WindowState w = windows.get(i); 66624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.mHasSurface) { 66724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mPolicy.applyPostLayoutPolicyLw(w, w.mAttrs, 66824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski w.mAttachedWindow); 66924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 67024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 67124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges |= 67224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mPolicy.finishPostLayoutPolicyLw(); 67324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("after finishPostLayoutPolicyLw", 67424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges); 67524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 67624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } while (displayContent.pendingLayoutChanges != 0); 67724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 67824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mObscured = false; 67924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mSyswin = false; 68024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.resetDimming(); 68124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 68224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Only used if default window 68324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final boolean someoneLosingFocus = !mService.mLosingFocus.isEmpty(); 68424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 68524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski for (int i = windows.size() - 1; i >= 0; i--) { 68624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski WindowState w = windows.get(i); 6870d00c2e25bf8816dbd99f4fcd5c8221e80826a95Robert Carr final Task task = w.getTask(); 68824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final boolean obscuredChanged = w.mObscured != mObscured; 68924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 69024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Update effect. 69124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski w.mObscured = mObscured; 69224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (!mObscured) { 6930abb20f37425fcde40f56e8dcaf7f191db820415Chong Zhang handleNotObscuredLocked(w, displayInfo); 69424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 69524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 696112eb8c1f76fff6a670d7c5f85e8c3d656cd3aa8Chong Zhang w.applyDimLayerIfNeeded(); 69724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 69824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay && obscuredChanged 69924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && mWallpaperControllerLocked.isWallpaperTarget(w) && w.isVisibleLw()) { 70024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // This is the wallpaper target and its obscured state 70124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // changed... make sure the current wallaper's visibility 70224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // has been updated accordingly. 70324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mWallpaperControllerLocked.updateWallpaperVisibility(); 70424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 70524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 70624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final WindowStateAnimator winAnimator = w.mWinAnimator; 70724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 70824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // If the window has moved due to its containing content frame changing, then 709f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski // notify the listeners and optionally animate it. Simply checking a change of 710f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski // position is not enough, because being move due to dock divider is not a trigger 711f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski // for animation. 71224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.hasMoved()) { 71324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Frame has moved, containing content frame has also moved, and we're not 71424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // currently animating... let's do something. 71524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int left = w.mFrame.left; 71624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int top = w.mFrame.top; 717baba78319b954e8e42b8ecfc03b5fedc28a6168bChong Zhang final boolean adjustedForMinimizedDockOrIme = task != null 718baba78319b954e8e42b8ecfc03b5fedc28a6168bChong Zhang && (task.mStack.isAdjustedForMinimizedDockedStack() 719baba78319b954e8e42b8ecfc03b5fedc28a6168bChong Zhang || task.mStack.isAdjustedForIme()); 720f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski if ((w.mAttrs.privateFlags & PRIVATE_FLAG_NO_MOVE_ANIMATION) == 0 721baba78319b954e8e42b8ecfc03b5fedc28a6168bChong Zhang && !w.isDragResizing() && !adjustedForMinimizedDockOrIme 722c7294607fc0debc54e92abac18bec2601a21ce27Robert Carr && (task == null || w.getTask().mStack.hasMovementAnimations()) 723192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggi && !w.mWinAnimator.mLastHidden) { 724f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski winAnimator.setMoveAnimation(left, top); 72524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 72624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 72724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski //TODO (multidisplay): Accessibility supported only for the default display. 72824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mAccessibilityController != null 72924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && displayId == Display.DEFAULT_DISPLAY) { 73024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mAccessibilityController.onSomeWindowResizedOrMovedLocked(); 73124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 73224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 73324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski try { 7347774bd554c28e33b732e449d029137537eb917daWale Ogunwale w.mClient.moved(left, top); 73524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } catch (RemoteException e) { 73624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 737192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggi w.mMovedByResize = false; 73824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 73924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 740ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing"); 74124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski w.mContentChanged = false; 74224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 74324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Moved from updateWindowsAndWallpaperLocked(). 74424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.mHasSurface) { 745679c807210e4d741b4c65ac67d298d1d56abf3eeRobert Carr // If we have recently synchronized a previous transaction for this 746679c807210e4d741b4c65ac67d298d1d56abf3eeRobert Carr // window ensure we don't push through an unsynchronized one now. 747679c807210e4d741b4c65ac67d298d1d56abf3eeRobert Carr winAnimator.deferToPendingTransaction(); 748679c807210e4d741b4c65ac67d298d1d56abf3eeRobert Carr 74924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Take care of the window being ready to display. 75024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final boolean committed = winAnimator.commitFinishDrawingLocked(); 75124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay && committed) { 75224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.mAttrs.type == TYPE_DREAM) { 75324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // HACK: When a dream is shown, it may at that 75424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // point hide the lock screen. So we need to 75524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // redo the layout to let the phone window manager 75624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // make this happen. 75724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges |= 75824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski FINISH_LAYOUT_REDO_LAYOUT; 75924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) { 76024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski debugLayoutRepeats("dream and commitFinishDrawingLocked true", 76124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges); 76224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 76324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 76424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if ((w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) { 76524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_WALLPAPER_LIGHT) 766ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "First draw done in potential wallpaper target " + w); 76724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mWallpaperMayChange = true; 76824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; 76924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) { 77024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski debugLayoutRepeats("wallpaper and commitFinishDrawingLocked true", 77124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges); 77224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 77324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 77424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 775e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang if (!winAnimator.isAnimationStarting() && !winAnimator.isWaitingForOpening()) { 776c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski // Updates the shown frame before we set up the surface. This is needed 777c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski // because the resizing could change the top-left position (in addition to 778c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski // size) of the window. setSurfaceBoundariesLocked uses mShownPosition to 7795c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi // position the surface. 7805c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi // 7815c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi // If an animation is being started, we can't call this method because the 7825c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi // animation hasn't processed its initial transformation yet, but in general 7835c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi // we do want to update the position if the window is animating. 784c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski winAnimator.computeShownFrameLocked(); 785c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski } 78624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski winAnimator.setSurfaceBoundariesLocked(recoveringMemory); 78724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 78824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 78924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final AppWindowToken atoken = w.mAppToken; 79024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_STARTING_WINDOW && atoken != null && w == atoken.startingWindow) { 791ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.d(TAG, "updateWindows: starting " + w 79224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " isOnScreen=" + w.isOnScreen() + " allDrawn=" + atoken.allDrawn 79324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " freezingScreen=" + atoken.mAppAnimator.freezingScreen); 79424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 7958e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang if (atoken != null && (!atoken.allDrawn || !atoken.allDrawnExcludingSaved 7968e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang || atoken.mAppAnimator.freezingScreen)) { 79724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (atoken.lastTransactionSequence != mService.mTransactionSequence) { 79824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.lastTransactionSequence = mService.mTransactionSequence; 79924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.numInterestingWindows = atoken.numDrawnWindows = 0; 8008e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang atoken.numInterestingWindowsExcludingSaved = 0; 8018e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang atoken.numDrawnWindowsExclusingSaved = 0; 80224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.startingDisplayed = false; 80324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 8048e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang if (!atoken.allDrawn && w.mightAffectAllDrawn(false /* visibleOnly */)) { 80524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) { 806ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "Eval win " + w + ": isDrawn=" 80724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + w.isDrawnLw() 8085c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi + ", isAnimationSet=" + winAnimator.isAnimationSet()); 80924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (!w.isDrawnLw()) { 810ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "Not displayed: s=" 811e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr + winAnimator.mSurfaceController 81224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " pv=" + w.mPolicyVisibility 81324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " mDrawState=" + winAnimator.drawStateToString() 81424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " ah=" + w.mAttachedHidden 81524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " th=" + atoken.hiddenRequested 81624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " a=" + winAnimator.mAnimating); 81724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 81824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 819bfc2f8f6c8ac4156e76a50c88a9ac36d864cee36Chong Zhang if (w != atoken.startingWindow) { 8208e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang if (w.isInteresting()) { 82124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.numInterestingWindows++; 82224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.isDrawnLw()) { 82324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.numDrawnWindows++; 82424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) 825ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "tokenMayBeDrawn: " + atoken 8268e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang + " w=" + w + " numInteresting=" 8278e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang + atoken.numInterestingWindows 82824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " freezingScreen=" 82924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + atoken.mAppAnimator.freezingScreen 83024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " mAppFreezing=" + w.mAppFreezing); 83124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski updateAllDrawn = true; 83224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 83324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 83424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } else if (w.isDrawnLw()) { 835275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi mService.mH.sendEmptyMessage(NOTIFY_STARTING_WINDOW_DRAWN); 83624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.startingDisplayed = true; 83724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 83824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 8398e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang if (!atoken.allDrawnExcludingSaved 8408e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang && w.mightAffectAllDrawn(true /* visibleOnly */)) { 8418e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang if (w != atoken.startingWindow && w.isInteresting()) { 8428e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang atoken.numInterestingWindowsExcludingSaved++; 8438e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang if (w.isDrawnLw() && !w.isAnimatingWithSavedSurface()) { 8448e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang atoken.numDrawnWindowsExclusingSaved++; 8458e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) 8468e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang Slog.v(TAG, "tokenMayBeDrawnExcludingSaved: " + atoken 8478e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang + " w=" + w + " numInteresting=" 8488e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang + atoken.numInterestingWindowsExcludingSaved 8498e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang + " freezingScreen=" 8508e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang + atoken.mAppAnimator.freezingScreen 8518e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang + " mAppFreezing=" + w.mAppFreezing); 8528e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang updateAllDrawn = true; 8538e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang } 8548e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang } 8558e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang } 85624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 85724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 85824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay && someoneLosingFocus && w == mService.mCurrentFocus 85924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && w.isDisplayedLw()) { 86024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski focusDisplayed = true; 86124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 86224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 86324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.updateResizingWindows(w); 86424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 86524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 86624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mDisplayManagerInternal.setDisplayProperties(displayId, 86724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mDisplayHasContent, 86824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mPreferredRefreshRate, 86924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mPreferredModeId, 87024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski true /* inTraversal, must call performTraversalInTrans... below */); 87124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 87224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.getDisplayContentLocked(displayId).stopDimmingIfNeeded(); 87324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 87424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (updateAllDrawn) { 87524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski updateAllDrawnLocked(displayContent); 87624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 87724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 87824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 87924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (focusDisplayed) { 88024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mH.sendEmptyMessage(REPORT_LOSING_FOCUS); 88124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 88224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 88324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Give the display manager a chance to adjust properties 88424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // like display rotation if it needs to. 88524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mDisplayManagerInternal.performTraversalInTransactionFromWindowManager(); 88624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 88724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 8884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean isInLayout() { 8894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return mInLayout; 8904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final void performLayoutLockedInner(final DisplayContent displayContent, 8934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean initial, boolean updateInputWindows) { 8944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!displayContent.layoutNeeded) { 8954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 8964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.layoutNeeded = false; 8984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowList windows = displayContent.getWindowList(); 8994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean isDefaultDisplay = displayContent.isDefaultDisplay; 9004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski DisplayInfo displayInfo = displayContent.getDisplayInfo(); 9024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int dw = displayInfo.logicalWidth; 9034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int dh = displayInfo.logicalHeight; 9044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mInputConsumer != null) { 9064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputConsumer.layout(dw, dh); 9074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9090d50d8660dac35f7eceb5d74756de0417095b427Vladislav Kaznacheev if (mService.mWallpaperInputConsumer != null) { 9100d50d8660dac35f7eceb5d74756de0417095b427Vladislav Kaznacheev mService.mWallpaperInputConsumer.layout(dw, dh); 9110d50d8660dac35f7eceb5d74756de0417095b427Vladislav Kaznacheev } 9120d50d8660dac35f7eceb5d74756de0417095b427Vladislav Kaznacheev 9134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int N = windows.size(); 9144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int i; 9154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT) { 917ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "-------------------------------------"); 918ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "performLayout: needed=" 9194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + displayContent.layoutNeeded + " dw=" + dw + " dh=" + dh); 9204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9229ebbe6afe7a433f78ca3d30c9f215c53212c34acSriram Viswanathan mService.mPolicy.beginLayoutLw(isDefaultDisplay, dw, dh, mService.mRotation, 9239ebbe6afe7a433f78ca3d30c9f215c53212c34acSriram Viswanathan mService.mCurConfiguration.uiMode); 9244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (isDefaultDisplay) { 9254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Not needed on non-default displays. 9264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mSystemDecorLayer = mService.mPolicy.getSystemDecorLayerLw(); 9274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mScreenRect.set(0, 0, dw, dh); 9284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 930b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale mService.mPolicy.getContentRectLw(mTmpContentRect); 931b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale displayContent.resize(mTmpContentRect); 9324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int seq = mService.mLayoutSeq+1; 9344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (seq < 0) seq = 0; 9354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mLayoutSeq = seq; 9364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean behindDream = false; 9384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // First perform layout of any root windows (not attached 9404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // to another window). 9414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int topAttached = -1; 9424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = N-1; i >= 0; i--) { 9434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState win = windows.get(i); 9444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Don't do layout of a window if it is not visible, or 9464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // soon won't be visible, to avoid wasting time and funky 9474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // changes while a window is animating away. 9484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final boolean gone = (behindDream && mService.mPolicy.canBeForceHidden(win, win.mAttrs)) 9494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || win.isGoneForLayoutLw(); 9504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT && !win.mLayoutAttached) { 952ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "1ST PASS " + win 9534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame 9544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " mLayoutAttached=" + win.mLayoutAttached 9554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " screen changed=" + win.isConfigChanged()); 9564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken atoken = win.mAppToken; 957ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (gone) Slog.v(TAG, " GONE: mViewVisibility=" 9584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mViewVisibility + " mRelayoutCalled=" 9594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mRelayoutCalled + " hidden=" 9604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mRootToken.hidden + " hiddenRequested=" 9614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + (atoken != null && atoken.hiddenRequested) 9624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " mAttachedHidden=" + win.mAttachedHidden); 963ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski else Slog.v(TAG, " VIS: mViewVisibility=" 9644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mViewVisibility + " mRelayoutCalled=" 9654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mRelayoutCalled + " hidden=" 9664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mRootToken.hidden + " hiddenRequested=" 9674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + (atoken != null && atoken.hiddenRequested) 9684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " mAttachedHidden=" + win.mAttachedHidden); 9694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If this view is GONE, then skip it -- keep the current 9724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // frame, and let the caller know so they can ignore it 9734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // if they want. (We do the normal layout for INVISIBLE 9744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // windows, since that means "perform layout as normal, 9754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // just don't display"). 9764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!gone || !win.mHaveFrame || win.mLayoutNeeded 9775c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi || ((win.isConfigChanged() || win.setInsetsChanged()) 9785c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi && !win.isGoneForLayoutLw() && 9794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ((win.mAttrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0 || 9804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski (win.mHasSurface && win.mAppToken != null && 9814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mAppToken.layoutConfigChanges)))) { 9824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!win.mLayoutAttached) { 9834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (initial) { 984ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial"); 9854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mContentChanged = false; 9864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mAttrs.type == TYPE_DREAM) { 9884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Don't layout windows behind a dream, so that if it 9894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // does stuff like hide the status bar we won't get a 9904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // bad transition when it goes away. 9914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski behindDream = true; 9924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mLayoutNeeded = false; 9944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.prelayout(); 9954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPolicy.layoutWindowLw(win, null); 9964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mLayoutSeq = seq; 9974c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang 9984c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang // Window frames may have changed. Update dim layer with the new bounds. 9994c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang final Task task = win.getTask(); 10004c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang if (task != null) { 10014c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang displayContent.mDimLayerController.updateDimLayer(task); 10024c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang } 10034c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang 1004ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_LAYOUT) Slog.v(TAG, 10054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski " LAYOUT: mFrame=" 10064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mFrame + " mContainingFrame=" 10074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mContainingFrame + " mDisplayFrame=" 10084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mDisplayFrame); 10094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 10104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (topAttached < 0) topAttached = i; 10114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean attachedBehindDream = false; 10164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Now perform layout of attached windows, which usually 10184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // depend on the position of the window they are attached to. 10194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // XXX does not deal with windows that are attached to windows 10204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // that are themselves attached. 10214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = topAttached; i >= 0; i--) { 10224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState win = windows.get(i); 10234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mLayoutAttached) { 1025ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_LAYOUT) Slog.v(TAG, 10264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "2ND PASS " + win + " mHaveFrame=" + win.mHaveFrame + " mViewVisibility=" 10274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mViewVisibility + " mRelayoutCalled=" + win.mRelayoutCalled); 10284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If this view is GONE, then skip it -- keep the current 10294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // frame, and let the caller know so they can ignore it 10304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // if they want. (We do the normal layout for INVISIBLE 10314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // windows, since that means "perform layout as normal, 10324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // just don't display"). 10334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (attachedBehindDream && mService.mPolicy.canBeForceHidden(win, win.mAttrs)) { 10344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski continue; 10354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((win.mViewVisibility != View.GONE && win.mRelayoutCalled) 10374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || !win.mHaveFrame || win.mLayoutNeeded) { 10384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (initial) { 1039ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial"); 10404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mContentChanged = false; 10414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mLayoutNeeded = false; 10434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.prelayout(); 10444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPolicy.layoutWindowLw(win, win.mAttachedWindow); 10454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mLayoutSeq = seq; 1046ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_LAYOUT) Slog.v(TAG, 10474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski " LAYOUT: mFrame=" + win.mFrame + " mContainingFrame=" 10484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mContainingFrame + " mDisplayFrame=" + win.mDisplayFrame); 10494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else if (win.mAttrs.type == TYPE_DREAM) { 10514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Don't layout windows behind a dream, so that if it 10524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // does stuff like hide the status bar we won't get a 10534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // bad transition when it goes away. 10544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski attachedBehindDream = behindDream; 10554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10584c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang // Window frames may have changed. Tell the input dispatcher about it. 10594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputMonitor.setUpdateInputWindowsNeededLw(); 10604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (updateInputWindows) { 10614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputMonitor.updateInputWindowsLw(false /*force*/); 10624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPolicy.finishLayoutLw(); 106561f39a7b988f6a22681a3f9e0bf8121f72ff88c4Jorim Jaggi mService.mH.sendEmptyMessage(UPDATE_DOCKED_STACK_DIVIDER); 10664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski /** 10694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * @param windows List of windows on default display. 10704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * @return bitmap indicating if another pass through layout must be made. 10714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski */ 10724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private int handleAppTransitionReadyLocked(WindowList windows) { 10734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int appsCount = mService.mOpeningApps.size(); 10744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!transitionGoodToGo(appsCount)) { 10754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return 0; 10764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1077ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO"); 10784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int transit = mService.mAppTransition.getAppTransition(); 10794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mSkipAppTransitionAnimation) { 10804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_UNSET; 10814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mSkipAppTransitionAnimation = false; 10834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mNoAnimationNotifyOnTransitionFinished.clear(); 10844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1085d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggi mService.mH.removeMessages(H.APP_TRANSITION_TIMEOUT); 10864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.rebuildAppWindowListLocked(); 10884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperMayChange = false; 10904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // The top-most window will supply the layout params, 10924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // and we will determine it below. 10934cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski LayoutParams animLp = null; 10944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int bestAnimLayer = -1; 10954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean fullscreenAnim = false; 10964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean voiceInteraction = false; 10974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState lowerWallpaperTarget = 10994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.getLowerWallpaperTarget(); 11004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState upperWallpaperTarget = 11014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.getUpperWallpaperTarget(); 11024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean openingAppHasWallpaper = false; 11044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean closingAppHasWallpaper = false; 11054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken lowerWallpaperAppToken; 11064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken upperWallpaperAppToken; 11074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (lowerWallpaperTarget == null) { 11084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski lowerWallpaperAppToken = upperWallpaperAppToken = null; 11094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 11104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski lowerWallpaperAppToken = lowerWallpaperTarget.mAppToken; 11114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski upperWallpaperAppToken = upperWallpaperTarget.mAppToken; 11124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int i; 11154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Do a first pass through the tokens for two 11164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // things: 11174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // (1) Determine if both the closing and opening 11184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // app token sets are wallpaper targets, in which 11194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // case special animations are needed 11204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // (since the wallpaper needs to stay static 11214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // behind them). 11224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // (2) Find the layout params of the top-most 11234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // application window in the tokens, which is 11244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // what will control the animation theme. 11254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int closingAppsCount = mService.mClosingApps.size(); 11264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appsCount = closingAppsCount + mService.mOpeningApps.size(); 11274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = 0; i < appsCount; i++) { 11284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken wtoken; 11294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (i < closingAppsCount) { 11304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken = mService.mClosingApps.valueAt(i); 11314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (wtoken == lowerWallpaperAppToken || wtoken == upperWallpaperAppToken) { 11324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski closingAppHasWallpaper = true; 11334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 11354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken = mService.mOpeningApps.valueAt(i - closingAppsCount); 11364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (wtoken == lowerWallpaperAppToken || wtoken == upperWallpaperAppToken) { 11374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppHasWallpaper = true; 11384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski voiceInteraction |= wtoken.voiceInteraction; 11424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (wtoken.appFullscreen) { 11444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState ws = wtoken.findMainWindow(); 11454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (ws != null) { 11464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski animLp = ws.mAttrs; 11474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski bestAnimLayer = ws.mLayer; 11484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski fullscreenAnim = true; 11494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else if (!fullscreenAnim) { 11514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState ws = wtoken.findMainWindow(); 11524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (ws != null) { 11534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (ws.mLayer > bestAnimLayer) { 11544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski animLp = ws.mAttrs; 11554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski bestAnimLayer = ws.mLayer; 11564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = maybeUpdateTransitToWallpaper(transit, openingAppHasWallpaper, 11624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski closingAppHasWallpaper, lowerWallpaperTarget, upperWallpaperTarget); 11634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If all closing windows are obscured, then there is 11654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // no need to do an animation. This is the case, for 11664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // example, when this transition is being done behind 11674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // the lock screen. 11684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mPolicy.allowAppAnimationsLw()) { 1169ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 11704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Animations disallowed by keyguard or dream."); 11714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski animLp = null; 11724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski processApplicationsAnimatingInPlace(transit); 11754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 117642625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi mTmpLayerAndToken.token = null; 11774cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski handleClosingApps(transit, animLp, voiceInteraction, mTmpLayerAndToken); 11784cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final AppWindowToken topClosingApp = mTmpLayerAndToken.token; 11794cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final int topClosingLayer = mTmpLayerAndToken.layer; 11804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11814cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final AppWindowToken topOpeningApp = handleOpeningApps(transit, 11824cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski animLp, voiceInteraction, topClosingLayer); 11834cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski 11844cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final AppWindowAnimator openingAppAnimator = (topOpeningApp == null) ? null : 11854cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski topOpeningApp.mAppAnimator; 11864cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final AppWindowAnimator closingAppAnimator = (topClosingApp == null) ? null : 11874cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski topClosingApp.mAppAnimator; 11884cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski 118942625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi mService.mAppTransition.goodToGo(openingAppAnimator, closingAppAnimator, 119042625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi mService.mOpeningApps, mService.mClosingApps); 11914cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.mAppTransition.postAnimationCallback(); 11924cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.mAppTransition.clear(); 11934cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski 11944cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.mOpeningApps.clear(); 11954cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.mClosingApps.clear(); 11964cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski 11974cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // This has changed the visibility of windows, so perform 11984cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // a new layout to get them all up-to-date. 11994cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.getDefaultDisplayContentLocked().layoutNeeded = true; 12004cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski 12014cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // TODO(multidisplay): IMEs are only supported on the default display. 12024cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski if (windows == mService.getDefaultWindowListLocked() 12034cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski && !mService.moveInputMethodWindowsIfNeededLocked(true)) { 120492e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski mService.mLayersController.assignLayersLocked(windows); 12054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12064cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, 12074cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski true /*updateInputWindows*/); 12084cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.mFocusMayChange = false; 12094cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.notifyActivityDrawnForKeyguard(); 12104cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski return FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_CONFIG; 12114cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 12124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12134cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski private AppWindowToken handleOpeningApps(int transit, LayoutParams animLp, 12144cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski boolean voiceInteraction, int topClosingLayer) { 12154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken topOpeningApp = null; 12164cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final int appsCount = mService.mOpeningApps.size(); 12174cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski for (int i = 0; i < appsCount; i++) { 12184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken wtoken = mService.mOpeningApps.valueAt(i); 12194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowAnimator appAnimator = wtoken.mAppAnimator; 1220ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now opening app" + wtoken); 12214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!appAnimator.usingTransferredAnimation) { 12234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.clearThumbnail(); 122465d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang appAnimator.setNullAnimation(); 12254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.inPendingTransaction = false; 1227eb22e8ed42bb146060e8ffc94444f70ea47fda04Chong Zhang 12284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.setTokenVisibilityLocked( 12294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken, animLp, true, transit, false, voiceInteraction)){ 12304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This token isn't going to be animating. Add it to the list of tokens to 12314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // be notified of app transition complete since the notification will not be 12324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // sent be the app window animator. 12334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mNoAnimationNotifyOnTransitionFinished.add(wtoken.token); 12344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.updateReportedVisibilityLocked(); 12364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.waitingToShow = false; 12374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.mAllAppWinAnimators.clear(); 12394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int windowsCount = wtoken.allAppWindows.size(); 12404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int j = 0; j < windowsCount; j++) { 12414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.mAllAppWinAnimators.add(wtoken.allAppWindows.get(j).mWinAnimator); 12424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1243ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 1244974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski ">>> OPEN TRANSACTION handleAppTransitionReadyLocked()"); 1245974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski SurfaceControl.openTransaction(); 1246974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski try { 124769cf50f759e264aea0fc7d389ae85cd3121e4cb9Wale Ogunwale mService.mAnimator.orAnimating(appAnimator.showAllWindowsLocked()); 1248974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski } finally { 1249974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski SurfaceControl.closeTransaction(); 1250ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 1251974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski "<<< CLOSE TRANSACTION handleAppTransitionReadyLocked()"); 1252974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski } 12534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); 12544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int topOpeningLayer = 0; 12564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (animLp != null) { 12574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int layer = -1; 1258e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang for (int j = 0; j < wtoken.allAppWindows.size(); j++) { 1259e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang final WindowState win = wtoken.allAppWindows.get(j); 1260c48a354733ff150e4a07f6b0743009001aa4f48dWale Ogunwale // Clearing the mAnimatingExit flag before entering animation. It will be set to true 126178a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski // if app window is removed, or window relayout to invisible. We don't want to 126278a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski // clear it out for windows that get replaced, because the animation depends on 126378a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski // the flag to remove the replaced window. 12647fed68d116f037847f298b7d52f537998c315298Robert Carr // 1265c48a354733ff150e4a07f6b0743009001aa4f48dWale Ogunwale // We also don't clear the mAnimatingExit flag for windows which have the 12667fed68d116f037847f298b7d52f537998c315298Robert Carr // mRemoveOnExit flag. This indicates an explicit remove request has been issued 12677fed68d116f037847f298b7d52f537998c315298Robert Carr // by the client. We should let animation proceed and not clear this flag or 12687fed68d116f037847f298b7d52f537998c315298Robert Carr // they won't eventually be removed by WindowStateAnimator#finishExit. 12697fed68d116f037847f298b7d52f537998c315298Robert Carr if (!win.mWillReplaceWindow && !win.mRemoveOnExit) { 1270c48a354733ff150e4a07f6b0743009001aa4f48dWale Ogunwale win.mAnimatingExit = false; 1271e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang // Clear mAnimating flag together with mAnimatingExit. When animation 1272e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang // changes from exiting to entering, we need to clear this flag until the 1273e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang // new animation gets applied, so that isAnimationStarting() becomes true 1274e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang // until then. 1275e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang // Otherwise applySurfaceChangesTransaction will faill to skip surface 1276e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang // placement for this window during this period, one or more frame will 1277e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang // show up with wrong position or scale. 1278e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang win.mWinAnimator.mAnimating = false; 127978a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski } 12804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mWinAnimator.mAnimLayer > layer) { 12814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski layer = win.mWinAnimator.mAnimLayer; 12824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (topOpeningApp == null || layer > topOpeningLayer) { 12854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topOpeningApp = wtoken; 12864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topOpeningLayer = layer; 12874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12894cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski if (mService.mAppTransition.isNextAppTransitionThumbnailUp()) { 12904cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski createThumbnailAppAnimator(transit, wtoken, topOpeningLayer, topClosingLayer); 12914cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 12924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12934cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski return topOpeningApp; 12944cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 12954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12964cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski private void handleClosingApps(int transit, LayoutParams animLp, boolean voiceInteraction, 12974cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski LayerAndToken layerAndToken) { 12984cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final int appsCount; 12994cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski appsCount = mService.mClosingApps.size(); 13004cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski for (int i = 0; i < appsCount; i++) { 13014cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski AppWindowToken wtoken = mService.mClosingApps.valueAt(i); 1302f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang 1303f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang // If we still have some windows animating with saved surfaces that's 1304f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang // either invisible or already removed, mark them exiting so that they 1305f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang // are disposed of after the exit animation. These are not supposed to 1306f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang // be shown, or are delayed removal until app is actually drawn (in which 1307f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang // case the window will be removed after the animation). 1308f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang wtoken.markSavedSurfaceExiting(); 1309f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang 13104cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final AppWindowAnimator appAnimator = wtoken.mAppAnimator; 1311ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now closing app " + wtoken); 13124cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski appAnimator.clearThumbnail(); 131365d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang appAnimator.setNullAnimation(); 13144cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski wtoken.inPendingTransaction = false; 13154cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.setTokenVisibilityLocked(wtoken, animLp, false, transit, false, 13164cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski voiceInteraction); 13174cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski wtoken.updateReportedVisibilityLocked(); 13184cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // Force the allDrawn flag, because we want to start 13194cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // this guy's animations regardless of whether it's 13204cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // gotten drawn. 13214cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski wtoken.allDrawn = true; 13224cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski wtoken.deferClearAllDrawn = false; 13234cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // Ensure that apps that are mid-starting are also scheduled to have their 13244cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // starting windows removed after the animation is complete 1325c48a354733ff150e4a07f6b0743009001aa4f48dWale Ogunwale if (wtoken.startingWindow != null && !wtoken.startingWindow.mAnimatingExit) { 13264cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.scheduleRemoveStartingWindowLocked(wtoken); 13274cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 13284cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); 13294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13304cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski if (animLp != null) { 13314cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski int layer = -1; 13324cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski for (int j = 0; j < wtoken.windows.size(); j++) { 13334cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski WindowState win = wtoken.windows.get(j); 13344cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski if (win.mWinAnimator.mAnimLayer > layer) { 13354cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski layer = win.mWinAnimator.mAnimLayer; 13364cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 13374cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 13384cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski if (layerAndToken.token == null || layer > layerAndToken.layer) { 13394cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski layerAndToken.token = wtoken; 13404cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski layerAndToken.layer = layer; 13414cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 13424cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 13434cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski if (mService.mAppTransition.isNextAppTransitionThumbnailDown()) { 13444cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski createThumbnailAppAnimator(transit, wtoken, 0, layerAndToken.layer); 13454cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 13464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean transitionGoodToGo(int appsCount) { 1350ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 13514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Checking " + appsCount + " opening apps (frozen=" 13524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + mService.mDisplayFrozen + " timeout=" 13534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + mService.mAppTransition.isTimeout() + ")..."); 1354275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi int reason = APP_TRANSITION_TIMEOUT; 13554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mAppTransition.isTimeout()) { 13564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int i = 0; i < appsCount; i++) { 13574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken wtoken = mService.mOpeningApps.valueAt(i); 1358ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 13594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Check opening app=" + wtoken + ": allDrawn=" 13604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + wtoken.allDrawn + " startingDisplayed=" 13614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + wtoken.startingDisplayed + " startingMoved=" 1362d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang + wtoken.startingMoved + " isRelaunching()=" 1363d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang + wtoken.isRelaunching()); 1364d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang 1365d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang if (wtoken.isRelaunching()) { 1366d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang return false; 1367d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang } 1368db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang 1369275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi final boolean drawnBeforeRestoring = wtoken.allDrawn; 1370bfc2f8f6c8ac4156e76a50c88a9ac36d864cee36Chong Zhang wtoken.restoreSavedSurfaces(); 1371bfc2f8f6c8ac4156e76a50c88a9ac36d864cee36Chong Zhang 13724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!wtoken.allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) { 13734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return false; 13744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1375275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi if (wtoken.allDrawn) { 1376275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi reason = drawnBeforeRestoring ? APP_TRANSITION_WINDOWS_DRAWN 1377275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi : APP_TRANSITION_SAVED_SURFACE; 1378275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } else { 1379275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi reason = APP_TRANSITION_STARTING_WINDOW; 1380275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 13814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13832f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi // We also need to wait for the specs to be fetched, if needed. 13842f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi if (mService.mAppTransition.isFetchingAppTransitionsSpecs()) { 1385ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "isFetchingAppTransitionSpecs=true"); 13862f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi return false; 13872f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi } 13882f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi 13894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If the wallpaper is visible, we need to check it's ready too. 1390275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi boolean wallpaperReady = !mWallpaperControllerLocked.isWallpaperVisible() || 13914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.wallpaperTransitionReady(); 1392275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi if (wallpaperReady) { 1393275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi mService.mH.obtainMessage(NOTIFY_APP_TRANSITION_STARTING, reason, 0).sendToTarget(); 1394275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi return true; 1395275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi } 1396275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi return false; 13974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1398275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi mService.mH.obtainMessage(NOTIFY_APP_TRANSITION_STARTING, reason, 0).sendToTarget(); 13994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return true; 14004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private int maybeUpdateTransitToWallpaper(int transit, boolean openingAppHasWallpaper, 14034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean closingAppHasWallpaper, WindowState lowerWallpaperTarget, 14044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState upperWallpaperTarget) { 14054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // if wallpaper is animating in or out set oldWallpaper to null else to wallpaper 14064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget(); 14074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState oldWallpaper = 14084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.isWallpaperTargetAnimating() 14094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ? null : wallpaperTarget; 141049b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski final ArraySet<AppWindowToken> openingApps = mService.mOpeningApps; 141149b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski final ArraySet<AppWindowToken> closingApps = mService.mClosingApps; 1412ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 14134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "New wallpaper target=" + wallpaperTarget 14144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + ", oldWallpaper=" + oldWallpaper 14154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + ", lower target=" + lowerWallpaperTarget 141649b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski + ", upper target=" + upperWallpaperTarget 141749b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski + ", openingApps=" + openingApps 141849b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski + ", closingApps=" + closingApps); 14194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimateWallpaperWithTarget = false; 14204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (closingAppHasWallpaper && openingAppHasWallpaper) { 14214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) 1422ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "Wallpaper animation!"); 14234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski switch (transit) { 14244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_ACTIVITY_OPEN: 14254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_TASK_OPEN: 14264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_TASK_TO_FRONT: 14274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_WALLPAPER_INTRA_OPEN; 14284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski break; 14294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_ACTIVITY_CLOSE: 14304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_TASK_CLOSE: 14314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_TASK_TO_BACK: 14324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_WALLPAPER_INTRA_CLOSE; 14334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski break; 14344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1435ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 14364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "New transit: " + AppTransition.appTransitionToString(transit)); 143749b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski } else if (oldWallpaper != null && !mService.mOpeningApps.isEmpty() 143849b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski && !openingApps.contains(oldWallpaper.mAppToken) 143949b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski && closingApps.contains(oldWallpaper.mAppToken)) { 144049b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski // We are transitioning from an activity with a wallpaper to one without. 14414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_WALLPAPER_CLOSE; 1442ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 14434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "New transit away from wallpaper: " 14444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + AppTransition.appTransitionToString(transit)); 144549b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw() && 144649b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski openingApps.contains(wallpaperTarget.mAppToken)) { 14474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // We are transitioning from an activity without 14484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // a wallpaper to now showing the wallpaper 14494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_WALLPAPER_OPEN; 1450ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 14514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "New transit into wallpaper: " 14524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + AppTransition.appTransitionToString(transit)); 14534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 14544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimateWallpaperWithTarget = true; 14554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return transit; 14574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski /** 14604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * @param w WindowState this method is applied to. 14610abb20f37425fcde40f56e8dcaf7f191db820415Chong Zhang * @param dispInfo info of the display that the window's obscuring state is checked against. 14624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski */ 14630abb20f37425fcde40f56e8dcaf7f191db820415Chong Zhang private void handleNotObscuredLocked(final WindowState w, final DisplayInfo dispInfo) { 14644cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final LayoutParams attrs = w.mAttrs; 14654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int attrFlags = attrs.flags; 14664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final boolean canBeSeen = w.isDisplayedLw(); 146743e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi final int privateflags = attrs.privateFlags; 14684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14690abb20f37425fcde40f56e8dcaf7f191db820415Chong Zhang if (canBeSeen && w.isObscuringFullscreen(dispInfo)) { 14704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This window completely covers everything behind it, 14714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // so we want to leave all of them as undimmed (for 14724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // performance reasons). 14734ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang if (!mObscured) { 14744ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang mObsuringWindow = w; 14754ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang } 14764ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang 14774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mObscured = true; 14784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (w.mHasSurface) { 14814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((attrFlags&FLAG_KEEP_SCREEN_ON) != 0) { 14824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mHoldScreen = w.mSession; 14834ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang mHoldScreenWindow = w; 14844ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang } else if (DEBUG_KEEP_SCREEN_ON && w == mService.mLastWakeLockHoldingWindow) { 14854ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang Slog.d(TAG_KEEP_SCREEN_ON, "handleNotObscuredLocked: " + w + " was holding " 14864ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang + "screen wakelock but no longer has FLAG_KEEP_SCREEN_ON!!! called by" 14874ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang + Debug.getCallers(10)); 14884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mSyswin && w.mAttrs.screenBrightness >= 0 14904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && mScreenBrightness < 0) { 14914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mScreenBrightness = w.mAttrs.screenBrightness; 14924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mSyswin && w.mAttrs.buttonBrightness >= 0 14944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && mButtonBrightness < 0) { 14954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mButtonBrightness = w.mAttrs.buttonBrightness; 14964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mSyswin && w.mAttrs.userActivityTimeout >= 0 14984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && mUserActivityTimeout < 0) { 14994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUserActivityTimeout = w.mAttrs.userActivityTimeout; 15004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int type = attrs.type; 15034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (canBeSeen 15044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && (type == TYPE_SYSTEM_DIALOG 15054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || type == TYPE_SYSTEM_ERROR 15064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0)) { 15074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mSyswin = true; 15084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (canBeSeen) { 15114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This function assumes that the contents of the default display are 15124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // processed first before secondary displays. 15134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = w.getDisplayContent(); 15144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (displayContent != null && displayContent.isDefaultDisplay) { 15154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // While a dream or keyguard is showing, obscure ordinary application 15164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // content on secondary displays (by forcibly enabling mirroring unless 15174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // there is other content we want to show) but still allow opaque 15184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // keyguard dialogs to be shown. 15194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (type == TYPE_DREAM || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) { 15204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mObscureApplicationContentOnSecondaryDisplays = true; 15214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mDisplayHasContent = true; 15234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else if (displayContent != null && 15244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski (!mObscureApplicationContentOnSecondaryDisplays 15254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || (mObscured && type == TYPE_KEYGUARD_DIALOG))) { 15264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Allow full screen keyguard presentation dialogs to be seen. 15274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mDisplayHasContent = true; 15284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mPreferredRefreshRate == 0 15304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && w.mAttrs.preferredRefreshRate != 0) { 15314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mPreferredRefreshRate = w.mAttrs.preferredRefreshRate; 15324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mPreferredModeId == 0 15344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && w.mAttrs.preferredDisplayModeId != 0) { 15354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mPreferredModeId = w.mAttrs.preferredDisplayModeId; 15364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 153743e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi if ((privateflags & PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE) != 0) { 153843e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi mSustainedPerformanceModeCurrent = true; 153943e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi } 15404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void updateAllDrawnLocked(DisplayContent displayContent) { 15454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // See if any windows have been drawn, so they (and others 15464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // associated with them) can now be shown. 15474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ArrayList<TaskStack> stacks = displayContent.getStacks(); 15484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 15494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final ArrayList<Task> tasks = stacks.get(stackNdx).getTasks(); 15504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) { 15514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppTokenList tokens = tasks.get(taskNdx).mAppTokens; 15524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int tokenNdx = tokens.size() - 1; tokenNdx >= 0; --tokenNdx) { 15534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken wtoken = tokens.get(tokenNdx); 15544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!wtoken.allDrawn) { 15554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int numInteresting = wtoken.numInterestingWindows; 15564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) { 15574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_VISIBILITY) 1558ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "allDrawn: " + wtoken 15594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " interesting=" + numInteresting 15604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " drawn=" + wtoken.numDrawnWindows); 15614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.allDrawn = true; 15624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Force an additional layout pass where WindowStateAnimator# 15634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // commitFinishDrawingLocked() will call performShowLocked(). 15644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.layoutNeeded = true; 15654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.obtainMessage(NOTIFY_ACTIVITY_DRAWN, 15664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.token).sendToTarget(); 15674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15698e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang if (!wtoken.allDrawnExcludingSaved) { 15708e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang int numInteresting = wtoken.numInterestingWindowsExcludingSaved; 15718e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang if (numInteresting > 0 15728e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang && wtoken.numDrawnWindowsExclusingSaved >= numInteresting) { 15738e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang if (DEBUG_VISIBILITY) 15748e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang Slog.v(TAG, "allDrawnExcludingSaved: " + wtoken 15758e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang + " interesting=" + numInteresting 15768e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang + " drawn=" + wtoken.numDrawnWindowsExclusingSaved); 15778e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang wtoken.allDrawnExcludingSaved = true; 15788e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang displayContent.layoutNeeded = true; 15798e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang if (wtoken.isAnimatingInvisibleWithSavedSurface() 15808e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang && !mService.mFinishedEarlyAnim.contains(wtoken)) { 15818e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang mService.mFinishedEarlyAnim.add(wtoken); 15828e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang } 15838e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang } 15848e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang } 15854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private static int toBrightnessOverride(float value) { 15914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return (int)(value * PowerManager.BRIGHTNESS_ON); 15924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void processApplicationsAnimatingInPlace(int transit) { 15954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (transit == AppTransition.TRANSIT_TASK_IN_PLACE) { 15964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Find the focused window 15974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState win = mService.findFocusedWindowLocked( 15984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.getDefaultDisplayContentLocked()); 15994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win != null) { 16004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken wtoken = win.mAppToken; 16014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowAnimator appAnimator = wtoken.mAppAnimator; 16024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) 1603ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "Now animating app in place " + wtoken); 16044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.clearThumbnail(); 160565d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang appAnimator.setNullAnimation(); 16064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.updateTokenInPlaceLocked(wtoken, transit); 16074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.updateReportedVisibilityLocked(); 16084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 16094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.mAllAppWinAnimators.clear(); 16104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int N = wtoken.allAppWindows.size(); 16114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int j = 0; j < N; j++) { 16124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.mAllAppWinAnimators.add(wtoken.allAppWindows.get(j).mWinAnimator); 16134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 16144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); 161569cf50f759e264aea0fc7d389ae85cd3121e4cb9Wale Ogunwale mService.mAnimator.orAnimating(appAnimator.showAllWindowsLocked()); 16164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 16174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 16184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 16194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 16204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void createThumbnailAppAnimator(int transit, AppWindowToken appToken, 16214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int openingLayer, int closingLayer) { 16224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowAnimator openingAppAnimator = (appToken == null) ? null : appToken.mAppAnimator; 16234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (openingAppAnimator == null || openingAppAnimator.animation == null) { 16244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 16254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 16264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int taskId = appToken.mTask.mTaskId; 16274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Bitmap thumbnailHeader = mService.mAppTransition.getAppTransitionThumbnailHeader(taskId); 16284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (thumbnailHeader == null || thumbnailHeader.getConfig() == Bitmap.Config.ALPHA_8) { 1629ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.d(TAG, "No thumbnail header bitmap for: " + taskId); 16304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 16314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 16324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This thumbnail animation is very special, we need to have 16334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // an extra surface with the thumbnail included with the animation. 16344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Rect dirty = new Rect(0, 0, thumbnailHeader.getWidth(), thumbnailHeader.getHeight()); 16354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 16364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // TODO(multi-display): support other displays 16374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = mService.getDefaultDisplayContentLocked(); 16384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final Display display = displayContent.getDisplay(); 16394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayInfo displayInfo = displayContent.getDisplayInfo(); 16404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 16414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Create a new surface for the thumbnail 16424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski SurfaceControl surfaceControl = new SurfaceControl(mService.mFxSession, 16434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "thumbnail anim", dirty.width(), dirty.height(), 16444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN); 16454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski surfaceControl.setLayerStack(display.getLayerStack()); 16464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (SHOW_TRANSACTIONS) { 1647ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.i(TAG, " THUMBNAIL " + surfaceControl + ": CREATE"); 16484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 16494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 16504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Draw the thumbnail onto the surface 16514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Surface drawSurface = new Surface(); 16524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski drawSurface.copyFrom(surfaceControl); 16534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Canvas c = drawSurface.lockCanvas(dirty); 16544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski c.drawBitmap(thumbnailHeader, 0, 0, null); 16554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski drawSurface.unlockCanvasAndPost(c); 16564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski drawSurface.release(); 16574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 16584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Get the thumbnail animation 16594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Animation anim; 16604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mAppTransition.isNextThumbnailTransitionAspectScaled()) { 16614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If this is a multi-window scenario, we use the windows frame as 16624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // destination of the thumbnail header animation. If this is a full screen 16634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // window scenario, we use the whole display as the target. 16644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState win = appToken.findMainWindow(); 16654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Rect appRect = win != null ? win.getContentFrameLw() : 16664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski new Rect(0, 0, displayInfo.appWidth, displayInfo.appHeight); 1667de63d441d7daf0503bcc6d5fd3f4f7efe06e23d3Jorim Jaggi Rect insets = win != null ? win.mContentInsets : null; 16684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // For the new aspect-scaled transition, we want it to always show 16694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // above the animating opening/closing window, and we want to 16704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // synchronize its thumbnail surface with the surface for the 16714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // open/close animation (only on the way down) 16724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski anim = mService.mAppTransition.createThumbnailAspectScaleAnimationLocked(appRect, 1673b20247636b0e0a75edcd327a047b9ea7a9d21b77Winson insets, thumbnailHeader, taskId, mService.mCurConfiguration.uiMode, 1674b20247636b0e0a75edcd327a047b9ea7a9d21b77Winson mService.mCurConfiguration.orientation); 16754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailForceAboveLayer = Math.max(openingLayer, closingLayer); 16764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.deferThumbnailDestruction = 16774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski !mService.mAppTransition.isNextThumbnailTransitionScaleUp(); 16784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 16794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski anim = mService.mAppTransition.createThumbnailScaleAnimationLocked( 16804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayInfo.appWidth, displayInfo.appHeight, transit, thumbnailHeader); 16814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 16824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski anim.restrictDuration(MAX_ANIMATION_DURATION); 16834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski anim.scaleCurrentDuration(mService.getTransitionAnimationScaleLocked()); 16844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 16854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnail = surfaceControl; 16864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailLayer = openingLayer; 16874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailAnimation = anim; 16884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAppTransition.getNextAppTransitionStartRect(taskId, mTmpStartRect); 16894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (Surface.OutOfResourcesException e) { 1690ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.e(TAG, "Can't allocate thumbnail/Canvas surface w=" 16914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + dirty.width() + " h=" + dirty.height(), e); 16924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.clearThumbnail(); 16934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 16944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 16954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 16964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean copyAnimToLayoutParamsLocked() { 16974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean doRequest = false; 16984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 16994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int bulkUpdateParams = mService.mAnimator.mBulkUpdateParams; 17004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_UPDATE_ROTATION) != 0) { 17014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUpdateRotation = true; 17024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski doRequest = true; 17034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 17044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_WALLPAPER_MAY_CHANGE) != 0) { 17054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperMayChange = true; 17064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski doRequest = true; 17074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 17084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0) { 17094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperForceHidingChanged = true; 17104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski doRequest = true; 17114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 17124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_ORIENTATION_CHANGE_COMPLETE) == 0) { 17134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mOrientationChangeComplete = false; 17144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 17154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mOrientationChangeComplete = true; 17164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mLastWindowFreezeSource = mService.mAnimator.mLastWindowFreezeSource; 17174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_NONE) { 17184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski doRequest = true; 17194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 17204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 17214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_TURN_ON_SCREEN) != 0) { 17224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mTurnOnScreen = true; 17234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 17244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_WALLPAPER_ACTION_PENDING) != 0) { 17254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperActionPending = true; 17264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 17274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 17284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return doRequest; 17294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 173024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 173124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski void requestTraversal() { 173224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (!mTraversalScheduled) { 173324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mTraversalScheduled = true; 173424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mH.sendEmptyMessage(DO_TRAVERSAL); 173524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 173624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 173724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 17383dac63a18d9115405404561d327010604420b07bJorim Jaggi /** 17393dac63a18d9115405404561d327010604420b07bJorim Jaggi * Puts the {@param surface} into a pending list to be destroyed after the current transaction 17403dac63a18d9115405404561d327010604420b07bJorim Jaggi * has been committed. 17413dac63a18d9115405404561d327010604420b07bJorim Jaggi */ 17423dac63a18d9115405404561d327010604420b07bJorim Jaggi void destroyAfterTransaction(SurfaceControl surface) { 17433dac63a18d9115405404561d327010604420b07bJorim Jaggi mPendingDestroyingSurfaces.add(surface); 17443dac63a18d9115405404561d327010604420b07bJorim Jaggi } 17453dac63a18d9115405404561d327010604420b07bJorim Jaggi 17463dac63a18d9115405404561d327010604420b07bJorim Jaggi /** 17473dac63a18d9115405404561d327010604420b07bJorim Jaggi * Destroys any surfaces that have been put into the pending list with 17483dac63a18d9115405404561d327010604420b07bJorim Jaggi * {@link #destroyAfterTransaction}. 17493dac63a18d9115405404561d327010604420b07bJorim Jaggi */ 17503dac63a18d9115405404561d327010604420b07bJorim Jaggi void destroyPendingSurfaces() { 17513dac63a18d9115405404561d327010604420b07bJorim Jaggi for (int i = mPendingDestroyingSurfaces.size() - 1; i >= 0; i--) { 17523dac63a18d9115405404561d327010604420b07bJorim Jaggi mPendingDestroyingSurfaces.get(i).destroy(); 17533dac63a18d9115405404561d327010604420b07bJorim Jaggi } 17543dac63a18d9115405404561d327010604420b07bJorim Jaggi mPendingDestroyingSurfaces.clear(); 17553dac63a18d9115405404561d327010604420b07bJorim Jaggi } 17563dac63a18d9115405404561d327010604420b07bJorim Jaggi 175724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski public void dump(PrintWriter pw, String prefix) { 175824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski pw.print(prefix); pw.print("mTraversalScheduled="); pw.println(mTraversalScheduled); 17594ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang pw.print(prefix); pw.print("mHoldScreenWindow="); pw.println(mHoldScreenWindow); 17604ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang pw.print(prefix); pw.print("mObsuringWindow="); pw.println(mObsuringWindow); 176124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 17624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski} 1763