diff options
| author | 2023-04-18 07:38:08 +0000 | |
|---|---|---|
| committer | 2023-04-18 07:38:08 +0000 | |
| commit | bb4cf2eb56e06de801e4c2d1905aba0ecd6bad51 (patch) | |
| tree | b07c4a1470fbd617d7bdda040664026da85a5581 | |
| parent | fae4039c246a3f3a215a3b30209de311a4108629 (diff) | |
| parent | 7673f3f876ce7566fc552fe28174812676203bf7 (diff) | |
Merge "Check null before getting task bounds" into udc-dev
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityMetricsLogger.java | 18 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java | 7 |
2 files changed, 22 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java index a757d90b75ba..f71f3b128557 100644 --- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java +++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java @@ -397,9 +397,21 @@ class ActivityMetricsLogger { /** Returns {@code true} if the incoming activity can belong to this transition. */ boolean canCoalesce(ActivityRecord r) { - return mLastLaunchedActivity.mDisplayContent == r.mDisplayContent - && mLastLaunchedActivity.getTask().getBounds().equals(r.getTask().getBounds()) - && mLastLaunchedActivity.getWindowingMode() == r.getWindowingMode(); + if (mLastLaunchedActivity.mDisplayContent != r.mDisplayContent + || mLastLaunchedActivity.getWindowingMode() != r.getWindowingMode()) { + return false; + } + // The current task should be non-null because it is just launched. While the + // last task can be cleared when starting activity with FLAG_ACTIVITY_CLEAR_TASK. + final Task lastTask = mLastLaunchedActivity.getTask(); + final Task currentTask = r.getTask(); + if (lastTask != null && currentTask != null) { + if (lastTask == currentTask) { + return true; + } + return lastTask.getBounds().equals(currentTask.getBounds()); + } + return mLastLaunchedActivity.isUid(r.launchedFromUid); } /** @return {@code true} if the activity matches a launched activity in this transition. */ diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java index 4e001fe06fb8..37c4b3787835 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java @@ -28,6 +28,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.verifyNoMor import static com.google.common.truth.Truth.assertWithMessage; +import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; @@ -501,6 +502,12 @@ public class ActivityMetricsLaunchObserverTests extends WindowTestsBase { onActivityLaunched(mTrampolineActivity); mActivityMetricsLogger.notifyActivityLaunching(mTopActivity.intent, mTrampolineActivity /* caller */, mTrampolineActivity.getUid()); + + // Simulate a corner case that the trampoline activity is removed by CLEAR_TASK. + // The 2 launch events can still be coalesced to one by matching the uid. + mTrampolineActivity.takeFromHistory(); + assertNull(mTrampolineActivity.getTask()); + notifyActivityLaunched(START_SUCCESS, mTopActivity); transitToDrawnAndVerifyOnLaunchFinished(mTopActivity); } |