diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index f0381352be425..299fa05d0ed95 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -40,9 +40,7 @@ import com.android.server.EventLogTags; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; -import java.util.HashMap; -import static android.app.ActivityManager.StackId.DOCKED_STACK_ID; import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.MODE_DEFAULT; import static android.app.AppOpsManager.OP_NONE; @@ -55,17 +53,13 @@ import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG; import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM; import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT; import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; -import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; -import static com.android.server.wm.AppTransition.TRANSIT_UNSET; + import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; -import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DISPLAY; -import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS_LIGHT; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEEP_SCREEN_ON; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_POWER; -import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TOKEN_MOVEMENT; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT; @@ -78,7 +72,6 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.H.REPORT_LOSING_FOCUS; import static com.android.server.wm.WindowManagerService.H.SEND_NEW_CONFIGURATION; -import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES; import static com.android.server.wm.WindowManagerService.WINDOWS_FREEZING_SCREENS_NONE; @@ -760,9 +753,6 @@ class RootWindowContainer extends WindowContainer { WindowToken token = exitingTokens.get(i); if (!token.hasVisible) { exitingTokens.remove(i); - if (token.windowType == TYPE_WALLPAPER) { - displayContent.mWallpaperController.removeWallpaperToken(token); - } } } } diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index 250d381e614b8..178fbe75ca59d 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -55,7 +55,7 @@ class WallpaperController { private static final String TAG = TAG_WITH_CLASS_NAME ? "WallpaperController" : TAG_WM; final private WindowManagerService mService; - private final ArrayList mWallpaperTokens = new ArrayList<>(); + private final ArrayList mWallpaperTokens = new ArrayList<>(); // If non-null, this is the currently visible window that is associated // with the wallpaper. @@ -135,7 +135,7 @@ class WallpaperController { */ void startWallpaperAnimation(Animation a) { for (int curTokenNdx = mWallpaperTokens.size() - 1; curTokenNdx >= 0; curTokenNdx--) { - final WindowToken token = mWallpaperTokens.get(curTokenNdx); + final WallpaperWindowToken token = mWallpaperTokens.get(curTokenNdx); token.startAnimation(a); } } @@ -163,7 +163,7 @@ class WallpaperController { final boolean visible = isWallpaperVisible(mWallpaperTarget); for (int curTokenNdx = mWallpaperTokens.size() - 1; curTokenNdx >= 0; curTokenNdx--) { - final WindowToken token = mWallpaperTokens.get(curTokenNdx); + final WallpaperWindowToken token = mWallpaperTokens.get(curTokenNdx); token.updateWallpaperVisibility(visible); } } @@ -189,7 +189,7 @@ class WallpaperController { final boolean wasDeferred = (mDeferredHideWallpaper == winGoingAway); for (int i = mWallpaperTokens.size() - 1; i >= 0; i--) { - final WindowToken token = mWallpaperTokens.get(i); + final WallpaperWindowToken token = mWallpaperTokens.get(i); token.hideWallpaperToken(wasDeferred, "hideWallpapers"); if (DEBUG_WALLPAPER_LIGHT && !token.hidden) Slog.d(TAG, "Hiding wallpaper " + token + " from " + winGoingAway + " target=" + mWallpaperTarget + " lower=" @@ -304,7 +304,7 @@ class WallpaperController { || window == mUpperWallpaperTarget) { boolean doWait = sync; for (int curTokenNdx = mWallpaperTokens.size() - 1; curTokenNdx >= 0; curTokenNdx--) { - final WindowToken token = mWallpaperTokens.get(curTokenNdx); + final WallpaperWindowToken token = mWallpaperTokens.get(curTokenNdx); token.sendWindowWallpaperCommand(action, x, y, z, extras, sync); } @@ -652,7 +652,7 @@ class WallpaperController { // Start stepping backwards from here, ensuring that our wallpaper windows are correctly placed. boolean changed = false; for (int curTokenNdx = mWallpaperTokens.size() - 1; curTokenNdx >= 0; curTokenNdx--) { - final WindowToken token = mWallpaperTokens.get(curTokenNdx); + final WallpaperWindowToken token = mWallpaperTokens.get(curTokenNdx); changed |= token.updateWallpaperWindowsPlacement(windows, wallpaperTarget, wallpaperTargetIndex, visible, dw, dh, mWallpaperAnimLayerAdjustment); } @@ -725,7 +725,7 @@ class WallpaperController { boolean wallpaperReady = true; for (int curTokenIndex = mWallpaperTokens.size() - 1; curTokenIndex >= 0 && wallpaperReady; curTokenIndex--) { - final WindowToken token = mWallpaperTokens.get(curTokenIndex); + final WallpaperWindowToken token = mWallpaperTokens.get(curTokenIndex); if (token.hasVisibleNotDrawnWallpaper()) { // We've told this wallpaper to be visible, but it is not drawn yet wallpaperReady = false; @@ -777,11 +777,11 @@ class WallpaperController { } } - void addWallpaperToken(WindowToken token) { + void addWallpaperToken(WallpaperWindowToken token) { mWallpaperTokens.add(token); } - void removeWallpaperToken(WindowToken token) { + void removeWallpaperToken(WallpaperWindowToken token) { mWallpaperTokens.remove(token); } diff --git a/services/core/java/com/android/server/wm/WallpaperWindowToken.java b/services/core/java/com/android/server/wm/WallpaperWindowToken.java new file mode 100644 index 0000000000000..fdefcfe2d1748 --- /dev/null +++ b/services/core/java/com/android/server/wm/WallpaperWindowToken.java @@ -0,0 +1,228 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.server.wm; + +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; +import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYERS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_MOVEMENT; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; + +import android.os.Bundle; +import android.os.IBinder; +import android.os.RemoteException; +import android.util.Slog; +import android.view.DisplayInfo; +import android.view.animation.Animation; + +/** + * A token that represents a set of wallpaper windows. + */ +class WallpaperWindowToken extends WindowToken { + + private static final String TAG = TAG_WITH_CLASS_NAME ? "WallpaperWindowToken" : TAG_WM; + + WallpaperWindowToken(WindowManagerService service, IBinder token, boolean explicit, + DisplayContent dc) { + super(service, token, TYPE_WALLPAPER, explicit, dc); + dc.mWallpaperController.addWallpaperToken(this); + } + + @Override + void setExiting() { + super.setExiting(); + mDisplayContent.mWallpaperController.removeWallpaperToken(this); + } + + void hideWallpaperToken(boolean wasDeferred, String reason) { + for (int j = mChildren.size() - 1; j >= 0; j--) { + final WindowState wallpaper = mChildren.get(j); + wallpaper.hideWallpaperWindow(wasDeferred, reason); + } + hidden = true; + } + + void sendWindowWallpaperCommand( + String action, int x, int y, int z, Bundle extras, boolean sync) { + for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { + final WindowState wallpaper = mChildren.get(wallpaperNdx); + try { + wallpaper.mClient.dispatchWallpaperCommand(action, x, y, z, extras, sync); + // We only want to be synchronous with one wallpaper. + sync = false; + } catch (RemoteException e) { + } + } + } + + void updateWallpaperOffset(int dw, int dh, boolean sync) { + final WallpaperController wallpaperController = mDisplayContent.mWallpaperController; + for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { + final WindowState wallpaper = mChildren.get(wallpaperNdx); + if (wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, sync)) { + final WindowStateAnimator winAnimator = wallpaper.mWinAnimator; + winAnimator.computeShownFrameLocked(); + // No need to lay out the windows - we can just set the wallpaper position directly. + winAnimator.setWallpaperOffset(wallpaper.mShownPosition); + // We only want to be synchronous with one wallpaper. + sync = false; + } + } + } + + void updateWallpaperVisibility(boolean visible) { + final DisplayInfo displayInfo = mDisplayContent.getDisplayInfo(); + final int dw = displayInfo.logicalWidth; + final int dh = displayInfo.logicalHeight; + + if (hidden == visible) { + hidden = !visible; + // Need to do a layout to ensure the wallpaper now has the correct size. + mDisplayContent.setLayoutNeeded(); + } + + final WallpaperController wallpaperController = mDisplayContent.mWallpaperController; + for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { + final WindowState wallpaper = mChildren.get(wallpaperNdx); + if (visible) { + wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, false); + } + + wallpaper.dispatchWallpaperVisibility(visible); + } + } + + /** + * Starts {@param anim} on all children. + */ + void startAnimation(Animation anim) { + for (int ndx = mChildren.size() - 1; ndx >= 0; ndx--) { + final WindowState windowState = mChildren.get(ndx); + windowState.mWinAnimator.setAnimation(anim); + } + } + + boolean updateWallpaperWindowsPlacement(ReadOnlyWindowList windowList, + WindowState wallpaperTarget, int wallpaperTargetIndex, boolean visible, int dw, int dh, + int wallpaperAnimLayerAdj) { + + boolean changed = false; + if (hidden == visible) { + if (DEBUG_WALLPAPER_LIGHT) Slog.d(TAG, + "Wallpaper token " + token + " hidden=" + !visible); + hidden = !visible; + // Need to do a layout to ensure the wallpaper now has the correct size. + mDisplayContent.setLayoutNeeded(); + } + + final WallpaperController wallpaperController = mDisplayContent.mWallpaperController; + for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { + final WindowState wallpaper = mChildren.get(wallpaperNdx); + + if (visible) { + wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, false); + } + + // First, make sure the client has the current visibility state. + wallpaper.dispatchWallpaperVisibility(visible); + wallpaper.adjustAnimLayer(wallpaperAnimLayerAdj); + + if (DEBUG_LAYERS || DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, "adjustWallpaper win " + + wallpaper + " anim layer: " + wallpaper.mWinAnimator.mAnimLayer); + + // First, if this window is at the current index, then all is well. + if (wallpaper == wallpaperTarget) { + wallpaperTargetIndex--; + wallpaperTarget = wallpaperTargetIndex > 0 + ? windowList.get(wallpaperTargetIndex - 1) : null; + continue; + } + + // The window didn't match... the current wallpaper window, + // wherever it is, is in the wrong place, so make sure it is not in the list. + int oldIndex = windowList.indexOf(wallpaper); + if (oldIndex >= 0) { + if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, + "Wallpaper removing at " + oldIndex + ": " + wallpaper); + mDisplayContent.removeFromWindowList(wallpaper); + if (oldIndex < wallpaperTargetIndex) { + wallpaperTargetIndex--; + } + } + + // Now stick it in. For apps over wallpaper keep the wallpaper at the bottommost + // layer. For keyguard over wallpaper put the wallpaper under the lowest window that + // is currently on screen, i.e. not hidden by policy. + int insertionIndex = 0; + if (visible && wallpaperTarget != null) { + final int privateFlags = wallpaperTarget.mAttrs.privateFlags; + if ((privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) { + insertionIndex = Math.min(windowList.indexOf(wallpaperTarget), + findLowestWindowOnScreen(windowList)); + } + } + if (DEBUG_WALLPAPER_LIGHT || DEBUG_WINDOW_MOVEMENT + || (DEBUG_ADD_REMOVE && oldIndex != insertionIndex)) Slog.v(TAG, + "Moving wallpaper " + wallpaper + " from " + oldIndex + " to " + insertionIndex); + + mDisplayContent.addToWindowList(wallpaper, insertionIndex); + changed = true; + } + + return changed; + } + + /** + * @return The index in {@param windows} of the lowest window that is currently on screen and + * not hidden by the policy. + */ + private int findLowestWindowOnScreen(ReadOnlyWindowList windowList) { + final int size = windowList.size(); + for (int index = 0; index < size; index++) { + final WindowState win = windowList.get(index); + if (win.isOnScreen()) { + return index; + } + } + return Integer.MAX_VALUE; + } + + boolean hasVisibleNotDrawnWallpaper() { + for (int j = mChildren.size() - 1; j >= 0; --j) { + final WindowState wallpaper = mChildren.get(j); + if (wallpaper.hasVisibleNotDrawnWallpaper()) { + return true; + } + } + return false; + } + + @Override + public String toString() { + if (stringName == null) { + StringBuilder sb = new StringBuilder(); + sb.append("WallpaperWindowToken{"); + sb.append(Integer.toHexString(System.identityHashCode(this))); + sb.append(" token="); sb.append(token); sb.append('}'); + stringName = sb.toString(); + } + return stringName; + } +} diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index a533d84067170..5baa72a859ebb 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2415,9 +2415,10 @@ public class WindowManagerService extends IWindowManager.Stub + " displayId=" + displayId); return; } - token = new WindowToken(this, binder, type, true, dc); if (type == TYPE_WALLPAPER) { - dc.mWallpaperController.addWallpaperToken(token); + new WallpaperWindowToken(this, binder, true, dc); + } else { + new WindowToken(this, binder, type, true, dc); } } } @@ -2446,9 +2447,6 @@ public class WindowManagerService extends IWindowManager.Stub } token.setExiting(); - if (token.windowType == TYPE_WALLPAPER) { - dc.mWallpaperController.removeWallpaperToken(token); - } mInputMonitor.updateInputWindowsLw(true /*force*/); } diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java index b821f0900e65d..93f1610e926d2 100644 --- a/services/core/java/com/android/server/wm/WindowToken.java +++ b/services/core/java/com/android/server/wm/WindowToken.java @@ -82,7 +82,7 @@ class WindowToken extends WindowContainer { boolean sendingToBottom; // The display this token is on. - private DisplayContent mDisplayContent; + protected DisplayContent mDisplayContent; /** * Compares two child window of this token and returns -1 if the first is lesser than the @@ -280,169 +280,6 @@ class WindowToken extends WindowContainer { return false; } - void hideWallpaperToken(boolean wasDeferred, String reason) { - for (int j = mChildren.size() - 1; j >= 0; j--) { - final WindowState wallpaper = mChildren.get(j); - wallpaper.hideWallpaperWindow(wasDeferred, reason); - } - hidden = true; - } - - void sendWindowWallpaperCommand( - String action, int x, int y, int z, Bundle extras, boolean sync) { - for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { - final WindowState wallpaper = mChildren.get(wallpaperNdx); - try { - wallpaper.mClient.dispatchWallpaperCommand(action, x, y, z, extras, sync); - // We only want to be synchronous with one wallpaper. - sync = false; - } catch (RemoteException e) { - } - } - } - - void updateWallpaperOffset(int dw, int dh, boolean sync) { - final WallpaperController wallpaperController = mDisplayContent.mWallpaperController; - for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { - final WindowState wallpaper = mChildren.get(wallpaperNdx); - if (wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, sync)) { - final WindowStateAnimator winAnimator = wallpaper.mWinAnimator; - winAnimator.computeShownFrameLocked(); - // No need to lay out the windows - we can just set the wallpaper position directly. - winAnimator.setWallpaperOffset(wallpaper.mShownPosition); - // We only want to be synchronous with one wallpaper. - sync = false; - } - } - } - - void updateWallpaperVisibility(boolean visible) { - final DisplayInfo displayInfo = mDisplayContent.getDisplayInfo(); - final int dw = displayInfo.logicalWidth; - final int dh = displayInfo.logicalHeight; - - if (hidden == visible) { - hidden = !visible; - // Need to do a layout to ensure the wallpaper now has the correct size. - mDisplayContent.setLayoutNeeded(); - } - - final WallpaperController wallpaperController = mDisplayContent.mWallpaperController; - for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { - final WindowState wallpaper = mChildren.get(wallpaperNdx); - if (visible) { - wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, false); - } - - wallpaper.dispatchWallpaperVisibility(visible); - } - } - - /** - * Starts {@param anim} on all children. - */ - void startAnimation(Animation anim) { - for (int ndx = mChildren.size() - 1; ndx >= 0; ndx--) { - final WindowState windowState = mChildren.get(ndx); - windowState.mWinAnimator.setAnimation(anim); - } - } - - boolean updateWallpaperWindowsPlacement(ReadOnlyWindowList windowList, - WindowState wallpaperTarget, int wallpaperTargetIndex, boolean visible, int dw, int dh, - int wallpaperAnimLayerAdj) { - - boolean changed = false; - if (hidden == visible) { - if (DEBUG_WALLPAPER_LIGHT) Slog.d(TAG, - "Wallpaper token " + token + " hidden=" + !visible); - hidden = !visible; - // Need to do a layout to ensure the wallpaper now has the correct size. - mDisplayContent.setLayoutNeeded(); - } - - final WallpaperController wallpaperController = mDisplayContent.mWallpaperController; - for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { - final WindowState wallpaper = mChildren.get(wallpaperNdx); - - if (visible) { - wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, false); - } - - // First, make sure the client has the current visibility state. - wallpaper.dispatchWallpaperVisibility(visible); - wallpaper.adjustAnimLayer(wallpaperAnimLayerAdj); - - if (DEBUG_LAYERS || DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, "adjustWallpaper win " - + wallpaper + " anim layer: " + wallpaper.mWinAnimator.mAnimLayer); - - // First, if this window is at the current index, then all is well. - if (wallpaper == wallpaperTarget) { - wallpaperTargetIndex--; - wallpaperTarget = wallpaperTargetIndex > 0 - ? windowList.get(wallpaperTargetIndex - 1) : null; - continue; - } - - // The window didn't match... the current wallpaper window, - // wherever it is, is in the wrong place, so make sure it is not in the list. - int oldIndex = windowList.indexOf(wallpaper); - if (oldIndex >= 0) { - if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, - "Wallpaper removing at " + oldIndex + ": " + wallpaper); - mDisplayContent.removeFromWindowList(wallpaper); - if (oldIndex < wallpaperTargetIndex) { - wallpaperTargetIndex--; - } - } - - // Now stick it in. For apps over wallpaper keep the wallpaper at the bottommost - // layer. For keyguard over wallpaper put the wallpaper under the lowest window that - // is currently on screen, i.e. not hidden by policy. - int insertionIndex = 0; - if (visible && wallpaperTarget != null) { - final int privateFlags = wallpaperTarget.mAttrs.privateFlags; - if ((privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) { - insertionIndex = Math.min(windowList.indexOf(wallpaperTarget), - findLowestWindowOnScreen(windowList)); - } - } - if (DEBUG_WALLPAPER_LIGHT || DEBUG_WINDOW_MOVEMENT - || (DEBUG_ADD_REMOVE && oldIndex != insertionIndex)) Slog.v(TAG, - "Moving wallpaper " + wallpaper + " from " + oldIndex + " to " + insertionIndex); - - mDisplayContent.addToWindowList(wallpaper, insertionIndex); - changed = true; - } - - return changed; - } - - /** - * @return The index in {@param windows} of the lowest window that is currently on screen and - * not hidden by the policy. - */ - private int findLowestWindowOnScreen(ReadOnlyWindowList windowList) { - final int size = windowList.size(); - for (int index = 0; index < size; index++) { - final WindowState win = windowList.get(index); - if (win.isOnScreen()) { - return index; - } - } - return Integer.MAX_VALUE; - } - - boolean hasVisibleNotDrawnWallpaper() { - for (int j = mChildren.size() - 1; j >= 0; --j) { - final WindowState wallpaper = mChildren.get(j); - if (wallpaper.hasVisibleNotDrawnWallpaper()) { - return true; - } - } - return false; - } - int getHighestAnimLayer() { int highest = -1; for (int j = 0; j < mChildren.size(); j++) {