Waiting a proper time to remove the snapshot starting window
As CL[1] removed the delay time to remove starting window in shell, even the benifits is to make good touch responsiness when launched the activity, but may easier cause flickering since removing the starting window when the activity allDrawn doesn't means the UI are all set. (like some apps might needs adjust the surface frame or even IME needs more time wait for animation finish, if the snapshot window has these previews). In case flickering happens when the Shell removes the task snapshot window too quickly, partially reverts CL[1] delay removal logic in TaskSnapshotWindow#remove, and use TaskSnapshot#hasImeSurface to set a proper delay removal time: - General (no IME visible): 100ms - IME visible: 350ms [1]: I5fb0fa3a1e6a5e6210d3baf400a84c5892bd2e34 Fix: 189825624 Test: manual switch tasks with/without ime window, also test with some market input methods. Change-Id: I7865e17b57961e12a0cdcf068e412195123a6ec7
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
|
||||
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.alpha;
|
||||
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
|
||||
@@ -63,6 +64,7 @@ import android.graphics.RectF;
|
||||
import android.hardware.HardwareBuffer;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.os.SystemClock;
|
||||
import android.os.Trace;
|
||||
import android.util.MergedConfiguration;
|
||||
import android.util.Slog;
|
||||
@@ -116,11 +118,15 @@ public class TaskSnapshotWindow {
|
||||
private static final boolean DEBUG = StartingSurfaceDrawer.DEBUG_TASK_SNAPSHOT;
|
||||
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
|
||||
private static final Point TMP_SURFACE_SIZE = new Point();
|
||||
|
||||
private final Window mWindow;
|
||||
private final Runnable mClearWindowHandler;
|
||||
private final long mDelayRemovalTime;
|
||||
private final ShellExecutor mSplashScreenExecutor;
|
||||
private final SurfaceControl mSurfaceControl;
|
||||
private final IWindowSession mSession;
|
||||
@@ -132,8 +138,10 @@ public class TaskSnapshotWindow {
|
||||
private final RectF mTmpDstFrame = new RectF();
|
||||
private final CharSequence mTitle;
|
||||
private boolean mHasDrawn;
|
||||
private long mShownTime;
|
||||
private boolean mSizeMismatch;
|
||||
private final Paint mBackgroundPaint = new Paint();
|
||||
private final int mActivityType;
|
||||
private final int mStatusBarColor;
|
||||
private final SystemBarBackgroundPainter mSystemBarBackgroundPainter;
|
||||
private final int mOrientationOnCreation;
|
||||
@@ -190,6 +198,7 @@ public class TaskSnapshotWindow {
|
||||
final Point taskSize = snapshot.getTaskSize();
|
||||
final Rect taskBounds = new Rect(0, 0, taskSize.x, taskSize.y);
|
||||
final int orientation = snapshot.getOrientation();
|
||||
final int activityType = runningTaskInfo.topActivityType;
|
||||
final int displayId = runningTaskInfo.displayId;
|
||||
|
||||
final IWindowSession session = WindowManagerGlobal.getWindowSession();
|
||||
@@ -207,10 +216,13 @@ public class TaskSnapshotWindow {
|
||||
taskDescription.setBackgroundColor(WHITE);
|
||||
}
|
||||
|
||||
final long delayRemovalTime = snapshot.hasImeSurface() ? DELAY_REMOVAL_TIME_IME_VISIBLE
|
||||
: DELAY_REMOVAL_TIME_GENERAL;
|
||||
|
||||
final TaskSnapshotWindow snapshotSurface = new TaskSnapshotWindow(
|
||||
surfaceControl, snapshot, layoutParams.getTitle(), taskDescription, appearance,
|
||||
windowFlags, windowPrivateFlags, taskBounds, orientation,
|
||||
topWindowInsetsState, clearWindowHandler, splashScreenExecutor);
|
||||
windowFlags, windowPrivateFlags, taskBounds, orientation, activityType,
|
||||
delayRemovalTime, topWindowInsetsState, clearWindowHandler, splashScreenExecutor);
|
||||
final Window window = snapshotSurface.mWindow;
|
||||
|
||||
final InsetsState mTmpInsetsState = new InsetsState();
|
||||
@@ -248,7 +260,8 @@ public class TaskSnapshotWindow {
|
||||
public TaskSnapshotWindow(SurfaceControl surfaceControl,
|
||||
TaskSnapshot snapshot, CharSequence title, TaskDescription taskDescription,
|
||||
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) {
|
||||
mSplashScreenExecutor = splashScreenExecutor;
|
||||
mSession = WindowManagerGlobal.getWindowSession();
|
||||
@@ -264,6 +277,8 @@ public class TaskSnapshotWindow {
|
||||
windowPrivateFlags, appearance, taskDescription, 1f, topWindowInsetsState);
|
||||
mStatusBarColor = taskDescription.getStatusBarColor();
|
||||
mOrientationOnCreation = currentOrientation;
|
||||
mActivityType = activityType;
|
||||
mDelayRemovalTime = delayRemovalTime;
|
||||
mTransaction = new SurfaceControl.Transaction();
|
||||
mClearWindowHandler = clearWindowHandler;
|
||||
}
|
||||
@@ -286,6 +301,17 @@ public class TaskSnapshotWindow {
|
||||
}
|
||||
|
||||
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 {
|
||||
if (DEBUG) {
|
||||
Slog.d(TAG, "Removing snapshot surface, mHasDrawn: " + mHasDrawn);
|
||||
@@ -326,6 +352,7 @@ public class TaskSnapshotWindow {
|
||||
} else {
|
||||
drawSizeMatchSnapshot();
|
||||
}
|
||||
mShownTime = SystemClock.uptimeMillis();
|
||||
mHasDrawn = true;
|
||||
reportDrawn();
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
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.content.res.Configuration.ORIENTATION_PORTRAIT;
|
||||
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",
|
||||
createTaskDescription(Color.WHITE, Color.RED, Color.BLUE),
|
||||
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());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user