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
This commit is contained in:
Jacqueline Bronger
2023-03-30 16:42:06 +02:00
parent d00b03a853
commit 64a2f000e8
4 changed files with 75 additions and 15 deletions

View File

@@ -186,16 +186,17 @@ 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);
notifyActionsChanged(/* added= */ 0, /* updated= */ 1,
mActionsList.indexOf(mExpandCollapseAction));
if (changed) {
notifyActionsChanged(/* added= */ 0, /* updated= */ 1,
mActionsList.indexOf(mExpandCollapseAction));
}
}
List<TvPipAction> getActionsList() {

View File

@@ -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() {

View File

@@ -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) {

View File

@@ -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}));
verify(mMockListener).onActionsChanged(0, 1, 3);
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