summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java3
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java25
2 files changed, 18 insertions, 10 deletions
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index a670b390cb94..c23cc2e709c0 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2468,7 +2468,8 @@ public class WindowManagerService extends IWindowManager.Stub
// to the client erroneously accepting a configuration that would have otherwise caused
// an activity restart. We instead hand back the last reported
// {@link MergedConfiguration}.
- if (shouldRelayout) {
+ if (shouldRelayout && (!win.shouldCheckTokenVisibleRequested()
+ || win.mToken.isVisibleRequested())) {
win.getMergedConfiguration(mergedConfiguration);
} else {
win.getLastReportedMergedConfiguration(mergedConfiguration);
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 92c95221f102..171e93fb4df9 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -186,6 +186,7 @@ import static com.android.server.wm.WindowStateProto.WINDOW_CONTAINER;
import static com.android.server.wm.WindowStateProto.WINDOW_FRAMES;
import android.annotation.CallSuper;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.AppOpsManager;
import android.app.admin.DevicePolicyCache;
@@ -298,7 +299,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
/** The owner has {@link android.Manifest.permission#INTERNAL_SYSTEM_WINDOW} */
final boolean mOwnerCanAddInternalSystemWindow;
final WindowId mWindowId;
- WindowToken mToken;
+ @NonNull WindowToken mToken;
// The same object as mToken if this is an app window and null for non-app windows.
ActivityRecord mActivityRecord;
@@ -1814,14 +1815,23 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
@Override
boolean isVisibleRequested() {
- if (mToken != null && (mActivityRecord != null || mToken.asWallpaperToken() != null)) {
- // Currently only ActivityRecord and WallpaperToken support visibleRequested.
+ if (shouldCheckTokenVisibleRequested()) {
return isVisible() && mToken.isVisibleRequested();
}
return isVisible();
}
/**
+ * Returns {@code true} if {@link WindowToken#isVisibleRequested()} should be considered
+ * before dispatching the latest configuration. Currently only {@link
+ * ActivityRecord#isVisibleRequested()} and {@link WallpaperWindowToken#isVisibleRequested()}
+ * implement explicit visible-requested.
+ */
+ boolean shouldCheckTokenVisibleRequested() {
+ return mActivityRecord != null || mToken.asWallpaperToken() != null;
+ }
+
+ /**
* Ensures that all the policy visibility bits are set.
* @return {@code true} if all flags about visiblity are set
*/
@@ -1851,7 +1861,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
if (!mHasSurface || isParentWindowHidden() || mAnimatingExit || mDestroying) {
return false;
}
- final boolean isWallpaper = mToken != null && mToken.asWallpaperToken() != null;
+ final boolean isWallpaper = mToken.asWallpaperToken() != null;
return !isWallpaper || mToken.isVisible();
}
@@ -2053,7 +2063,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// When there is keyguard, wallpaper could be placed over the secure app
// window but invisible. We need to check wallpaper visibility explicitly
// to determine if it's occluding apps.
- final boolean isWallpaper = mToken != null && mToken.asWallpaperToken() != null;
+ final boolean isWallpaper = mToken.asWallpaperToken() != null;
return ((!isWallpaper && mAttrs.format == PixelFormat.OPAQUE)
|| (isWallpaper && mToken.isVisible()))
&& isDrawn() && !isAnimating(TRANSITION | PARENTS);
@@ -3340,8 +3350,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
void sendAppVisibilityToClients() {
super.sendAppVisibilityToClients();
- if (mToken == null) return;
-
final boolean clientVisible = mToken.isClientVisible();
// TODO(shell-transitions): This is currently only applicable to app windows, BUT we
// want to extend the "starting" concept to other windows.
@@ -3734,8 +3742,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// If this is an activity or wallpaper and is invisible or going invisible, don't report
// either since it is going away. This is likely during a transition so we want to preserve
// the original state.
- if ((mActivityRecord != null || mToken.asWallpaperToken() != null)
- && !mToken.isVisibleRequested()) {
+ if (shouldCheckTokenVisibleRequested() && !mToken.isVisibleRequested()) {
return;
}