Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7ac304d0 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Use last reported configuration for apps that are going-away

This aligns the same condition as commit e3f5afaf and a841c154
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
parent 91aea8eb
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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);
+16 −9
Original line number Diff line number Diff line
@@ -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;
        }