15098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggi/* 25098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggi * Copyright (C) 2015 The Android Open Source Project 35098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggi * 45098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License"); 55098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggi * you may not use this file except in compliance with the License. 65098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggi * You may obtain a copy of the License at 75098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggi * 85098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggi * http://www.apache.org/licenses/LICENSE-2.0 95098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggi * 105098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggi * Unless required by applicable law or agreed to in writing, software 115098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS, 125098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggi * See the License for the specific language governing permissions and 145098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggi * limitations under the License. 155098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggi */ 1692e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski 175098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggipackage com.android.server.wm; 1892e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski 1992e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynskiimport android.util.Slog; 2092e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynskiimport android.view.Display; 2192e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski 2226b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwaleimport java.util.ArrayDeque; 231e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwaleimport java.util.function.Consumer; 2492e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski 258347163dbb64fb61012c0393163283106a0a351eWinson Chungimport static android.app.ActivityManager.StackId.ASSISTANT_STACK_ID; 2626b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwaleimport static android.app.ActivityManager.StackId.DOCKED_STACK_ID; 2726b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwaleimport static android.app.ActivityManager.StackId.PINNED_STACK_ID; 2844fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwaleimport static android.view.Display.DEFAULT_DISPLAY; 295098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggiimport static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; 305098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYERS; 315098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; 325098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggiimport static com.android.server.wm.WindowManagerService.WINDOW_LAYER_MULTIPLIER; 335098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggi 3492e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski/** 3592e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski * Controller for assigning layers to windows on the display. 3692e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski * 3792e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski * This class encapsulates general algorithm for assigning layers and special rules that we need to 3892e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski * apply on top. The general algorithm goes through windows from bottom to the top and the higher 3992e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski * the window is, the higher layer is assigned. The final layer is equal to base layer + 4092e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski * adjustment from the order. This means that the window list is assumed to be ordered roughly by 4192e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski * the base layer (there are exceptions, e.g. due to keyguard and wallpaper and they need to be 4292e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski * handled with care, because they break the algorithm). 4392e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski * 4492e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski * On top of the general algorithm we add special rules, that govern such amazing things as: 4592e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski * <li>IME (which has higher base layer, but will be positioned above application windows)</li> 4692e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski * <li>docked/pinned windows (that need to be lifted above other application windows, including 4792e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski * animations) 4892e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski * <li>dock divider (which needs to live above applications, but below IME)</li> 4992e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski * <li>replaced windows, which need to live above their normal level, because they anticipate 5092e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski * an animation</li>. 5192e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski */ 52c69694abbdbfa3f0bedb034e7cc86823a72ff781Wale Ogunwaleclass WindowLayersController { 5392e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski private final WindowManagerService mService; 5492e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski 55c69694abbdbfa3f0bedb034e7cc86823a72ff781Wale Ogunwale WindowLayersController(WindowManagerService service) { 5692e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski mService = service; 5792e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski } 5892e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski 5992e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski private int mHighestApplicationLayer = 0; 6026b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale private ArrayDeque<WindowState> mPinnedWindows = new ArrayDeque<>(); 6126b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale private ArrayDeque<WindowState> mDockedWindows = new ArrayDeque<>(); 628347163dbb64fb61012c0393163283106a0a351eWinson Chung private ArrayDeque<WindowState> mAssistantWindows = new ArrayDeque<>(); 63b976877a4b62a6030fe67796ab8a6a69b4cc041fRobert Carr private ArrayDeque<WindowState> mInputMethodWindows = new ArrayDeque<>(); 6492e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski private WindowState mDockDivider = null; 6526b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale private ArrayDeque<WindowState> mReplacingWindows = new ArrayDeque<>(); 66d1880960581d526cbaed0566d522987d9301b293Wale Ogunwale private int mCurBaseLayer; 67d1880960581d526cbaed0566d522987d9301b293Wale Ogunwale private int mCurLayer; 68d1880960581d526cbaed0566d522987d9301b293Wale Ogunwale private boolean mAnyLayerChanged; 6944fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale private int mHighestLayerInImeTargetBaseLayer; 7044fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale private WindowState mImeTarget; 71ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale private boolean mAboveImeTarget; 72ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale private ArrayDeque<WindowState> mAboveImeTargetAppWindows = new ArrayDeque(); 7392e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski 741e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale private final Consumer<WindowState> mAssignWindowLayersConsumer = w -> { 751e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale boolean layerChanged = false; 761e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 771e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale int oldLayer = w.mLayer; 781e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale if (w.mBaseLayer == mCurBaseLayer) { 791e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale mCurLayer += WINDOW_LAYER_MULTIPLIER; 801e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale } else { 811e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale mCurBaseLayer = mCurLayer = w.mBaseLayer; 821e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale } 831e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale assignAnimLayer(w, mCurLayer); 841e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 851e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale // TODO: Preserved old behavior of code here but not sure comparing oldLayer to 861e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale // mAnimLayer and mLayer makes sense...though the worst case would be unintentional 871e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale // layer reassignment. 881e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale if (w.mLayer != oldLayer || w.mWinAnimator.mAnimLayer != oldLayer) { 891e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale layerChanged = true; 901e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale mAnyLayerChanged = true; 911e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale } 921e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 931e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale if (w.mAppToken != null) { 941e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale mHighestApplicationLayer = Math.max(mHighestApplicationLayer, 951e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale w.mWinAnimator.mAnimLayer); 961e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale } 971e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale if (mImeTarget != null && w.mBaseLayer == mImeTarget.mBaseLayer) { 981e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale mHighestLayerInImeTargetBaseLayer = Math.max(mHighestLayerInImeTargetBaseLayer, 991e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale w.mWinAnimator.mAnimLayer); 1001e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale } 1011e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 1021e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale collectSpecialWindows(w); 1031e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 1041e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale if (layerChanged) { 1051e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale w.scheduleAnimationIfDimming(); 1061e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale } 1071e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale }; 1081e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale 109d1880960581d526cbaed0566d522987d9301b293Wale Ogunwale final void assignWindowLayers(DisplayContent dc) { 110d1880960581d526cbaed0566d522987d9301b293Wale Ogunwale if (DEBUG_LAYERS) Slog.v(TAG_WM, "Assigning layers based", 11192e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski new RuntimeException("here").fillInStackTrace()); 11292e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski 11344fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale reset(); 1141e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale dc.forAllWindows(mAssignWindowLayersConsumer, false /* traverseTopToBottom */); 11592e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski 11692e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski adjustSpecialWindows(); 11792e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski 11892e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski //TODO (multidisplay): Magnification is supported only for the default display. 119d1880960581d526cbaed0566d522987d9301b293Wale Ogunwale if (mService.mAccessibilityController != null && mAnyLayerChanged 12044fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale && dc.getDisplayId() == DEFAULT_DISPLAY) { 12192e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski mService.mAccessibilityController.onWindowLayersChangedLocked(); 12292e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski } 12392e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski 124d1880960581d526cbaed0566d522987d9301b293Wale Ogunwale if (DEBUG_LAYERS) logDebugLayers(dc); 12592e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski } 12692e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski 127d1880960581d526cbaed0566d522987d9301b293Wale Ogunwale private void logDebugLayers(DisplayContent dc) { 128d1880960581d526cbaed0566d522987d9301b293Wale Ogunwale dc.forAllWindows((w) -> { 12992e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski final WindowStateAnimator winAnimator = w.mWinAnimator; 13092e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski Slog.v(TAG_WM, "Assign layer " + w + ": " + "mBase=" + w.mBaseLayer 13192e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski + " mLayer=" + w.mLayer + (w.mAppToken == null 132dee1b3f80c363fa6d3c9e87acd729161bce56c23Robert Carr ? "" : " mAppLayer=" + w.mAppToken.getAnimLayerAdjustment()) 13392e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski + " =mAnimLayer=" + winAnimator.mAnimLayer); 134d1880960581d526cbaed0566d522987d9301b293Wale Ogunwale }, false /* traverseTopToBottom */); 13592e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski } 13692e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski 13744fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale private void reset() { 13892e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski mHighestApplicationLayer = 0; 13926b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale mPinnedWindows.clear(); 140b976877a4b62a6030fe67796ab8a6a69b4cc041fRobert Carr mInputMethodWindows.clear(); 14126b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale mDockedWindows.clear(); 1428347163dbb64fb61012c0393163283106a0a351eWinson Chung mAssistantWindows.clear(); 14326b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale mReplacingWindows.clear(); 14492e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski mDockDivider = null; 145d1880960581d526cbaed0566d522987d9301b293Wale Ogunwale 146d1880960581d526cbaed0566d522987d9301b293Wale Ogunwale mCurBaseLayer = 0; 147d1880960581d526cbaed0566d522987d9301b293Wale Ogunwale mCurLayer = 0; 148d1880960581d526cbaed0566d522987d9301b293Wale Ogunwale mAnyLayerChanged = false; 14944fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale 15044fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale mImeTarget = mService.mInputMethodTarget; 15144fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale mHighestLayerInImeTargetBaseLayer = (mImeTarget != null) ? mImeTarget.mBaseLayer : 0; 152ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale mAboveImeTarget = false; 153ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale mAboveImeTargetAppWindows.clear(); 15492e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski } 15592e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski 15692e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski private void collectSpecialWindows(WindowState w) { 157bedb566a280e8aee2e80346af08f42b3fb5121c2Filip Gruszczynski if (w.mAttrs.type == TYPE_DOCK_DIVIDER) { 15892e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski mDockDivider = w; 15926b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale return; 16026b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale } 16126b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale if (w.mWillReplaceWindow) { 16226b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale mReplacingWindows.add(w); 16326b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale } 164b976877a4b62a6030fe67796ab8a6a69b4cc041fRobert Carr if (w.mIsImWindow) { 165b976877a4b62a6030fe67796ab8a6a69b4cc041fRobert Carr mInputMethodWindows.add(w); 166b976877a4b62a6030fe67796ab8a6a69b4cc041fRobert Carr return; 167b976877a4b62a6030fe67796ab8a6a69b4cc041fRobert Carr } 168ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale if (mImeTarget != null) { 169ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale if (w.getParentWindow() == mImeTarget && w.mSubLayer > 0) { 170ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale // Child windows of the ime target with a positive sub-layer should be placed above 171ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale // the IME. 172ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale mAboveImeTargetAppWindows.add(w); 173ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale } else if (mAboveImeTarget && w.mAppToken != null) { 174ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale // windows of apps above the IME target should be placed above the IME. 175ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale mAboveImeTargetAppWindows.add(w); 176ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale } 177ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale if (w == mImeTarget) { 178ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale mAboveImeTarget = true; 179ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale } 180ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale } 181ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale 1829bc01a817be8b15046a92b4362051f93281816a2Jiaquan He final Task task = w.getTask(); 1839bc01a817be8b15046a92b4362051f93281816a2Jiaquan He if (task == null) { 1849bc01a817be8b15046a92b4362051f93281816a2Jiaquan He return; 1859bc01a817be8b15046a92b4362051f93281816a2Jiaquan He } 1869bc01a817be8b15046a92b4362051f93281816a2Jiaquan He final TaskStack stack = task.mStack; 18726b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale if (stack == null) { 18826b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale return; 18926b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale } 19026b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale if (stack.mStackId == PINNED_STACK_ID) { 19126b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale mPinnedWindows.add(w); 19226b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale } else if (stack.mStackId == DOCKED_STACK_ID) { 19326b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale mDockedWindows.add(w); 1948347163dbb64fb61012c0393163283106a0a351eWinson Chung } else if (stack.mStackId == ASSISTANT_STACK_ID) { 1958347163dbb64fb61012c0393163283106a0a351eWinson Chung mAssistantWindows.add(w); 19692e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski } 19792e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski } 19892e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski 19992e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski private void adjustSpecialWindows() { 2006412d755f4eb0b562c6d25ffb1ac5357105d6b1cRobert Carr int layer = mHighestApplicationLayer + WINDOW_LAYER_MULTIPLIER; 20126b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale // For pinned and docked stack window, we want to make them above other windows also when 20226b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale // these windows are animating. 20326b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale while (!mDockedWindows.isEmpty()) { 20426b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale layer = assignAndIncreaseLayerIfNeeded(mDockedWindows.remove(), layer); 20526b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale } 2065098159ae31bc59aa3857fecb1847f8d7bb73e54Jorim Jaggi 20792e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski layer = assignAndIncreaseLayerIfNeeded(mDockDivider, layer); 2089da141fe5ca3c8272681f6d3ea3f6871a2bc76c2Robert Carr 20926b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale // We know that we will be animating a relaunching window in the near future, which will 21026b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale // receive a z-order increase. We want the replaced window to immediately receive the same 21126b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale // treatment, e.g. to be above the dock divider. 21226b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale while (!mReplacingWindows.isEmpty()) { 21326b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale layer = assignAndIncreaseLayerIfNeeded(mReplacingWindows.remove(), layer); 21426b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale } 21526b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale 2168347163dbb64fb61012c0393163283106a0a351eWinson Chung // Adjust the assistant stack windows to be above the docked and fullscreen stack windows, 2178347163dbb64fb61012c0393163283106a0a351eWinson Chung // but under the pinned stack windows 2188347163dbb64fb61012c0393163283106a0a351eWinson Chung while (!mAssistantWindows.isEmpty()) { 2198347163dbb64fb61012c0393163283106a0a351eWinson Chung layer = assignAndIncreaseLayerIfNeeded(mAssistantWindows.remove(), layer); 2208347163dbb64fb61012c0393163283106a0a351eWinson Chung } 2218347163dbb64fb61012c0393163283106a0a351eWinson Chung 22226b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale while (!mPinnedWindows.isEmpty()) { 22326b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale layer = assignAndIncreaseLayerIfNeeded(mPinnedWindows.remove(), layer); 22426b7b43d172a7a2be39a109f1f6697162c4ee642Wale Ogunwale } 22544fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale 22644fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale // Make sure IME is the highest window in the base layer of it's target. 22744fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale if (mImeTarget != null) { 22844fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale if (mImeTarget.mAppToken == null) { 22944fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale // For non-app ime targets adjust the layer we start from to match what we found 23044fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale // when assigning layers. Otherwise, just use the highest app layer we have some far. 23144fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale layer = mHighestLayerInImeTargetBaseLayer + WINDOW_LAYER_MULTIPLIER; 23244fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale } 23344fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale 23444fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale while (!mInputMethodWindows.isEmpty()) { 23544fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale layer = assignAndIncreaseLayerIfNeeded(mInputMethodWindows.remove(), layer); 23644fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale } 237ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale 238ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale // Adjust app windows the should be displayed above the IME since they are above the IME 239ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale // target. 240ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale while (!mAboveImeTargetAppWindows.isEmpty()) { 241ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale layer = assignAndIncreaseLayerIfNeeded(mAboveImeTargetAppWindows.remove(), layer); 242ca9e061256861a86d7d1c2770c666451d3fb53deWale Ogunwale } 24344fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale } 24444fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale 24592e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski } 24692e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski 24792e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski private int assignAndIncreaseLayerIfNeeded(WindowState win, int layer) { 24890da5e54482fd513ab73bbcfce9f55312d0c96f7Robert Carr if (win != null) { 24967eec038f4628f36e813329736802c331dc2dbc6Robert Carr assignAnimLayer(win, layer); 25044fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale // Make sure we leave space in-between normal windows for dims and such. 2516412d755f4eb0b562c6d25ffb1ac5357105d6b1cRobert Carr layer += WINDOW_LAYER_MULTIPLIER; 25292e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski } 25392e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski return layer; 25492e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski } 2556412d755f4eb0b562c6d25ffb1ac5357105d6b1cRobert Carr 25667eec038f4628f36e813329736802c331dc2dbc6Robert Carr private void assignAnimLayer(WindowState w, int layer) { 25767eec038f4628f36e813329736802c331dc2dbc6Robert Carr w.mLayer = layer; 258c69694abbdbfa3f0bedb034e7cc86823a72ff781Wale Ogunwale w.mWinAnimator.mAnimLayer = w.getAnimLayerAdjustment() 259c69694abbdbfa3f0bedb034e7cc86823a72ff781Wale Ogunwale + w.getSpecialWindowAnimLayerAdjustment(); 2607c70647f0fe0bdeff0255c5fa827e206a245330bMatthew Ng if (w.mAppToken != null && w.mAppToken.mAppAnimator.thumbnailForceAboveLayer > 0) { 2617c70647f0fe0bdeff0255c5fa827e206a245330bMatthew Ng if (w.mWinAnimator.mAnimLayer > w.mAppToken.mAppAnimator.thumbnailForceAboveLayer) { 2627c70647f0fe0bdeff0255c5fa827e206a245330bMatthew Ng w.mAppToken.mAppAnimator.thumbnailForceAboveLayer = w.mWinAnimator.mAnimLayer; 2637c70647f0fe0bdeff0255c5fa827e206a245330bMatthew Ng } 2647c70647f0fe0bdeff0255c5fa827e206a245330bMatthew Ng // TODO(b/62029108): the entire contents of the if statement should call the refactored 2657c70647f0fe0bdeff0255c5fa827e206a245330bMatthew Ng // function to set the thumbnail layer for w.AppToken 2667c70647f0fe0bdeff0255c5fa827e206a245330bMatthew Ng int highestLayer = w.mAppToken.getHighestAnimLayer(); 2677c70647f0fe0bdeff0255c5fa827e206a245330bMatthew Ng if (highestLayer > 0) { 2687c70647f0fe0bdeff0255c5fa827e206a245330bMatthew Ng if (w.mAppToken.mAppAnimator.thumbnail != null 2697c70647f0fe0bdeff0255c5fa827e206a245330bMatthew Ng && w.mAppToken.mAppAnimator.thumbnailForceAboveLayer != highestLayer) { 2707c70647f0fe0bdeff0255c5fa827e206a245330bMatthew Ng w.mAppToken.mAppAnimator.thumbnailForceAboveLayer = highestLayer; 2717c70647f0fe0bdeff0255c5fa827e206a245330bMatthew Ng w.mAppToken.mAppAnimator.thumbnail.setLayer(highestLayer + 1); 2727c70647f0fe0bdeff0255c5fa827e206a245330bMatthew Ng } 2737c70647f0fe0bdeff0255c5fa827e206a245330bMatthew Ng } 274c69bd2246f4ec5000591fdc381f84cd90be85b7fJorim Jaggi } 27567eec038f4628f36e813329736802c331dc2dbc6Robert Carr } 27692e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski} 277