Merge "Use last reported configuration for apps that are going-away" into sc-dev

This commit is contained in:
Riddle Hsu
2021-03-31 13:09:55 +00:00
committed by Android (Google) Code Review
2 changed files with 18 additions and 10 deletions

View File

@@ -2468,7 +2468,8 @@ public class WindowManagerService extends IWindowManager.Stub
// to the client erroneously accepting a configuration that would have otherwise caused // to the client erroneously accepting a configuration that would have otherwise caused
// an activity restart. We instead hand back the last reported // an activity restart. We instead hand back the last reported
// {@link MergedConfiguration}. // {@link MergedConfiguration}.
if (shouldRelayout) { if (shouldRelayout && (!win.shouldCheckTokenVisibleRequested()
|| win.mToken.isVisibleRequested())) {
win.getMergedConfiguration(mergedConfiguration); win.getMergedConfiguration(mergedConfiguration);
} else { } else {
win.getLastReportedMergedConfiguration(mergedConfiguration); win.getLastReportedMergedConfiguration(mergedConfiguration);

View File

@@ -186,6 +186,7 @@ import static com.android.server.wm.WindowStateProto.WINDOW_CONTAINER;
import static com.android.server.wm.WindowStateProto.WINDOW_FRAMES; import static com.android.server.wm.WindowStateProto.WINDOW_FRAMES;
import android.annotation.CallSuper; import android.annotation.CallSuper;
import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.AppOpsManager; import android.app.AppOpsManager;
import android.app.admin.DevicePolicyCache; 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} */ /** The owner has {@link android.Manifest.permission#INTERNAL_SYSTEM_WINDOW} */
final boolean mOwnerCanAddInternalSystemWindow; final boolean mOwnerCanAddInternalSystemWindow;
final WindowId mWindowId; 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. // The same object as mToken if this is an app window and null for non-app windows.
ActivityRecord mActivityRecord; ActivityRecord mActivityRecord;
@@ -1814,13 +1815,22 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
@Override @Override
boolean isVisibleRequested() { boolean isVisibleRequested() {
if (mToken != null && (mActivityRecord != null || mToken.asWallpaperToken() != null)) { if (shouldCheckTokenVisibleRequested()) {
// Currently only ActivityRecord and WallpaperToken support visibleRequested.
return isVisible() && mToken.isVisibleRequested(); return isVisible() && mToken.isVisibleRequested();
} }
return isVisible(); 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. * Ensures that all the policy visibility bits are set.
* @return {@code true} if all flags about visiblity 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) { if (!mHasSurface || isParentWindowHidden() || mAnimatingExit || mDestroying) {
return false; return false;
} }
final boolean isWallpaper = mToken != null && mToken.asWallpaperToken() != null; final boolean isWallpaper = mToken.asWallpaperToken() != null;
return !isWallpaper || mToken.isVisible(); 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 // When there is keyguard, wallpaper could be placed over the secure app
// window but invisible. We need to check wallpaper visibility explicitly // window but invisible. We need to check wallpaper visibility explicitly
// to determine if it's occluding apps. // 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) return ((!isWallpaper && mAttrs.format == PixelFormat.OPAQUE)
|| (isWallpaper && mToken.isVisible())) || (isWallpaper && mToken.isVisible()))
&& isDrawn() && !isAnimating(TRANSITION | PARENTS); && isDrawn() && !isAnimating(TRANSITION | PARENTS);
@@ -3340,8 +3350,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
void sendAppVisibilityToClients() { void sendAppVisibilityToClients() {
super.sendAppVisibilityToClients(); super.sendAppVisibilityToClients();
if (mToken == null) return;
final boolean clientVisible = mToken.isClientVisible(); final boolean clientVisible = mToken.isClientVisible();
// TODO(shell-transitions): This is currently only applicable to app windows, BUT we // TODO(shell-transitions): This is currently only applicable to app windows, BUT we
// want to extend the "starting" concept to other windows. // 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 // 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 // either since it is going away. This is likely during a transition so we want to preserve
// the original state. // the original state.
if ((mActivityRecord != null || mToken.asWallpaperToken() != null) if (shouldCheckTokenVisibleRequested() && !mToken.isVisibleRequested()) {
&& !mToken.isVisibleRequested()) {
return; return;
} }