summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author wilsonshih <wilsonshih@google.com> 2024-07-26 04:51:06 +0000
committer wilsonshih <wilsonshih@google.com> 2024-07-30 03:24:28 +0000
commitf68351c7406a3dad761b4097cfdc89c617af6a16 (patch)
tree3c212b59befb3aa580dcf1803fa06239f936498d
parent4d1af3ab267cfa6684c8b537f99bb17dce483d61 (diff)
[PB] Do not show snapshot if uiMode has changed.
- Record uiMode in TaskSnapshot. - While preparing predictive back animation, if the uiMode of snapshot is not match activity's uiMode, fallback to use splash screen surface. - Draw windowless splash screen with latest theme & configuration. Flag: EXEMPT bugfix Bug: 351119448 Test: follow issue description, switch dark/light theme then trigger predictive back, verify no serious contrast changes. Test: atest SnapshotDrawerUtilsTest StartingSurfaceDrawerTests ActivityTaskManagerThumbnailLoaderTest ActivitySnapshotControllerTests TaskSnapshotPersisterLoaderTest Change-Id: I8c3b4e9444e5cfacf21c97da3b0d13c1ef76fcf3
-rw-r--r--core/java/android/window/TaskSnapshot.java28
-rw-r--r--core/tests/coretests/src/android/window/SnapshotDrawerUtilsTest.java3
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/WindowlessSplashWindowCreator.java14
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ActivityTaskManagerThumbnailLoaderTest.kt3
-rw-r--r--proto/src/windowmanager.proto1
-rw-r--r--services/core/java/com/android/server/wm/AbsAppSnapshotController.java4
-rw-r--r--services/core/java/com/android/server/wm/AppSnapshotLoader.java2
-rw-r--r--services/core/java/com/android/server/wm/BackNavigationController.java8
-rw-r--r--services/core/java/com/android/server/wm/SnapshotPersistQueue.java1
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivitySnapshotControllerTests.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java2
13 files changed, 49 insertions, 23 deletions
diff --git a/core/java/android/window/TaskSnapshot.java b/core/java/android/window/TaskSnapshot.java
index f0144cbf0f4a..20d1b3bd12ae 100644
--- a/core/java/android/window/TaskSnapshot.java
+++ b/core/java/android/window/TaskSnapshot.java
@@ -72,6 +72,7 @@ public class TaskSnapshot implements Parcelable {
int mAppearance;
private final boolean mIsTranslucent;
private final boolean mHasImeSurface;
+ private final int mUiMode;
// Must be one of the named color spaces, otherwise, always use SRGB color space.
private final ColorSpace mColorSpace;
private int mInternalReferences;
@@ -96,7 +97,7 @@ public class TaskSnapshot implements Parcelable {
Rect contentInsets, Rect letterboxInsets, boolean isLowResolution,
boolean isRealSnapshot, int windowingMode,
@WindowInsetsController.Appearance int appearance, boolean isTranslucent,
- boolean hasImeSurface) {
+ boolean hasImeSurface, int uiMode) {
mId = id;
mCaptureTime = captureTime;
mTopActivityComponent = topActivityComponent;
@@ -114,6 +115,7 @@ public class TaskSnapshot implements Parcelable {
mAppearance = appearance;
mIsTranslucent = isTranslucent;
mHasImeSurface = hasImeSurface;
+ mUiMode = uiMode;
}
private TaskSnapshot(Parcel source) {
@@ -136,6 +138,7 @@ public class TaskSnapshot implements Parcelable {
mAppearance = source.readInt();
mIsTranslucent = source.readBoolean();
mHasImeSurface = source.readBoolean();
+ mUiMode = source.readInt();
}
/**
@@ -273,6 +276,13 @@ public class TaskSnapshot implements Parcelable {
return mAppearance;
}
+ /**
+ * @return The uiMode the screenshot was taken in.
+ */
+ public int getUiMode() {
+ return mUiMode;
+ }
+
@Override
public int describeContents() {
return 0;
@@ -295,6 +305,7 @@ public class TaskSnapshot implements Parcelable {
dest.writeInt(mAppearance);
dest.writeBoolean(mIsTranslucent);
dest.writeBoolean(mHasImeSurface);
+ dest.writeInt(mUiMode);
}
@Override
@@ -318,7 +329,8 @@ public class TaskSnapshot implements Parcelable {
+ " mAppearance=" + mAppearance
+ " mIsTranslucent=" + mIsTranslucent
+ " mHasImeSurface=" + mHasImeSurface
- + " mInternalReferences=" + mInternalReferences;
+ + " mInternalReferences=" + mInternalReferences
+ + " mUiMode=" + Integer.toHexString(mUiMode);
}
/**
@@ -370,6 +382,7 @@ public class TaskSnapshot implements Parcelable {
private boolean mIsTranslucent;
private boolean mHasImeSurface;
private int mPixelFormat;
+ private int mUiMode;
public Builder setId(long id) {
mId = id;
@@ -452,6 +465,14 @@ public class TaskSnapshot implements Parcelable {
return this;
}
+ /**
+ * Sets the original uiMode while capture
+ */
+ public Builder setUiMode(int uiMode) {
+ mUiMode = uiMode;
+ return this;
+ }
+
public int getPixelFormat() {
return mPixelFormat;
}
@@ -481,7 +502,8 @@ public class TaskSnapshot implements Parcelable {
mWindowingMode,
mAppearance,
mIsTranslucent,
- mHasImeSurface);
+ mHasImeSurface,
+ mUiMode);
}
}
diff --git a/core/tests/coretests/src/android/window/SnapshotDrawerUtilsTest.java b/core/tests/coretests/src/android/window/SnapshotDrawerUtilsTest.java
index 6c8dcd39e223..fdc00ba65255 100644
--- a/core/tests/coretests/src/android/window/SnapshotDrawerUtilsTest.java
+++ b/core/tests/coretests/src/android/window/SnapshotDrawerUtilsTest.java
@@ -93,7 +93,8 @@ public class SnapshotDrawerUtilsTest {
ColorSpace.get(ColorSpace.Named.SRGB), ORIENTATION_PORTRAIT,
Surface.ROTATION_0, taskSize, contentInsets, new Rect() /* letterboxInsets */,
false, true /* isRealSnapshot */, WINDOWING_MODE_FULLSCREEN,
- 0 /* systemUiVisibility */, false /* isTranslucent */, false /* hasImeSurface */);
+ 0 /* systemUiVisibility */, false /* isTranslucent */, false /* hasImeSurface */,
+ 0 /* uiMode */);
}
private static TaskDescription createTaskDescription(int background,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/WindowlessSplashWindowCreator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/WindowlessSplashWindowCreator.java
index f3725579bf48..1a38449fa447 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/WindowlessSplashWindowCreator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/WindowlessSplashWindowCreator.java
@@ -16,7 +16,6 @@
package com.android.wm.shell.startingsurface;
-import static android.graphics.Color.WHITE;
import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_SPLASH_SCREEN;
import android.app.ActivityManager;
@@ -69,8 +68,9 @@ class WindowlessSplashWindowCreator extends AbsSplashWindowCreator {
// Can't show splash screen on requested display, so skip showing at all.
return;
}
+ final int theme = getSplashScreenTheme(0 /* splashScreenThemeResId */, activityInfo);
final Context myContext = SplashscreenContentDrawer.createContext(mContext, windowInfo,
- 0 /* theme */, STARTING_WINDOW_TYPE_SPLASH_SCREEN, mDisplayManager);
+ theme, STARTING_WINDOW_TYPE_SPLASH_SCREEN, mDisplayManager);
if (myContext == null) {
return;
}
@@ -86,19 +86,11 @@ class WindowlessSplashWindowCreator extends AbsSplashWindowCreator {
final Rect windowBounds = taskInfo.configuration.windowConfiguration.getBounds();
lp.width = windowBounds.width();
lp.height = windowBounds.height();
- final ActivityManager.TaskDescription taskDescription;
- if (taskInfo.taskDescription != null) {
- taskDescription = taskInfo.taskDescription;
- } else {
- taskDescription = new ActivityManager.TaskDescription();
- taskDescription.setBackgroundColor(WHITE);
- }
final FrameLayout rootLayout = new FrameLayout(
mSplashscreenContentDrawer.createViewContextWrapper(myContext));
viewHost.setView(rootLayout, lp);
-
- final int bgColor = taskDescription.getBackgroundColor();
+ final int bgColor = mSplashscreenContentDrawer.estimateTaskBackgroundColor(myContext);
final SplashScreenView splashScreenView = mSplashscreenContentDrawer
.makeSimpleSplashScreenContentView(myContext, windowInfo, bgColor);
rootLayout.addView(splashScreenView);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java
index ee9f88663326..af6c077303c4 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java
@@ -370,6 +370,6 @@ public class StartingSurfaceDrawerTests extends ShellTestCase {
Surface.ROTATION_0, taskSize, contentInsets, new Rect() /* letterboxInsets */,
false, true /* isRealSnapshot */, WINDOWING_MODE_FULLSCREEN,
0 /* systemUiVisibility */, false /* isTranslucent */,
- hasImeSurface /* hasImeSurface */);
+ hasImeSurface /* hasImeSurface */, 0 /* uiMode */);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ActivityTaskManagerThumbnailLoaderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ActivityTaskManagerThumbnailLoaderTest.kt
index a73df0767dbc..9797c8c5b538 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ActivityTaskManagerThumbnailLoaderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ActivityTaskManagerThumbnailLoaderTest.kt
@@ -104,6 +104,7 @@ class ActivityTaskManagerThumbnailLoaderTest : SysuiTestCase() {
WindowConfiguration.WINDOWING_MODE_FULLSCREEN,
/* appearance= */ 0,
/* isTranslucent= */ false,
- /* hasImeSurface= */ false
+ /* hasImeSurface= */ false,
+ /* uiMode */ 0
)
}
diff --git a/proto/src/windowmanager.proto b/proto/src/windowmanager.proto
index da4dfa98401e..6c8a4864ded2 100644
--- a/proto/src/windowmanager.proto
+++ b/proto/src/windowmanager.proto
@@ -45,6 +45,7 @@ message TaskSnapshotProto {
int32 letterbox_inset_top = 18;
int32 letterbox_inset_right = 19;
int32 letterbox_inset_bottom = 20;
+ int32 ui_mode = 21;
}
// Persistent letterboxing configurations
diff --git a/services/core/java/com/android/server/wm/AbsAppSnapshotController.java b/services/core/java/com/android/server/wm/AbsAppSnapshotController.java
index 68f37380659e..19eba5fe5755 100644
--- a/services/core/java/com/android/server/wm/AbsAppSnapshotController.java
+++ b/services/core/java/com/android/server/wm/AbsAppSnapshotController.java
@@ -330,6 +330,7 @@ abstract class AbsAppSnapshotController<TYPE extends WindowContainer,
builder.setIsTranslucent(isTranslucent);
builder.setWindowingMode(source.getWindowingMode());
builder.setAppearance(mainWindow.mAttrs.insetsFlags.appearance);
+ builder.setUiMode(activity.getConfiguration().uiMode);
final Configuration taskConfig = activity.getTask().getConfiguration();
final int displayRotation = taskConfig.windowConfiguration.getDisplayRotation();
@@ -448,7 +449,8 @@ abstract class AbsAppSnapshotController<TYPE extends WindowContainer,
mainWindow.getWindowConfiguration().getRotation(), new Point(taskWidth, taskHeight),
contentInsets, letterboxInsets, false /* isLowResolution */,
false /* isRealSnapshot */, source.getWindowingMode(),
- attrs.insetsFlags.appearance, false /* isTranslucent */, false /* hasImeSurface */);
+ attrs.insetsFlags.appearance, false /* isTranslucent */, false /* hasImeSurface */,
+ topActivity.getConfiguration().uiMode /* uiMode */);
return validateSnapshot(taskSnapshot);
}
diff --git a/services/core/java/com/android/server/wm/AppSnapshotLoader.java b/services/core/java/com/android/server/wm/AppSnapshotLoader.java
index ed65a2b2f8e6..5b697e518d86 100644
--- a/services/core/java/com/android/server/wm/AppSnapshotLoader.java
+++ b/services/core/java/com/android/server/wm/AppSnapshotLoader.java
@@ -203,7 +203,7 @@ class AppSnapshotLoader {
new Rect(proto.letterboxInsetLeft, proto.letterboxInsetTop,
proto.letterboxInsetRight, proto.letterboxInsetBottom),
loadLowResolutionBitmap, proto.isRealSnapshot, proto.windowingMode,
- proto.appearance, proto.isTranslucent, false /* hasImeSurface */);
+ proto.appearance, proto.isTranslucent, false /* hasImeSurface */, proto.uiMode);
} catch (IOException e) {
Slog.w(TAG, "Unable to load task snapshot data for Id=" + id);
return null;
diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java
index 0f8d68b713a7..3b263ac4b900 100644
--- a/services/core/java/com/android/server/wm/BackNavigationController.java
+++ b/services/core/java/com/android/server/wm/BackNavigationController.java
@@ -1862,7 +1862,7 @@ class BackNavigationController {
return isSnapshotCompatible(snapshot, visibleOpenActivities) ? snapshot : null;
}
- static boolean isSnapshotCompatible(@NonNull TaskSnapshot snapshot,
+ static boolean isSnapshotCompatible(@Nullable TaskSnapshot snapshot,
@NonNull ActivityRecord[] visibleOpenActivities) {
if (snapshot == null) {
return false;
@@ -1873,6 +1873,12 @@ class BackNavigationController {
if (!ar.isSnapshotOrientationCompatible(snapshot)) {
return false;
}
+ final int appNightMode = ar.getConfiguration().uiMode
+ & Configuration.UI_MODE_NIGHT_MASK;
+ final int snapshotNightMode = snapshot.getUiMode() & Configuration.UI_MODE_NIGHT_MASK;
+ if (appNightMode != snapshotNightMode) {
+ return false;
+ }
oneComponentMatch |= ar.isSnapshotComponentCompatible(snapshot);
}
return oneComponentMatch;
diff --git a/services/core/java/com/android/server/wm/SnapshotPersistQueue.java b/services/core/java/com/android/server/wm/SnapshotPersistQueue.java
index 16fcb097ca5c..1c8c245f7640 100644
--- a/services/core/java/com/android/server/wm/SnapshotPersistQueue.java
+++ b/services/core/java/com/android/server/wm/SnapshotPersistQueue.java
@@ -313,6 +313,7 @@ class SnapshotPersistQueue {
proto.appearance = mSnapshot.getAppearance();
proto.isTranslucent = mSnapshot.isTranslucent();
proto.topActivityComponent = mSnapshot.getTopActivityComponent().flattenToString();
+ proto.uiMode = mSnapshot.getUiMode();
proto.id = mSnapshot.getId();
final byte[] bytes = TaskSnapshotProto.toByteArray(proto);
final File file = mPersistInfoProvider.getProtoFile(mId, mUserId);
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivitySnapshotControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivitySnapshotControllerTests.java
index 03d30294e1d8..2a53df9f8353 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivitySnapshotControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivitySnapshotControllerTests.java
@@ -258,6 +258,6 @@ public class ActivitySnapshotControllerTests extends WindowTestsBase {
Surface.ROTATION_0, new Point(100, 100), new Rect() /* contentInsets */,
new Rect() /* letterboxInsets*/, false /* isLowResolution */,
true /* isRealSnapshot */, WINDOWING_MODE_FULLSCREEN, 0 /* mSystemUiVisibility */,
- false /* isTranslucent */, false /* hasImeSurface */);
+ false /* isTranslucent */, false /* hasImeSurface */, 0 /* uiMode */);
}
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
index 33f7035dbf18..b95f621b7f1a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
@@ -1413,7 +1413,7 @@ public class RecentTasksTest extends WindowTestsBase {
Surface.ROTATION_0, taskSize, new Rect() /* contentInsets */,
new Rect() /* letterboxInsets*/, false /* isLowResolution */,
true /* isRealSnapshot */, WINDOWING_MODE_FULLSCREEN, 0 /* mSystemUiVisibility */,
- false /* isTranslucent */, false /* hasImeSurface */);
+ false /* isTranslucent */, false /* hasImeSurface */, 0 /* uiMode */);
}
/**
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java
index 84c069691e04..1e0cef0514d8 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java
@@ -227,7 +227,7 @@ class TaskSnapshotPersisterTestBase extends WindowTestsBase {
// disk.
false /* isLowResolution */,
mIsRealSnapshot, mWindowingMode, mSystemUiVisibility, mIsTranslucent,
- false /* hasImeSurface */);
+ false /* hasImeSurface */, 0 /* uiMode */);
}
}
}