From 828d7ca895fc412ed12f2644ceb465bc03922470 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Sat, 11 Jun 2022 00:22:33 +0800 Subject: 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 --- .../java/com/android/server/wm/ActivityStarter.java | 17 ++++++++++------- .../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); -- cgit v1.2.3-59-g8ed1b