Avoid potential NPE if the restore-below task is not collected

If there is an existing collecting transition, the restore-below
task may not be collected.

Also make sure continueWindowLayout() will be called in finally
block. Previously if handleStartResult() throws exception, the
surface layout will be broken that its defer count isn't paired.

Bug: 230582311
Test: adb shell setprop persist.wm.debug.shell_transit 1; reboot
      Launch/swipe app quickly many times.
Change-Id: I7ae962c5085630a5cf194625d2f8b3e8f30a45b2
This commit is contained in:
Riddle Hsu
2022-06-11 00:22:33 +08:00
parent 51d1c6ec66
commit 828d7ca895
2 changed files with 13 additions and 8 deletions

View File

@@ -1660,14 +1660,17 @@ class ActivityStarter {
transitionController.collect(r);
try {
mService.deferWindowLayout();
Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "startActivityInner");
result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,
startFlags, doResume, options, inTask, inTaskFragment, restrictedBgActivity,
intentGrants);
try {
Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "startActivityInner");
result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,
startFlags, doResume, options, inTask, inTaskFragment, restrictedBgActivity,
intentGrants);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
startedActivityRootTask = handleStartResult(r, options, result, newTransition,
remoteTransition);
}
} finally {
Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
startedActivityRootTask = handleStartResult(r, options, result, newTransition,
remoteTransition);
mService.continueWindowLayout();
}
postStartActivityProcessing(r, result, startedActivityRootTask);

View File

@@ -229,7 +229,9 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
if (restoreBelow != null) {
final ChangeInfo info = mChanges.get(restoreBelow);
info.mFlags |= ChangeInfo.FLAG_ABOVE_TRANSIENT_LAUNCH;
if (info != null) {
info.mFlags |= ChangeInfo.FLAG_ABOVE_TRANSIENT_LAUNCH;
}
}
ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Transition %d: Set %s as "
+ "transient-launch", mSyncId, activity);