Merge "Use WeakReference for the TaskSnapshotWindow in inner Window." into tm-dev

This commit is contained in:
Wei Sheng Shih
2022-03-30 23:59:22 +00:00
committed by Android (Google) Code Review
2 changed files with 28 additions and 32 deletions

View File

@@ -633,7 +633,7 @@ public class StartingSurfaceDrawer {
Slog.e(TAG, "Found empty splash screen, remove!");
removeWindowInner(record.mDecorView, false);
}
mStartingWindowRecords.remove(taskId);
}
if (record.mTaskSnapshotWindow != null) {
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_STARTING_WINDOW,
@@ -641,10 +641,10 @@ public class StartingSurfaceDrawer {
if (immediately) {
record.mTaskSnapshotWindow.removeImmediately();
} else {
record.mTaskSnapshotWindow.scheduleRemove(() ->
mStartingWindowRecords.remove(taskId), removalInfo.deferRemoveForIme);
record.mTaskSnapshotWindow.scheduleRemove(removalInfo.deferRemoveForIme);
}
}
mStartingWindowRecords.remove(taskId);
}
}

View File

@@ -91,6 +91,8 @@ import com.android.internal.view.BaseIWindow;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
import java.lang.ref.WeakReference;
/**
* This class represents a starting window that shows a snapshot.
*
@@ -149,7 +151,7 @@ public class TaskSnapshotWindow {
private final SurfaceControl.Transaction mTransaction;
private final Matrix mSnapshotMatrix = new Matrix();
private final float[] mTmpFloat9 = new float[9];
private Runnable mScheduledRunnable;
private final Runnable mScheduledRunnable = this::removeImmediately;
private final boolean mHasImeSurface;
static TaskSnapshotWindow create(StartingWindowInfo info, IBinder appToken,
@@ -306,21 +308,13 @@ public class TaskSnapshotWindow {
mSystemBarBackgroundPainter.drawNavigationBarBackground(c);
}
void scheduleRemove(Runnable onRemove, boolean deferRemoveForIme) {
void scheduleRemove(boolean deferRemoveForIme) {
// Show the latest content as soon as possible for unlocking to home.
if (mActivityType == ACTIVITY_TYPE_HOME) {
removeImmediately();
onRemove.run();
return;
}
if (mScheduledRunnable != null) {
mSplashScreenExecutor.removeCallbacks(mScheduledRunnable);
mScheduledRunnable = null;
}
mScheduledRunnable = () -> {
TaskSnapshotWindow.this.removeImmediately();
onRemove.run();
};
mSplashScreenExecutor.removeCallbacks(mScheduledRunnable);
final long delayRemovalTime = mHasImeSurface && deferRemoveForIme
? MAX_DELAY_REMOVAL_TIME_IME_VISIBLE
: DELAY_REMOVAL_TIME_GENERAL;
@@ -524,35 +518,37 @@ public class TaskSnapshotWindow {
}
}
@BinderThread
static class Window extends BaseIWindow {
private TaskSnapshotWindow mOuter;
private WeakReference<TaskSnapshotWindow> mOuter;
public void setOuter(TaskSnapshotWindow outer) {
mOuter = outer;
mOuter = new WeakReference<>(outer);
}
@BinderThread
@Override
public void resized(ClientWindowFrames frames, boolean reportDraw,
MergedConfiguration mergedConfiguration, InsetsState insetsState,
boolean forceLayout, boolean alwaysConsumeSystemBars, int displayId, int seqId,
int resizeMode) {
if (mOuter != null) {
mOuter.mSplashScreenExecutor.execute(() -> {
if (mergedConfiguration != null
&& mOuter.mOrientationOnCreation
!= mergedConfiguration.getMergedConfiguration().orientation) {
// The orientation of the screen is changing. We better remove the snapshot
// ASAP as we are going to wait on the new window in any case to unfreeze
// the screen, and the starting window is not needed anymore.
mOuter.clearWindowSynced();
} else if (reportDraw) {
if (mOuter.mHasDrawn) {
mOuter.reportDrawn();
}
}
});
final TaskSnapshotWindow snapshot = mOuter.get();
if (snapshot == null) {
return;
}
snapshot.mSplashScreenExecutor.execute(() -> {
if (mergedConfiguration != null
&& snapshot.mOrientationOnCreation
!= mergedConfiguration.getMergedConfiguration().orientation) {
// The orientation of the screen is changing. We better remove the snapshot
// ASAP as we are going to wait on the new window in any case to unfreeze
// the screen, and the starting window is not needed anymore.
snapshot.clearWindowSynced();
} else if (reportDraw) {
if (snapshot.mHasDrawn) {
snapshot.reportDrawn();
}
}
});
}
}