Support wallpaper on secondary displays.(2/N)
Modify wm struct to let DisplayContent has its own WallpaperController.
The wallpaper target would be decided for each display.
Remove SET_WALLPAPER_MAY_CHANGE flag from WindowSurfacePlacer, its not
used anymore.
Bug: 115486823
Bug: 118645630
Bug: 118662630
Test: Manual test with Chromecast.
Test: atest WallpaperControllerTests
Test: atest WmTests
Test: atest ActivityManagerMultiDisplayTests
Change-Id: I5ec1320ff0500ce3f7b9429a594bc44b7267cc5f
diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java
index 94a47dd..e65f3b4 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_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 @@
AppTransitionController(WindowManagerService service, DisplayContent displayContent) {
mService = service;
mDisplayContent = displayContent;
- mWallpaperControllerLocked = new WallpaperController(mService);
+ mWallpaperControllerLocked = mDisplayContent.mWallpaperController;
}
/**
@@ -106,7 +105,7 @@
mDisplayContent.mAppTransition.removeAppTransitionTimeoutCallbacks();
- mService.mRoot.mWallpaperMayChange = false;
+ mDisplayContent.mWallpaperMayChange = false;
int i;
for (i = 0; i < appsCount; i++) {
@@ -121,7 +120,7 @@
// 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 ab7d259..2f7956e 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 @@
WallpaperController mWallpaperController;
+ boolean mWallpaperMayChange = false;
+
private final SurfaceSession mSession = new SurfaceSession();
/**
@@ -751,8 +753,7 @@
}
}
- 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 @@
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 @@
* 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 @@
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 @@
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 @@
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 @@
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 61bc4e4..83d32c8ad 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.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 @@
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 2399716..72e3562 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.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 @@
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 @@
boolean mOrientationChangeComplete = true;
boolean mWallpaperActionPending = false;
- final WallpaperController mWallpaperController;
-
private final Handler mHandler;
private String mCloseSystemDialogsReason;
@@ -150,7 +146,6 @@
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 @@
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 @@
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 @@
}
// 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 @@
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 @@
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 @@
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 b411fad..6838c55 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.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.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 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 @@
}
}
+ 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 @@
@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 @@
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 @@
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 @@
@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 29e1b20..15239c7 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 @@
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 @@
return false;
};
- public WallpaperController(WindowManagerService service) {
+ WallpaperController(WindowManagerService service, DisplayContent displayContent) {
mService = service;
+ mDisplayContent = displayContent;
}
WindowState getWallpaperTarget() {
@@ -397,11 +399,7 @@
}
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 @@
}
}
- 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 @@
}
/** 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 @@
return;
}
- if (dc.getWindow(w -> w == prevWallpaperTarget) == null) {
+ if (mDisplayContent.getWindow(w -> w == prevWallpaperTarget) == null) {
return;
}
@@ -550,9 +547,9 @@
// 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 @@
}
}
- 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 @@
}
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 @@
}
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 @@
* 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 @@
}
if (adjust) {
- adjustWallpaperWindows(dc);
+ adjustWallpaperWindows();
}
}
@@ -740,6 +741,7 @@
}
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 46bb981..449c409 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 @@
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 60f2411..8d5cd78 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 @@
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 @@
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 @@
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 838d2a1..15ea5b5 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 @@
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 7d25b8c..7193dd7 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 @@
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 @@
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 @@
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 25e73e3..4ea6b39 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 @@
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 @@
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 80bb936..d6fea09 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.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 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 53858c7..1eb46fb 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 @@
WindowState mChildAppWindowAbove;
WindowState mChildAppWindowBelow;
HashSet<WindowState> mCommonWindows;
- WallpaperController mWallpaperController;
@Rule
public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule =
@@ -119,8 +118,6 @@
mWm = mWmRule.getWindowManagerService();
beforeCreateDisplay();
- mWallpaperController = new WallpaperController(mWm);
-
context.getDisplay().getDisplayInfo(mDisplayInfo);
mDisplayContent = createNewDisplay();
mWm.mDisplayEnabled = true;
@@ -363,8 +360,7 @@
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 cf34fe7..e56edab 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 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);
}
/**