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

Commit 8315408b authored by Chris Li's avatar Chris Li
Browse files

Fix TaskFragment pending event not dispatch

Since ag/16226483, we defer sending TaskFragment event when the
TaskFragment is not visible, and set a defer time to task#lastActiveTime
(see #dispatchPendingEvents). However, task#lastActiveTime is only
called when TaskFragment#startPausing, so it can issue when the Task is
resumed again.

Fix: 223705682
Test: verify with Settings
Test: atest WmTests:TaskFragmentOrganizerControllerTest
Change-Id: I40798c893298b67e2cbb785f33b15f7ab8d6fc86
parent 2907ec82
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -405,6 +405,12 @@ class TaskFragment extends WindowContainer<WindowContainer> {
            Slog.d(TAG, "setResumedActivity taskFrag:" + this + " + from: "
                    + mResumedActivity + " to:" + r + " reason:" + reason);
        }

        if (r != null && mResumedActivity == null) {
            // Task is becoming active.
            getTask().touchActiveTime();
        }

        final ActivityRecord prevR = mResumedActivity;
        mResumedActivity = r;
        mTaskSupervisor.updateTopResumedActivityIfNeeded();
+34 −0
Original line number Diff line number Diff line
@@ -484,6 +484,40 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase {
        verify(mOrganizer, never()).onTaskFragmentInfoChanged(any());
    }

    @Test
    public void testCanSendPendingTaskFragmentEventsAfterActivityResumed() {
        // Task - TaskFragment - Activity.
        final Task task = createTask(mDisplayContent);
        final TaskFragment taskFragment = new TaskFragmentBuilder(mAtm)
                .setParentTask(task)
                .setOrganizer(mOrganizer)
                .setFragmentToken(mFragmentToken)
                .createActivityCount(1)
                .build();
        final ActivityRecord activity = taskFragment.getTopMostActivity();

        // Mock the task to invisible
        doReturn(false).when(task).shouldBeVisible(any());
        taskFragment.setResumedActivity(null, "test");

        // Sending events
        mController.registerOrganizer(mIOrganizer);
        taskFragment.mTaskFragmentAppearedSent = true;
        mController.onTaskFragmentInfoChanged(mIOrganizer, taskFragment);
        mController.dispatchPendingEvents();

        // Verifies that event was not sent
        verify(mOrganizer, never()).onTaskFragmentInfoChanged(any());

        // Mock the task becomes visible, and activity resumed
        doReturn(true).when(task).shouldBeVisible(any());
        taskFragment.setResumedActivity(activity, "test");

        // Verifies that event is sent.
        mController.dispatchPendingEvents();
        verify(mOrganizer).onTaskFragmentInfoChanged(any());
    }

    /**
     * Tests that a task fragment info changed event is still sent if the task is invisible only
     * when the info changed event is because of the last activity in a task finishing.