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

Commit 64a2f000 authored by Jacqueline Bronger's avatar Jacqueline Bronger
Browse files

TV PiP: prevent unnecessary notification updates

Updates have been sent every time the PiP moved (manually or due to
auto-move behavior) since the expansion state is being updated at the
end of each transition. Now checking whether the expand/collapse action
has actually changed.

Bug: 268681026
Test: manual - check that the notification is not being updated by
moving the PiP and checking the TvPipNotificationController logs.
Test: atest TvPipActionProviderTest

Change-Id: I6c3d8697b22acbde8db187897573c70644f98b5c
parent d00b03a8
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -186,17 +186,18 @@ public class TvPipActionsProvider implements TvPipAction.SystemActionsHandler {
    }

    @VisibleForTesting(visibility = PACKAGE)
    public void onPipExpansionToggled(boolean expanded) {
    public void updatePipExpansionState(boolean expanded) {
        ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
                "%s: onPipExpansionToggled, expanded: %b", TAG, expanded);

        mExpandCollapseAction.update(
        boolean changed = mExpandCollapseAction.update(
                expanded ? R.string.pip_collapse : R.string.pip_expand,
                expanded ? R.drawable.pip_ic_collapse : R.drawable.pip_ic_expand);

        if (changed) {
            notifyActionsChanged(/* added= */ 0, /* updated= */ 1,
                    mActionsList.indexOf(mExpandCollapseAction));
        }
    }

    List<TvPipAction> getActionsList() {
        return mActionsList;
+2 −2
Original line number Diff line number Diff line
@@ -502,7 +502,7 @@ public class TvPipController implements PipTransitionController.PipTransitionCal
                "%s: onPipTransition_Canceled(), state=%s", TAG, stateToName(mState));
        mTvPipMenuController.onPipTransitionFinished(
                PipAnimationController.isInPipDirection(direction));
        mTvPipActionsProvider.onPipExpansionToggled(mTvPipBoundsState.isTvPipExpanded());
        mTvPipActionsProvider.updatePipExpansionState(mTvPipBoundsState.isTvPipExpanded());
    }

    @Override
@@ -515,7 +515,7 @@ public class TvPipController implements PipTransitionController.PipTransitionCal
                "%s: onPipTransition_Finished(), state=%s, direction=%d",
                TAG, stateToName(mState), direction);
        mTvPipMenuController.onPipTransitionFinished(enterPipTransition);
        mTvPipActionsProvider.onPipExpansionToggled(mTvPipBoundsState.isTvPipExpanded());
        mTvPipActionsProvider.updatePipExpansionState(mTvPipBoundsState.isTvPipExpanded());
    }

    private void updateExpansionState() {
+6 −1
Original line number Diff line number Diff line
@@ -52,9 +52,14 @@ public class TvPipSystemAction extends TvPipAction {
                broadcastAction);
    }

    void update(@StringRes int title, @DrawableRes int icon) {
    /**
     * @return true if the title and/or icon were changed.
     */
    boolean update(@StringRes int title, @DrawableRes int icon) {
        boolean changed = title != mTitleResource || icon != mIconResource;
        mTitleResource = title;
        mIconResource = icon;
        return changed;
    }

    void populateButton(@NonNull TvWindowMenuActionButton button, Handler mainHandler) {
+61 −7
Original line number Diff line number Diff line
@@ -158,19 +158,73 @@ public class TvPipActionProviderTest extends ShellTestCase {
                new int[]{ACTION_FULLSCREEN, ACTION_CLOSE, ACTION_MOVE, ACTION_EXPAND_COLLAPSE}));
    }

    @Test
    public void expandedPip_toggleExpansion() {
        assumeTelevision();
        // PiP has expanded PiP enabled, but is in a collapsed state
    private void check_expandedPip_updateExpansionState(
            boolean startExpansion, boolean endExpansion, boolean updateExpected) {

        mActionsProvider.updateExpansionEnabled(true);
        mActionsProvider.onPipExpansionToggled(/* expanded= */ false);
        mActionsProvider.updatePipExpansionState(startExpansion);

        mActionsProvider.addListener(mMockListener);
        mActionsProvider.onPipExpansionToggled(/* expanded= */ true);
        mActionsProvider.updatePipExpansionState(endExpansion);

        assertTrue(checkActionsMatch(mActionsProvider.getActionsList(),
                new int[]{ACTION_FULLSCREEN, ACTION_CLOSE, ACTION_MOVE, ACTION_EXPAND_COLLAPSE}));

        if (updateExpected) {
            verify(mMockListener).onActionsChanged(0, 1, 3);
        } else {
            verify(mMockListener, times(0))
                    .onActionsChanged(anyInt(), anyInt(), anyInt());
        }
    }

    @Test
    public void expandedPip_toggleExpansion_collapse() {
        assumeTelevision();
        check_expandedPip_updateExpansionState(
                /* startExpansion= */ true,
                /* endExpansion= */ false,
                /* updateExpected= */ true);
    }

    @Test
    public void expandedPip_toggleExpansion_expand() {
        assumeTelevision();
        check_expandedPip_updateExpansionState(
                /* startExpansion= */ false,
                /* endExpansion= */ true,
                /* updateExpected= */ true);
    }

    @Test
    public void expandedPiP_updateExpansionState_alreadyExpanded() {
        assumeTelevision();
        check_expandedPip_updateExpansionState(
                /* startExpansion= */ true,
                /* endExpansion= */ true,
                /* updateExpected= */ false);
    }

    @Test
    public void expandedPiP_updateExpansionState_alreadyCollapsed() {
        assumeTelevision();
        check_expandedPip_updateExpansionState(
                /* startExpansion= */ false,
                /* endExpansion= */ false,
                /* updateExpected= */ false);
    }

    @Test
    public void regularPiP_updateExpansionState_setCollapsed() {
        assumeTelevision();
        mActionsProvider.updateExpansionEnabled(false);
        mActionsProvider.updatePipExpansionState(/* expanded= */ false);

        mActionsProvider.addListener(mMockListener);
        mActionsProvider.updatePipExpansionState(/* expanded= */ false);

        verify(mMockListener, times(0))
                .onActionsChanged(anyInt(), anyInt(), anyInt());
    }

    @Test