diff options
14 files changed, 100 insertions, 114 deletions
diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java index 94a47dd2aa60..e65f3b417429 100644 --- a/services/core/java/com/android/server/wm/AppTransitionController.java +++ b/services/core/java/com/android/server/wm/AppTransitionController.java @@ -51,7 +51,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.NOTIFY_APP_TRANSITION_STARTING; -import android.app.WindowConfiguration; import android.os.Trace; import android.util.ArraySet; import android.util.Slog; @@ -83,7 +82,7 @@ public class AppTransitionController { AppTransitionController(WindowManagerService service, DisplayContent displayContent) { mService = service; mDisplayContent = displayContent; - mWallpaperControllerLocked = new WallpaperController(mService); + mWallpaperControllerLocked = mDisplayContent.mWallpaperController; } /** @@ -106,7 +105,7 @@ public class AppTransitionController { mDisplayContent.mAppTransition.removeAppTransitionTimeoutCallbacks(); - mService.mRoot.mWallpaperMayChange = false; + mDisplayContent.mWallpaperMayChange = false; int i; for (i = 0; i < appsCount; i++) { @@ -121,7 +120,7 @@ public class AppTransitionController { // Adjust wallpaper before we pull the lower/upper target, since pending changes // (like the clearAnimatingFlags() above) might affect wallpaper target result. // Or, the opening app window should be a wallpaper target. - mWallpaperControllerLocked.adjustWallpaperWindowsForAppTransitionIfNeeded(mDisplayContent, + mWallpaperControllerLocked.adjustWallpaperWindowsForAppTransitionIfNeeded( mDisplayContent.mOpeningApps); // Determine if closing and opening app token sets are wallpaper targets, in which case diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index ab7d2597614c..2f7956e86531 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -414,6 +414,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo WallpaperController mWallpaperController; + boolean mWallpaperMayChange = false; + private final SurfaceSession mSession = new SurfaceSession(); /** @@ -751,8 +753,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } } - if (isDefaultDisplay && obscuredChanged && w.isVisibleLw() - && mWallpaperController.isWallpaperTarget(w)) { + if (obscuredChanged && w.isVisibleLw() && mWallpaperController.isWallpaperTarget(w)) { // This is the wallpaper target and its obscured state changed... make sure the // current wallpaper's visibility has been updated accordingly. mWallpaperController.updateWallpaperVisibility(); @@ -784,7 +785,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo if ((w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) { if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, "First draw done in potential wallpaper target " + w); - root.mWallpaperMayChange = true; + mWallpaperMayChange = true; pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; if (DEBUG_LAYOUT_REPEATS) { surfacePlacer.debugLayoutRepeats( @@ -816,11 +817,10 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo * initialize direct children. * @param display May not be null. * @param service You know. - * @param wallpaperController wallpaper windows controller used to adjust the positioning of the - * wallpaper windows in the window list. + * @param controller The controller for the display container. */ DisplayContent(Display display, WindowManagerService service, - WallpaperController wallpaperController, DisplayWindowController controller) { + DisplayWindowController controller) { super(service); setController(controller); if (service.mRoot.getDisplayContent(display.getDisplayId()) != null) { @@ -831,7 +831,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mDisplay = display; mDisplayId = display.getDisplayId(); - mWallpaperController = wallpaperController; + mWallpaperController = new WallpaperController(mService, this); display.getDisplayInfo(mDisplayInfo); display.getMetrics(mDisplayMetrics); isDefaultDisplay = mDisplayId == DEFAULT_DISPLAY; @@ -2661,6 +2661,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo pw.print(" mFocusedApp="); pw.println(mFocusedApp); pw.println(); + mWallpaperController.dump(pw, " "); + + pw.println(); pw.println(prefix + "Application tokens in top down Z order:"); for (int stackNdx = mTaskStackContainers.getChildCount() - 1; stackNdx >= 0; --stackNdx) { final TaskStack stack = mTaskStackContainers.getChildAt(stackNdx); @@ -3388,12 +3391,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo if (DEBUG_LAYOUT_REPEATS) surfacePlacer.debugLayoutRepeats("On entry to LockedInner", pendingLayoutChanges); - // TODO(multi-display): For now adjusting wallpaper only on primary display to avoid - // the wallpaper window jumping across displays. - // Remove check for default display when there will be support for multiple wallpaper - // targets (on different displays). - if (isDefaultDisplay && (pendingLayoutChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0) { - mWallpaperController.adjustWallpaperWindows(this); + if ((pendingLayoutChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0) { + mWallpaperController.adjustWallpaperWindows(); } if ((pendingLayoutChanges & FINISH_LAYOUT_REDO_CONFIG) != 0) { @@ -4673,7 +4672,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo Slog.v(TAG_WM, "Wallpaper layer changed: assigning layers + relayout"); } computeImeTarget(true /* updateImeTarget */); - mService.mRoot.mWallpaperMayChange = true; + mWallpaperMayChange = true; // Since the window list has been rebuilt, focus might have to be recomputed since the // actual order of windows might have changed again. mService.mFocusMayChange = true; diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java index 61bc4e405385..83d32c8ad289 100644 --- a/services/core/java/com/android/server/wm/InputMonitor.java +++ b/services/core/java/com/android/server/wm/InputMonitor.java @@ -40,14 +40,11 @@ import android.os.UserHandle; import android.util.ArrayMap; import android.util.Log; import android.util.Slog; +import android.view.InputApplicationHandle; import android.view.InputChannel; import android.view.InputEventReceiver; -import android.view.KeyEvent; -import android.view.WindowManager; -import android.view.InputApplicationHandle; import android.view.InputWindowHandle; -import com.android.server.input.InputManagerService; import com.android.server.policy.WindowManagerPolicy; import java.io.PrintWriter; @@ -401,10 +398,10 @@ final class InputMonitor { mTmpRect.setEmpty(); mDisableWallpaperTouchEvents = false; this.inDrag = inDrag; - wallpaperController = mService.mRoot.mWallpaperController; + final DisplayContent dc = mService.mRoot.getDisplayContent(mDisplayId); + wallpaperController = dc.mWallpaperController; - mService.mRoot.getDisplayContent(mDisplayId).forAllWindows(this, - true /* traverseTopToBottom */); + dc.forAllWindows(this, true /* traverseTopToBottom */); if (mAddWallpaperInputConsumerHandle) { // No visible wallpaper found, add the wallpaper input consumer at the end. addInputWindowHandle(wallpaperInputConsumer.mWindowHandle); diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 239971653d12..72e3562ee4fa 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -51,7 +51,6 @@ import static com.android.server.wm.WindowManagerService.logSurface; import static com.android.server.wm.WindowSurfacePlacer.SET_ORIENTATION_CHANGE_COMPLETE; import static com.android.server.wm.WindowSurfacePlacer.SET_UPDATE_ROTATION; import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_ACTION_PENDING; -import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_MAY_CHANGE; import android.annotation.CallSuper; import android.annotation.NonNull; @@ -106,7 +105,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { private boolean mSustainedPerformanceModeEnabled = false; private boolean mSustainedPerformanceModeCurrent = false; - boolean mWallpaperMayChange = false; // During an orientation change, we track whether all windows have rendered // at the new orientation, and this will be false from changing orientation until that occurs. // For seamless rotation cases this always stays true, as the windows complete their orientation @@ -114,8 +112,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { boolean mOrientationChangeComplete = true; boolean mWallpaperActionPending = false; - final WallpaperController mWallpaperController; - private final Handler mHandler; private String mCloseSystemDialogsReason; @@ -150,7 +146,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { RootWindowContainer(WindowManagerService service) { super(service); mHandler = new MyHandler(service.mH.getLooper()); - mWallpaperController = new WallpaperController(mService); } boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) { @@ -236,8 +231,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { return existing; } - final DisplayContent dc = - new DisplayContent(display, mService, mWallpaperController, controller); + final DisplayContent dc = new DisplayContent(display, mService, controller); if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Adding display=" + display); @@ -579,14 +573,19 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { final RecentsAnimationController recentsAnimationController = mService.getRecentsAnimationController(); if (recentsAnimationController != null) { - recentsAnimationController.checkAnimationReady(mWallpaperController); + recentsAnimationController.checkAnimationReady(defaultDisplay.mWallpaperController); } - if (mWallpaperMayChange) { - if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, "Wallpaper may change! Adjusting"); - defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; - if (DEBUG_LAYOUT_REPEATS) surfacePlacer.debugLayoutRepeats("WallpaperMayChange", - defaultDisplay.pendingLayoutChanges); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final DisplayContent displayContent = mChildren.get(displayNdx); + if (displayContent.mWallpaperMayChange) { + if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, "Wallpaper may change! Adjusting"); + displayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; + if (DEBUG_LAYOUT_REPEATS) { + surfacePlacer.debugLayoutRepeats("WallpaperMayChange", + displayContent.pendingLayoutChanges); + } + } } if (mService.mFocusMayChange) { @@ -617,7 +616,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { } // Destroy the surface of any windows that are no longer visible. - boolean wallpaperDestroyed = false; i = mService.mDestroySurface.size(); if (i > 0) { do { @@ -629,7 +627,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { displayContent.setInputMethodWindowLocked(null); } if (displayContent.mWallpaperController.isWallpaperTarget(win)) { - wallpaperDestroyed = true; + displayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; } win.destroySurfaceUnchecked(); win.mWinAnimator.destroyPreservedSurfaceLocked(); @@ -643,11 +641,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { displayContent.removeExistingTokensIfPossible(); } - if (wallpaperDestroyed) { - defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; - defaultDisplay.setLayoutNeeded(); - } - for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { final DisplayContent displayContent = mChildren.get(displayNdx); if (displayContent.pendingLayoutChanges != 0) { @@ -905,10 +898,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { mUpdateRotation = true; doRequest = true; } - if ((bulkUpdateParams & SET_WALLPAPER_MAY_CHANGE) != 0) { - mWallpaperMayChange = true; - doRequest = true; - } if ((bulkUpdateParams & SET_ORIENTATION_CHANGE_COMPLETE) == 0) { mOrientationChangeComplete = false; } else { diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java index b411fad814c5..6838c55100e8 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -29,7 +29,6 @@ import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.content.ClipData; -import android.content.Context; import android.graphics.Rect; import android.graphics.Region; import android.os.Binder; @@ -42,7 +41,6 @@ import android.os.Trace; import android.os.UserHandle; import android.util.MergedConfiguration; import android.util.Slog; -import android.view.Display; import android.view.DisplayCutout; import android.view.IWindow; import android.view.IWindowId; @@ -60,6 +58,7 @@ import com.android.server.wm.WindowManagerService.H; import java.io.PrintWriter; import java.util.HashSet; import java.util.Set; +import java.util.function.BiConsumer; /** * This class represents an active client session. There is generally one @@ -315,14 +314,19 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { } } + private void actionOnWallpaper(IBinder window, + BiConsumer<WallpaperController, WindowState> action) { + final WindowState windowState = mService.windowForClientLocked(this, window, true); + action.accept(windowState.getDisplayContent().mWallpaperController, windowState); + } + @Override public void setWallpaperPosition(IBinder window, float x, float y, float xStep, float yStep) { synchronized (mService.mGlobalLock) { long ident = Binder.clearCallingIdentity(); try { - mService.mRoot.mWallpaperController.setWindowWallpaperPosition( - mService.windowForClientLocked(this, window, true), - x, y, xStep, yStep); + actionOnWallpaper(window, (wpController, windowState) -> + wpController.setWindowWallpaperPosition(windowState, x, y, xStep, yStep)); } finally { Binder.restoreCallingIdentity(ident); } @@ -332,7 +336,8 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { @Override public void wallpaperOffsetsComplete(IBinder window) { synchronized (mService.mGlobalLock) { - mService.mRoot.mWallpaperController.wallpaperOffsetsComplete(window); + actionOnWallpaper(window, (wpController, windowState) -> + wpController.wallpaperOffsetsComplete(window)); } } @@ -341,8 +346,8 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { synchronized (mService.mGlobalLock) { long ident = Binder.clearCallingIdentity(); try { - mService.mRoot.mWallpaperController.setWindowWallpaperDisplayOffset( - mService.windowForClientLocked(this, window, true), x, y); + actionOnWallpaper(window, (wpController, windowState) -> + wpController.setWindowWallpaperDisplayOffset(windowState, x, y)); } finally { Binder.restoreCallingIdentity(ident); } @@ -355,9 +360,9 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { synchronized (mService.mGlobalLock) { long ident = Binder.clearCallingIdentity(); try { - return mService.mRoot.mWallpaperController.sendWindowWallpaperCommand( - mService.windowForClientLocked(this, window, true), - action, x, y, z, extras, sync); + final WindowState windowState = mService.windowForClientLocked(this, window, true); + return windowState.getDisplayContent().mWallpaperController + .sendWindowWallpaperCommand(windowState, action, x, y, z, extras, sync); } finally { Binder.restoreCallingIdentity(ident); } @@ -367,7 +372,8 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { @Override public void wallpaperCommandComplete(IBinder window, Bundle result) { synchronized (mService.mGlobalLock) { - mService.mRoot.mWallpaperController.wallpaperCommandComplete(window); + actionOnWallpaper(window, (wpController, windowState) -> + wpController.wallpaperCommandComplete(window)); } } diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index 29e1b2013ff1..15239c7e57e1 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -60,6 +60,7 @@ import java.util.ArrayList; class WallpaperController { private static final String TAG = TAG_WITH_CLASS_NAME ? "WallpaperController" : TAG_WM; private WindowManagerService mService; + private final DisplayContent mDisplayContent; private final ArrayList<WallpaperWindowToken> mWallpaperTokens = new ArrayList<>(); @@ -187,8 +188,9 @@ class WallpaperController { return false; }; - public WallpaperController(WindowManagerService service) { + WallpaperController(WindowManagerService service, DisplayContent displayContent) { mService = service; + mDisplayContent = displayContent; } WindowState getWallpaperTarget() { @@ -397,11 +399,7 @@ class WallpaperController { } private void updateWallpaperOffsetLocked(WindowState changingTarget, boolean sync) { - final DisplayContent displayContent = changingTarget.getDisplayContent(); - if (displayContent == null) { - return; - } - final DisplayInfo displayInfo = displayContent.getDisplayInfo(); + final DisplayInfo displayInfo = mDisplayContent.getDisplayInfo(); final int dw = displayInfo.logicalWidth; final int dh = displayInfo.logicalHeight; @@ -464,15 +462,15 @@ class WallpaperController { } } - private void findWallpaperTarget(DisplayContent dc) { + private void findWallpaperTarget() { mFindResults.reset(); - if (dc.isStackVisible(WINDOWING_MODE_FREEFORM)) { + if (mDisplayContent.isStackVisible(WINDOWING_MODE_FREEFORM)) { // In freeform mode we set the wallpaper as its own target, so we don't need an // additional window to make it visible. mFindResults.setUseTopWallpaperAsTarget(true); } - dc.forAllWindows(mFindWallpaperTargetFunction, true /* traverseTopToBottom */); + mDisplayContent.forAllWindows(mFindWallpaperTargetFunction, true /* traverseTopToBottom */); if (mFindResults.wallpaperTarget == null && mFindResults.useTopWallpaperAsTarget) { mFindResults.setWallpaperTarget(mFindResults.topWallpaper); @@ -485,8 +483,7 @@ class WallpaperController { } /** Updates the target wallpaper if needed and returns true if an update happened. */ - private void updateWallpaperWindowsTarget(DisplayContent dc, - FindWallpaperTargetResult result) { + private void updateWallpaperWindowsTarget(FindWallpaperTargetResult result) { WindowState wallpaperTarget = result.wallpaperTarget; @@ -529,7 +526,7 @@ class WallpaperController { return; } - if (dc.getWindow(w -> w == prevWallpaperTarget) == null) { + if (mDisplayContent.getWindow(w -> w == prevWallpaperTarget) == null) { return; } @@ -550,9 +547,9 @@ class WallpaperController { // is not. If they're both hidden, still use the new target. mWallpaperTarget = prevWallpaperTarget; } else if (newTargetHidden == oldTargetHidden - && !dc.mOpeningApps.contains(wallpaperTarget.mAppToken) - && (dc.mOpeningApps.contains(prevWallpaperTarget.mAppToken) - || dc.mClosingApps.contains(prevWallpaperTarget.mAppToken))) { + && !mDisplayContent.mOpeningApps.contains(wallpaperTarget.mAppToken) + && (mDisplayContent.mOpeningApps.contains(prevWallpaperTarget.mAppToken) + || mDisplayContent.mClosingApps.contains(prevWallpaperTarget.mAppToken))) { // If they're both hidden (or both not hidden), prefer the one that's currently in // opening or closing app list, this allows transition selection logic to better // determine the wallpaper status of opening/closing apps. @@ -570,18 +567,21 @@ class WallpaperController { } } - void adjustWallpaperWindows(DisplayContent dc) { - mService.mRoot.mWallpaperMayChange = false; + void adjustWallpaperWindows() { + mDisplayContent.mWallpaperMayChange = false; // First find top-most window that has asked to be on top of the wallpaper; // all wallpapers go behind it. - findWallpaperTarget(dc); - updateWallpaperWindowsTarget(dc, mFindResults); + findWallpaperTarget(); + updateWallpaperWindowsTarget(mFindResults); // The window is visible to the compositor...but is it visible to the user? // That is what the wallpaper cares about. final boolean visible = mWallpaperTarget != null && isWallpaperVisible(mWallpaperTarget); - if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper visibility: " + visible); + if (DEBUG_WALLPAPER) { + Slog.v(TAG, "Wallpaper visibility: " + visible + " at display " + + mDisplayContent.getDisplayId()); + } if (visible) { if (mWallpaperTarget.mWallpaperX >= 0) { @@ -637,9 +637,11 @@ class WallpaperController { } if (mWallpaperDrawState == WALLPAPER_DRAW_NORMAL) { mWallpaperDrawState = WALLPAPER_DRAW_PENDING; - mService.mH.removeMessages(WALLPAPER_DRAW_PENDING_TIMEOUT); - mService.mH.sendEmptyMessageDelayed(WALLPAPER_DRAW_PENDING_TIMEOUT, - WALLPAPER_DRAW_PENDING_TIMEOUT_DURATION); + mService.mH.removeMessages(WALLPAPER_DRAW_PENDING_TIMEOUT, this); + mService.mH.sendMessageDelayed( + mService.mH.obtainMessage(WALLPAPER_DRAW_PENDING_TIMEOUT, this), + WALLPAPER_DRAW_PENDING_TIMEOUT_DURATION); + } if (DEBUG_APP_TRANSITIONS || DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper should be visible but has not been drawn yet. " + @@ -649,7 +651,7 @@ class WallpaperController { } if (wallpaperReady) { mWallpaperDrawState = WALLPAPER_DRAW_NORMAL; - mService.mH.removeMessages(WALLPAPER_DRAW_PENDING_TIMEOUT); + mService.mH.removeMessages(WALLPAPER_DRAW_PENDING_TIMEOUT, this); } return transitionReady; @@ -659,10 +661,9 @@ class WallpaperController { * Adjusts the wallpaper windows if the input display has a pending wallpaper layout or one of * the opening apps should be a wallpaper target. */ - void adjustWallpaperWindowsForAppTransitionIfNeeded(DisplayContent dc, - ArraySet<AppWindowToken> openingApps) { + void adjustWallpaperWindowsForAppTransitionIfNeeded(ArraySet<AppWindowToken> openingApps) { boolean adjust = false; - if ((dc.pendingLayoutChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0) { + if ((mDisplayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0) { adjust = true; } else { for (int i = openingApps.size() - 1; i >= 0; --i) { @@ -675,7 +676,7 @@ class WallpaperController { } if (adjust) { - adjustWallpaperWindows(dc); + adjustWallpaperWindows(); } } @@ -740,6 +741,7 @@ class WallpaperController { } void dump(PrintWriter pw, String prefix) { + pw.print(prefix); pw.print("displayId="); pw.println(mDisplayContent.getDisplayId()); pw.print(prefix); pw.print("mWallpaperTarget="); pw.println(mWallpaperTarget); if (mPrevWallpaperTarget != null) { pw.print(prefix); pw.print("mPrevWallpaperTarget="); pw.println(mPrevWallpaperTarget); diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index 46bb9810f460..449c4091f94c 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -17,6 +17,7 @@ package com.android.server.wm; import static android.view.Display.DEFAULT_DISPLAY; + import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_TRACE; import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; @@ -270,9 +271,6 @@ public class WindowAnimator { if ((bulkUpdateParams & WindowSurfacePlacer.SET_UPDATE_ROTATION) != 0) { builder.append(" UPDATE_ROTATION"); } - if ((bulkUpdateParams & WindowSurfacePlacer.SET_WALLPAPER_MAY_CHANGE) != 0) { - builder.append(" WALLPAPER_MAY_CHANGE"); - } if ((bulkUpdateParams & WindowSurfacePlacer.SET_ORIENTATION_CHANGE_COMPLETE) != 0) { builder.append(" ORIENTATION_CHANGE_COMPLETE"); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 60f2411bde95..8d5cd780e657 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3462,7 +3462,9 @@ public class WindowManagerService extends IWindowManager.Stub try { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "screenshotWallpaper"); synchronized (mGlobalLock) { - return mRoot.mWallpaperController.screenshotWallpaperLocked(); + // TODO(b/115486823) Screenshot at secondary displays if needed. + final DisplayContent dc = mRoot.getDisplayContent(DEFAULT_DISPLAY); + return dc.mWallpaperController.screenshotWallpaperLocked(); } } finally { Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); @@ -4694,7 +4696,10 @@ public class WindowManagerService extends IWindowManager.Stub break; case WALLPAPER_DRAW_PENDING_TIMEOUT: { synchronized (mGlobalLock) { - if (mRoot.mWallpaperController.processWallpaperDrawPendingTimeout()) { + final WallpaperController wallpaperController = + (WallpaperController) msg.obj; + if (wallpaperController != null + && wallpaperController.processWallpaperDrawPendingTimeout()) { mWindowPlacerLocked.performSurfacePlacement(); } } @@ -5975,7 +5980,6 @@ public class WindowManagerService extends IWindowManager.Stub pw.print(" mInputMethodWindow="); pw.println(imeWindow); } mWindowPlacerLocked.dump(pw, " "); - mRoot.mWallpaperController.dump(pw, " "); pw.print(" mSystemBooted="); pw.print(mSystemBooted); pw.print(" mDisplayEnabled="); pw.println(mDisplayEnabled); diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 838d2a1abb81..15ea5b5dea18 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -245,7 +245,7 @@ class WindowStateAnimator { mSession = win.mSession; mAttrType = win.mAttrs.type; mIsWallpaper = win.mIsWallpaper; - mWallpaperControllerLocked = mService.mRoot.mWallpaperController; + mWallpaperControllerLocked = win.getDisplayContent().mWallpaperController; } void cancelExitAnimationForNextAnimationLocked() { diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index 7d25b8c84960..7193dd7d7d9f 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -38,7 +38,6 @@ import java.io.PrintWriter; class WindowSurfacePlacer { private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowSurfacePlacer" : TAG_WM; private final WindowManagerService mService; - private final WallpaperController mWallpaperControllerLocked; private boolean mInLayout = false; @@ -46,7 +45,6 @@ class WindowSurfacePlacer { private int mLayoutRepeatCount; static final int SET_UPDATE_ROTATION = 1 << 0; - static final int SET_WALLPAPER_MAY_CHANGE = 1 << 1; static final int SET_ORIENTATION_CHANGE_COMPLETE = 1 << 2; static final int SET_WALLPAPER_ACTION_PENDING = 1 << 3; @@ -59,7 +57,6 @@ class WindowSurfacePlacer { public WindowSurfacePlacer(WindowManagerService service) { mService = service; - mWallpaperControllerLocked = mService.mRoot.mWallpaperController; mPerformSurfacePlacement = () -> { synchronized (mService.mGlobalLock) { performSurfacePlacement(); diff --git a/services/tests/servicestests/src/com/android/server/wm/WallpaperControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/WallpaperControllerTests.java index 25e73e3740c5..4ea6b3901f03 100644 --- a/services/tests/servicestests/src/com/android/server/wm/WallpaperControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/WallpaperControllerTests.java @@ -48,7 +48,7 @@ public class WallpaperControllerTests extends WindowTestsBase { synchronized (mWm.mGlobalLock) { // No wallpaper final DisplayContent dc = createNewDisplay(); - Bitmap wallpaperBitmap = mWm.mRoot.mWallpaperController.screenshotWallpaperLocked(); + Bitmap wallpaperBitmap = dc.mWallpaperController.screenshotWallpaperLocked(); assertNull(wallpaperBitmap); // No wallpaper WSA Surface @@ -56,25 +56,25 @@ public class WallpaperControllerTests extends WindowTestsBase { true, dc, true /* ownerCanManageAppTokens */); WindowState wallpaperWindow = createWindow(null /* parent */, TYPE_WALLPAPER, wallpaperWindowToken, "wallpaperWindow"); - wallpaperBitmap = mWallpaperController.screenshotWallpaperLocked(); + wallpaperBitmap = dc.mWallpaperController.screenshotWallpaperLocked(); assertNull(wallpaperBitmap); // Wallpaper with not visible WSA surface. wallpaperWindow.mWinAnimator.mSurfaceController = windowSurfaceController; wallpaperWindow.mWinAnimator.mLastAlpha = 1; - wallpaperBitmap = mWallpaperController.screenshotWallpaperLocked(); + wallpaperBitmap = dc.mWallpaperController.screenshotWallpaperLocked(); assertNull(wallpaperBitmap); when(windowSurfaceController.getShown()).thenReturn(true); // Wallpaper with WSA alpha set to 0. wallpaperWindow.mWinAnimator.mLastAlpha = 0; - wallpaperBitmap = mWallpaperController.screenshotWallpaperLocked(); + wallpaperBitmap = dc.mWallpaperController.screenshotWallpaperLocked(); assertNull(wallpaperBitmap); // Wallpaper window with WSA Surface wallpaperWindow.mWinAnimator.mLastAlpha = 1; - wallpaperBitmap = mWallpaperController.screenshotWallpaperLocked(); + wallpaperBitmap = dc.mWallpaperController.screenshotWallpaperLocked(); assertNotNull(wallpaperBitmap); } } diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java index 80bb9367b5d1..d6fea096d7ba 100644 --- a/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java +++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java @@ -27,7 +27,6 @@ import static org.mockito.Mockito.anyBoolean; import static org.mockito.Mockito.anyFloat; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -58,8 +57,8 @@ public class WindowTestUtils { public static class TestDisplayContent extends DisplayContent { private TestDisplayContent(Display display, WindowManagerService service, - WallpaperController wallpaperController, DisplayWindowController controller) { - super(display, service, wallpaperController, controller); + DisplayWindowController controller) { + super(display, service, controller); } /** Create a mocked default {@link DisplayContent}. */ diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java index 53858c7c8905..1eb46fb05b5e 100644 --- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java @@ -90,7 +90,6 @@ class WindowTestsBase { WindowState mChildAppWindowAbove; WindowState mChildAppWindowBelow; HashSet<WindowState> mCommonWindows; - WallpaperController mWallpaperController; @Rule public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule = @@ -119,8 +118,6 @@ class WindowTestsBase { mWm = mWmRule.getWindowManagerService(); beforeCreateDisplay(); - mWallpaperController = new WallpaperController(mWm); - context.getDisplay().getDisplayInfo(mDisplayInfo); mDisplayContent = createNewDisplay(); mWm.mDisplayEnabled = true; @@ -363,8 +360,7 @@ class WindowTestsBase { final Display display = new Display(DisplayManagerGlobal.getInstance(), displayId, displayInfo, DEFAULT_DISPLAY_ADJUSTMENTS); synchronized (mWm.mGlobalLock) { - return new DisplayContent(display, mWm, mWallpaperController, - mock(DisplayWindowController.class)); + return new DisplayContent(display, mWm, mock(DisplayWindowController.class)); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java index cf34fe7f802f..e56edabfa02f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java @@ -42,8 +42,8 @@ public class WindowTestUtils { public static class TestDisplayContent extends DisplayContent { private TestDisplayContent(Display display, WindowManagerService service, - WallpaperController wallpaperController, DisplayWindowController controller) { - super(display, service, wallpaperController, controller); + DisplayWindowController controller) { + super(display, service, controller); } /** |