Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48e2964e authored by Gaurav Bhola's avatar Gaurav Bhola Committed by Automerger Merge Worker
Browse files

Merge "Fix the ordering of taskevents." into tm-dev am: 401af7cf

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17201603

Change-Id: Ie392a5c4ee0ce61702cead643ce3e48bd9f523d7
parents 28c1267b 401af7cf
Loading
Loading
Loading
Loading
+27 −8
Original line number Diff line number Diff line
@@ -67,7 +67,8 @@ import java.util.function.Consumer;
class TaskOrganizerController extends ITaskOrganizerController.Stub {
    private static final String TAG = "TaskOrganizerController";

    private class DeathRecipient implements IBinder.DeathRecipient {
    @VisibleForTesting
    class DeathRecipient implements IBinder.DeathRecipient {
        ITaskOrganizer mTaskOrganizer;

        DeathRecipient(ITaskOrganizer organizer) {
@@ -77,7 +78,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
        @Override
        public void binderDied() {
            synchronized (mGlobalLock) {
                final TaskOrganizerState state = mTaskOrganizerStates.remove(
                final TaskOrganizerState state = mTaskOrganizerStates.get(
                        mTaskOrganizer.asBinder());
                if (state != null) {
                    state.dispose();
@@ -170,7 +171,8 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
        }
    }

    private class TaskOrganizerState {
    @VisibleForTesting
    class TaskOrganizerState {
        private final TaskOrganizerCallbacks mOrganizer;
        private final DeathRecipient mDeathRecipient;
        private final ArrayList<Task> mOrganizedTasks = new ArrayList<>();
@@ -191,6 +193,11 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
            mUid = uid;
        }

        @VisibleForTesting
        DeathRecipient getDeathRecipient() {
            return mDeathRecipient;
        }

        /**
         * Register this task with this state, but doesn't trigger the task appeared callback to
         * the organizer.
@@ -265,7 +272,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {

            // Remove organizer state after removing tasks so we get a chance to send
            // onTaskVanished.
            mTaskOrganizerStates.remove(asBinder());
            mTaskOrganizerStates.remove(mOrganizer.getBinder());
        }

        void unlinkDeath() {
@@ -596,7 +603,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
    private void onTaskVanishedInternal(ITaskOrganizer organizer, Task task) {
        for (int i = mPendingTaskEvents.size() - 1; i >= 0; i--) {
            PendingTaskEvent entry = mPendingTaskEvents.get(i);
            if (task.mTaskId == entry.mTask.mTaskId) {
            if (task.mTaskId == entry.mTask.mTaskId && entry.mTaskOrg == organizer) {
                // This task is vanished so remove all pending event of it.
                mPendingTaskEvents.remove(i);
                if (entry.mEventType == PendingTaskEvent.EVENT_APPEARED) {
@@ -693,9 +700,16 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
                    }
                    break;
                case PendingTaskEvent.EVENT_VANISHED:
                    state = mTaskOrganizerStates.get(event.mTaskOrg.asBinder());
                    if (state != null) {
                        state.mOrganizer.onTaskVanished(task);
                    // TaskOrganizerState cannot be used here because it might have already been
                    // removed.
                    // The state is removed when an organizer dies or is unregistered. In order to
                    // send the pending vanished task events, the mTaskOrg from event is used.
                    // These events should not ideally be sent and will be removed as part of
                    // b/224812558.
                    try {
                        event.mTaskOrg.onTaskVanished(task.getTaskInfo());
                    } catch (RemoteException ex) {
                        Slog.e(TAG, "Exception sending onTaskVanished callback", ex);
                    }
                    mLastSentTaskInfos.remove(task);
                    break;
@@ -1045,4 +1059,9 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
        }
        pw.println();
    }

    @VisibleForTesting
    TaskOrganizerState getTaskOrganizerState(IBinder taskOrganizer) {
        return mTaskOrganizerStates.get(taskOrganizer);
    }
}
+45 −0
Original line number Diff line number Diff line
@@ -308,6 +308,51 @@ public class WindowOrganizerTests extends WindowTestsBase {
        assertTaskVanished(organizer2, true /* expectVanished */, rootTask, rootTask2, rootTask3);
    }

    @Test
    public void testOrganizerDeathReturnsRegistrationToPrevious() throws RemoteException {
        final Task rootTask = createRootTask();
        final Task task = createTask(rootTask);
        final Task rootTask2 = createRootTask();
        final Task task2 = createTask(rootTask2);
        final Task rootTask3 = createRootTask();
        final Task task3 = createTask(rootTask3);
        final ArrayList<TaskAppearedInfo> existingTasks = new ArrayList<>();
        final ITaskOrganizer organizer = registerMockOrganizer(existingTasks);
        // Ensure events dispatch to organizer.
        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();

        // verify that tasks are returned and taskAppeared is not called
        assertContainsTasks(existingTasks, rootTask, rootTask2, rootTask3);
        verify(organizer, times(0)).onTaskAppeared(any(RunningTaskInfo.class),
                any(SurfaceControl.class));
        verify(organizer, times(0)).onTaskVanished(any());
        assertTrue(rootTask.isOrganized());

        // Now we replace the registration and verify the new organizer receives existing tasks
        final ArrayList<TaskAppearedInfo> existingTasks2 = new ArrayList<>();
        final ITaskOrganizer organizer2 = registerMockOrganizer(existingTasks2);
        // Ensure events dispatch to organizer.
        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
        assertContainsTasks(existingTasks2, rootTask, rootTask2, rootTask3);
        verify(organizer2, times(0)).onTaskAppeared(any(RunningTaskInfo.class),
                any(SurfaceControl.class));
        verify(organizer2, times(0)).onTaskVanished(any());
        // Removed tasks from the original organizer
        assertTaskVanished(organizer, true /* expectVanished */, rootTask, rootTask2, rootTask3);
        assertTrue(rootTask2.isOrganized());

        // Trigger binderDied for second one, the first one should automatically be reregistered
        // so we verify that it's now seeing changes.
        mWm.mAtmService.mTaskOrganizerController.getTaskOrganizerState(organizer2.asBinder())
                .getDeathRecipient().binderDied();

        // Ensure events dispatch to organizer.
        mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
        verify(organizer, times(3))
                .onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
        assertTaskVanished(organizer2, true /* expectVanished */, rootTask, rootTask2, rootTask3);
    }

    @Test
    public void testRegisterTaskOrganizerWithExistingTasks() throws RemoteException {
        final Task rootTask = createRootTask();