summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2022-06-11 00:22:33 +0800
committer Riddle Hsu <riddlehsu@google.com> 2022-06-11 00:22:33 +0800
commit828d7ca895fc412ed12f2644ceb465bc03922470 (patch)
tree4490ca62ba4b783101a098519f22cb80cfcfa329
parent51d1c6ec661550a6b7033aaf42c378f866cf9cc5 (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.java17
-rw-r--r--services/core/java/com/android/server/wm/Transition.java4
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);