diff options
| author | 2022-06-11 00:22:33 +0800 | |
|---|---|---|
| committer | 2022-06-11 00:22:33 +0800 | |
| commit | 828d7ca895fc412ed12f2644ceb465bc03922470 (patch) | |
| tree | 4490ca62ba4b783101a098519f22cb80cfcfa329 | |
| parent | 51d1c6ec661550a6b7033aaf42c378f866cf9cc5 (diff) | |
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
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityStarter.java | 17 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/Transition.java | 4 |
2 files changed, 13 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 3bf1c511f23a..fc412cbdad72 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -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); diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index f16305026554..d8404a79e794 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -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); |