diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/WallpaperWindowToken.java | 15 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowStateAnimator.java | 15 |
2 files changed, 26 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/wm/WallpaperWindowToken.java b/services/core/java/com/android/server/wm/WallpaperWindowToken.java index 9d1551c12216..b7f8505b4a65 100644 --- a/services/core/java/com/android/server/wm/WallpaperWindowToken.java +++ b/services/core/java/com/android/server/wm/WallpaperWindowToken.java @@ -32,6 +32,7 @@ import android.os.RemoteException; import android.util.SparseArray; import com.android.internal.protolog.common.ProtoLog; +import com.android.window.flags.Flags; import java.util.function.Consumer; @@ -80,6 +81,20 @@ class WallpaperWindowToken extends WindowToken { mDisplayContent.mWallpaperController.removeWallpaperToken(this); } + @Override + public void prepareSurfaces() { + super.prepareSurfaces(); + + if (Flags.ensureWallpaperInTransitions()) { + // Similar to Task.prepareSurfaces, outside of transitions we need to apply visibility + // changes directly. In transitions the transition player will take care of applying the + // visibility change. + if (!mTransitionController.inTransition(this)) { + getSyncTransaction().setVisibility(mSurfaceControl, isVisible()); + } + } + } + /** * Controls whether this wallpaper shows underneath the keyguard or is hidden and only * revealed once keyguard is dismissed. diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 6fd7aa0e4a78..9ecd49213237 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -63,6 +63,7 @@ import android.view.animation.AnimationUtils; import com.android.internal.protolog.common.LogLevel; import com.android.internal.protolog.common.ProtoLog; +import com.android.window.flags.Flags; import com.android.server.policy.WindowManagerPolicy; import java.io.PrintWriter; @@ -374,9 +375,13 @@ class WindowStateAnimator { ProtoLog.i(WM_SHOW_SURFACE_ALLOC, "SURFACE DESTROY: %s. %s", mWin, new RuntimeException().fillInStackTrace()); destroySurface(t); - // Don't hide wallpaper if we're deferring the surface destroy - // because of a surface change. - mWallpaperControllerLocked.hideWallpapers(mWin); + if (Flags.ensureWallpaperInTransitions()) { + if (mWallpaperControllerLocked.isWallpaperTarget(mWin)) { + mWin.requestUpdateWallpaperIfNeeded(); + } + } else { + mWallpaperControllerLocked.hideWallpapers(mWin); + } } catch (RuntimeException e) { Slog.w(TAG, "Exception thrown when destroying Window " + this + " surface " + mSurfaceController + " session " + mSession + ": " @@ -431,7 +436,9 @@ class WindowStateAnimator { if (!w.isOnScreen()) { hide(t, "prepareSurfaceLocked"); - mWallpaperControllerLocked.hideWallpapers(w); + if (!w.mIsWallpaper || !Flags.ensureWallpaperInTransitions()) { + mWallpaperControllerLocked.hideWallpapers(w); + } // If we are waiting for this window to handle an orientation change. If this window is // really hidden (gone for layout), there is no point in still waiting for it. |