Use last reported configuration for apps that are going-away

This aligns the same condition as commit e3f5afa and a841c15
in WindowState#reportResized. Otherwise the app may get
inconsistent configuration. For example, switching activities
from one with show-when-locked to another one without the flag
with a secured lock and orientation change. The starting
activity needs to resume and relayout (mClientVisible) once,
but its visible-requested has been updated to false because
lockscreen is still showing. Then the app becomes out of sync
with ActivityRecord#mLastReportedConfiguration.

Bug: 183889107
Test: 1. Enable secured lock.
      2. Launch a landscape show-when-locked activity.
      3. Off/on screen to enter lockscreen.
      4. Press home key and unlock.
      Launcher should not get landscape configuration.
Change-Id: I19af6cf7f9a4a27fbc987d920630e2de95ced602
This commit is contained in:
Riddle Hsu
2021-03-31 17:55:18 +08:00
parent 91aea8ebc8
commit 7ac304d09a
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
// 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);

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 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,13 +1815,22 @@ 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;
}