Merge "Waiting a proper time to remove the snapshot starting window" into sc-dev am: 87d84d5e23

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14957147

Change-Id: Ice188522985978023ee1836cbc238303c88bd9c6
This commit is contained in:
Ming-Shin Lu
2021-06-25 12:37:20 +00:00
committed by Automerger Merge Worker
2 changed files with 33 additions and 4 deletions

View File

@@ -16,6 +16,7 @@
package com.android.wm.shell.startingsurface; package com.android.wm.shell.startingsurface;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.graphics.Color.WHITE; import static android.graphics.Color.WHITE;
import static android.graphics.Color.alpha; import static android.graphics.Color.alpha;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
@@ -63,6 +64,7 @@ import android.graphics.RectF;
import android.hardware.HardwareBuffer; import android.hardware.HardwareBuffer;
import android.os.IBinder; import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.SystemClock;
import android.os.Trace; import android.os.Trace;
import android.util.MergedConfiguration; import android.util.MergedConfiguration;
import android.util.Slog; import android.util.Slog;
@@ -116,11 +118,15 @@ public class TaskSnapshotWindow {
private static final boolean DEBUG = StartingSurfaceDrawer.DEBUG_TASK_SNAPSHOT; private static final boolean DEBUG = StartingSurfaceDrawer.DEBUG_TASK_SNAPSHOT;
private static final String TITLE_FORMAT = "SnapshotStartingWindow for taskId=%s"; private static final String TITLE_FORMAT = "SnapshotStartingWindow for taskId=%s";
private static final long DELAY_REMOVAL_TIME_GENERAL = 100;
private static final long DELAY_REMOVAL_TIME_IME_VISIBLE = 350;
//tmp vars for unused relayout params //tmp vars for unused relayout params
private static final Point TMP_SURFACE_SIZE = new Point(); private static final Point TMP_SURFACE_SIZE = new Point();
private final Window mWindow; private final Window mWindow;
private final Runnable mClearWindowHandler; private final Runnable mClearWindowHandler;
private final long mDelayRemovalTime;
private final ShellExecutor mSplashScreenExecutor; private final ShellExecutor mSplashScreenExecutor;
private final SurfaceControl mSurfaceControl; private final SurfaceControl mSurfaceControl;
private final IWindowSession mSession; private final IWindowSession mSession;
@@ -132,8 +138,10 @@ public class TaskSnapshotWindow {
private final RectF mTmpDstFrame = new RectF(); private final RectF mTmpDstFrame = new RectF();
private final CharSequence mTitle; private final CharSequence mTitle;
private boolean mHasDrawn; private boolean mHasDrawn;
private long mShownTime;
private boolean mSizeMismatch; private boolean mSizeMismatch;
private final Paint mBackgroundPaint = new Paint(); private final Paint mBackgroundPaint = new Paint();
private final int mActivityType;
private final int mStatusBarColor; private final int mStatusBarColor;
private final SystemBarBackgroundPainter mSystemBarBackgroundPainter; private final SystemBarBackgroundPainter mSystemBarBackgroundPainter;
private final int mOrientationOnCreation; private final int mOrientationOnCreation;
@@ -190,6 +198,7 @@ public class TaskSnapshotWindow {
final Point taskSize = snapshot.getTaskSize(); final Point taskSize = snapshot.getTaskSize();
final Rect taskBounds = new Rect(0, 0, taskSize.x, taskSize.y); final Rect taskBounds = new Rect(0, 0, taskSize.x, taskSize.y);
final int orientation = snapshot.getOrientation(); final int orientation = snapshot.getOrientation();
final int activityType = runningTaskInfo.topActivityType;
final int displayId = runningTaskInfo.displayId; final int displayId = runningTaskInfo.displayId;
final IWindowSession session = WindowManagerGlobal.getWindowSession(); final IWindowSession session = WindowManagerGlobal.getWindowSession();
@@ -207,10 +216,13 @@ public class TaskSnapshotWindow {
taskDescription.setBackgroundColor(WHITE); taskDescription.setBackgroundColor(WHITE);
} }
final long delayRemovalTime = snapshot.hasImeSurface() ? DELAY_REMOVAL_TIME_IME_VISIBLE
: DELAY_REMOVAL_TIME_GENERAL;
final TaskSnapshotWindow snapshotSurface = new TaskSnapshotWindow( final TaskSnapshotWindow snapshotSurface = new TaskSnapshotWindow(
surfaceControl, snapshot, layoutParams.getTitle(), taskDescription, appearance, surfaceControl, snapshot, layoutParams.getTitle(), taskDescription, appearance,
windowFlags, windowPrivateFlags, taskBounds, orientation, windowFlags, windowPrivateFlags, taskBounds, orientation, activityType,
topWindowInsetsState, clearWindowHandler, splashScreenExecutor); delayRemovalTime, topWindowInsetsState, clearWindowHandler, splashScreenExecutor);
final Window window = snapshotSurface.mWindow; final Window window = snapshotSurface.mWindow;
final InsetsState mTmpInsetsState = new InsetsState(); final InsetsState mTmpInsetsState = new InsetsState();
@@ -248,7 +260,8 @@ public class TaskSnapshotWindow {
public TaskSnapshotWindow(SurfaceControl surfaceControl, public TaskSnapshotWindow(SurfaceControl surfaceControl,
TaskSnapshot snapshot, CharSequence title, TaskDescription taskDescription, TaskSnapshot snapshot, CharSequence title, TaskDescription taskDescription,
int appearance, int windowFlags, int windowPrivateFlags, Rect taskBounds, int appearance, int windowFlags, int windowPrivateFlags, Rect taskBounds,
int currentOrientation, InsetsState topWindowInsetsState, Runnable clearWindowHandler, int currentOrientation, int activityType, long delayRemovalTime,
InsetsState topWindowInsetsState, Runnable clearWindowHandler,
ShellExecutor splashScreenExecutor) { ShellExecutor splashScreenExecutor) {
mSplashScreenExecutor = splashScreenExecutor; mSplashScreenExecutor = splashScreenExecutor;
mSession = WindowManagerGlobal.getWindowSession(); mSession = WindowManagerGlobal.getWindowSession();
@@ -264,6 +277,8 @@ public class TaskSnapshotWindow {
windowPrivateFlags, appearance, taskDescription, 1f, topWindowInsetsState); windowPrivateFlags, appearance, taskDescription, 1f, topWindowInsetsState);
mStatusBarColor = taskDescription.getStatusBarColor(); mStatusBarColor = taskDescription.getStatusBarColor();
mOrientationOnCreation = currentOrientation; mOrientationOnCreation = currentOrientation;
mActivityType = activityType;
mDelayRemovalTime = delayRemovalTime;
mTransaction = new SurfaceControl.Transaction(); mTransaction = new SurfaceControl.Transaction();
mClearWindowHandler = clearWindowHandler; mClearWindowHandler = clearWindowHandler;
} }
@@ -286,6 +301,17 @@ public class TaskSnapshotWindow {
} }
void remove() { void remove() {
final long now = SystemClock.uptimeMillis();
if ((now - mShownTime < mDelayRemovalTime)
// Show the latest content as soon as possible for unlocking to home.
&& mActivityType != ACTIVITY_TYPE_HOME) {
final long delayTime = mShownTime + mDelayRemovalTime - now;
mSplashScreenExecutor.executeDelayed(() -> remove(), delayTime);
if (DEBUG) {
Slog.d(TAG, "Defer removing snapshot surface in " + delayTime);
}
return;
}
try { try {
if (DEBUG) { if (DEBUG) {
Slog.d(TAG, "Removing snapshot surface, mHasDrawn: " + mHasDrawn); Slog.d(TAG, "Removing snapshot surface, mHasDrawn: " + mHasDrawn);
@@ -326,6 +352,7 @@ public class TaskSnapshotWindow {
} else { } else {
drawSizeMatchSnapshot(); drawSizeMatchSnapshot();
} }
mShownTime = SystemClock.uptimeMillis();
mHasDrawn = true; mHasDrawn = true;
reportDrawn(); reportDrawn();

View File

@@ -16,6 +16,7 @@
package com.android.wm.shell.startingsurface; package com.android.wm.shell.startingsurface;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
@@ -81,7 +82,8 @@ public class TaskSnapshotWindowTest {
mWindow = new TaskSnapshotWindow(new SurfaceControl(), snapshot, "Test", mWindow = new TaskSnapshotWindow(new SurfaceControl(), snapshot, "Test",
createTaskDescription(Color.WHITE, Color.RED, Color.BLUE), createTaskDescription(Color.WHITE, Color.RED, Color.BLUE),
0 /* appearance */, windowFlags /* windowFlags */, 0 /* privateWindowFlags */, 0 /* appearance */, windowFlags /* windowFlags */, 0 /* privateWindowFlags */,
taskBounds, ORIENTATION_PORTRAIT, new InsetsState(), taskBounds, ORIENTATION_PORTRAIT, ACTIVITY_TYPE_STANDARD,
100 /* delayRemovalTime */, new InsetsState(),
null /* clearWindow */, new TestShellExecutor()); null /* clearWindow */, new TestShellExecutor());
} }