Loading services/core/java/com/android/server/wm/RootWindowContainer.java +1 −11 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -760,9 +753,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { WindowToken token = exitingTokens.get(i); if (!token.hasVisible) { exitingTokens.remove(i); if (token.windowType == TYPE_WALLPAPER) { displayContent.mWallpaperController.removeWallpaperToken(token); } } } } Loading services/core/java/com/android/server/wm/WallpaperController.java +9 −9 Original line number Diff line number Diff line Loading @@ -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<WindowToken> mWallpaperTokens = new ArrayList<>(); private final ArrayList<WallpaperWindowToken> mWallpaperTokens = new ArrayList<>(); // If non-null, this is the currently visible window that is associated // with the wallpaper. Loading Loading @@ -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); } } Loading Loading @@ -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); } } Loading @@ -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=" Loading Loading @@ -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); } Loading Loading @@ -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); } Loading Loading @@ -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; Loading Loading @@ -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); } Loading services/core/java/com/android/server/wm/WallpaperWindowToken.java 0 → 100644 +228 −0 Original line number Diff line number Diff line /* * 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; } } services/core/java/com/android/server/wm/WindowManagerService.java +3 −5 Original line number Diff line number Diff line Loading @@ -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); } } } Loading Loading @@ -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*/); } Loading services/core/java/com/android/server/wm/WindowToken.java +1 −164 Original line number Diff line number Diff line Loading @@ -82,7 +82,7 @@ class WindowToken extends WindowContainer<WindowState> { 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 Loading Loading @@ -280,169 +280,6 @@ class WindowToken extends WindowContainer<WindowState> { 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++) { Loading Loading
services/core/java/com/android/server/wm/RootWindowContainer.java +1 −11 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -760,9 +753,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { WindowToken token = exitingTokens.get(i); if (!token.hasVisible) { exitingTokens.remove(i); if (token.windowType == TYPE_WALLPAPER) { displayContent.mWallpaperController.removeWallpaperToken(token); } } } } Loading
services/core/java/com/android/server/wm/WallpaperController.java +9 −9 Original line number Diff line number Diff line Loading @@ -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<WindowToken> mWallpaperTokens = new ArrayList<>(); private final ArrayList<WallpaperWindowToken> mWallpaperTokens = new ArrayList<>(); // If non-null, this is the currently visible window that is associated // with the wallpaper. Loading Loading @@ -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); } } Loading Loading @@ -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); } } Loading @@ -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=" Loading Loading @@ -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); } Loading Loading @@ -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); } Loading Loading @@ -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; Loading Loading @@ -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); } Loading
services/core/java/com/android/server/wm/WallpaperWindowToken.java 0 → 100644 +228 −0 Original line number Diff line number Diff line /* * 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; } }
services/core/java/com/android/server/wm/WindowManagerService.java +3 −5 Original line number Diff line number Diff line Loading @@ -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); } } } Loading Loading @@ -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*/); } Loading
services/core/java/com/android/server/wm/WindowToken.java +1 −164 Original line number Diff line number Diff line Loading @@ -82,7 +82,7 @@ class WindowToken extends WindowContainer<WindowState> { 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 Loading Loading @@ -280,169 +280,6 @@ class WindowToken extends WindowContainer<WindowState> { 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++) { Loading