diff options
| author | 2022-12-16 06:06:13 +0000 | |
|---|---|---|
| committer | 2022-12-16 06:06:13 +0000 | |
| commit | 19ca652a00fc14401d02a1a0305f381d44c69252 (patch) | |
| tree | e602887382f88cd553abc6ed7d23047f7e06d526 | |
| parent | 80be6e838c2280022ca06bd9a8d4da1f80f5b996 (diff) | |
| parent | 05dbbf292f0d2fe8649cf8ed9760806abfc224b0 (diff) | |
Merge "Fix delay on TYPE_TASK_FRAGMENT_VANISHED" into tm-qpr-dev am: 05dbbf292f
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20731415
Change-Id: Iadfffd5c4d053153723b913d0d4f7cb70bad33af
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
3 files changed, 24 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index f4287e07c6dd..c8c1941ec90c 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -227,11 +227,16 @@ class TaskFragment extends WindowContainer<WindowContainer> { private TaskFragment mCompanionTaskFragment; /** - * Prevents duplicate calls to onTaskAppeared. + * Prevents duplicate calls to onTaskFragmentAppeared. */ boolean mTaskFragmentAppearedSent; /** + * Prevents unnecessary callbacks after onTaskFragmentVanished. + */ + boolean mTaskFragmentVanishedSent; + + /** * The last running activity of the TaskFragment was finished due to clear task while launching * an activity in the Task. */ diff --git a/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java b/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java index 6e4df794f8d8..90a0dffa25f2 100644 --- a/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java +++ b/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java @@ -553,6 +553,9 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr void onTaskFragmentAppeared(@NonNull ITaskFragmentOrganizer organizer, @NonNull TaskFragment taskFragment) { + if (taskFragment.mTaskFragmentVanishedSent) { + return; + } if (taskFragment.getTask() == null) { Slog.w(TAG, "onTaskFragmentAppeared failed because it is not attached tf=" + taskFragment); @@ -574,6 +577,9 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr void onTaskFragmentInfoChanged(@NonNull ITaskFragmentOrganizer organizer, @NonNull TaskFragment taskFragment) { + if (taskFragment.mTaskFragmentVanishedSent) { + return; + } validateAndGetState(organizer); if (!taskFragment.mTaskFragmentAppearedSent) { // Skip if TaskFragment still not appeared. @@ -586,10 +592,6 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr .setTaskFragment(taskFragment) .build(); } else { - if (pendingEvent.mEventType == PendingTaskFragmentEvent.EVENT_VANISHED) { - // Skipped the info changed event if vanished event is pending. - return; - } // Remove and add for re-ordering. removePendingEvent(pendingEvent); // Reset the defer time when TaskFragment is changed, so that it can check again if @@ -602,6 +604,10 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr void onTaskFragmentVanished(@NonNull ITaskFragmentOrganizer organizer, @NonNull TaskFragment taskFragment) { + if (taskFragment.mTaskFragmentVanishedSent) { + return; + } + taskFragment.mTaskFragmentVanishedSent = true; final TaskFragmentOrganizerState state = validateAndGetState(organizer); final List<PendingTaskFragmentEvent> pendingEvents = mPendingTaskFragmentEvents .get(organizer.asBinder()); @@ -617,20 +623,18 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr .setTaskFragment(taskFragment) .build()); state.removeTaskFragment(taskFragment); + // Make sure the vanished event will be dispatched if there are no other changes. + mAtmService.mWindowManager.mWindowPlacerLocked.requestTraversal(); } void onTaskFragmentError(@NonNull ITaskFragmentOrganizer organizer, @Nullable IBinder errorCallbackToken, @Nullable TaskFragment taskFragment, int opType, @NonNull Throwable exception) { - validateAndGetState(organizer); - Slog.w(TAG, "onTaskFragmentError ", exception); - final PendingTaskFragmentEvent vanishedEvent = taskFragment != null - ? getPendingTaskFragmentEvent(taskFragment, PendingTaskFragmentEvent.EVENT_VANISHED) - : null; - if (vanishedEvent != null) { - // No need to notify if the TaskFragment has been removed. + if (taskFragment != null && taskFragment.mTaskFragmentVanishedSent) { return; } + validateAndGetState(organizer); + Slog.w(TAG, "onTaskFragmentError ", exception); addPendingEvent(new PendingTaskFragmentEvent.Builder( PendingTaskFragmentEvent.EVENT_ERROR, organizer) .setErrorCallbackToken(errorCallbackToken) diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java index db65f49465bc..140051d5c9b1 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java @@ -247,6 +247,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mController.onTaskFragmentVanished(mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment); mController.dispatchPendingEvents(); + assertTrue(mTaskFragment.mTaskFragmentVanishedSent); assertTaskFragmentVanishedTransaction(); } @@ -259,10 +260,12 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mController.onTaskFragmentVanished(mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment); mController.dispatchPendingEvents(); + assertTrue(mTaskFragment.mTaskFragmentVanishedSent); assertTaskFragmentVanishedTransaction(); // Not trigger onTaskFragmentInfoChanged. // Call onTaskFragmentAppeared before calling onTaskFragmentInfoChanged. + mTaskFragment.mTaskFragmentVanishedSent = false; mController.onTaskFragmentAppeared(mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment); mController.dispatchPendingEvents(); clearInvocations(mOrganizer); |