From 3d674fa2f39414824871c88dd73246cbeddb95f8 Mon Sep 17 00:00:00 2001 From: bachinger Date: Wed, 14 Jun 2023 16:13:48 +0100 Subject: [PATCH] Implement equals/hashCode for CommandButton #minor-release PiperOrigin-RevId: 540274932 --- .../media3/session/CommandButton.java | 23 ++ .../media3/session/CommandButtonTest.java | 202 ++++++++++++++++++ .../DefaultMediaNotificationProviderTest.java | 4 +- 3 files changed, 227 insertions(+), 2 deletions(-) create mode 100644 libraries/session/src/test/java/androidx/media3/session/CommandButtonTest.java diff --git a/libraries/session/src/main/java/androidx/media3/session/CommandButton.java b/libraries/session/src/main/java/androidx/media3/session/CommandButton.java index 989cd4a57c..197330a6e3 100644 --- a/libraries/session/src/main/java/androidx/media3/session/CommandButton.java +++ b/libraries/session/src/main/java/androidx/media3/session/CommandButton.java @@ -19,12 +19,14 @@ import static androidx.media3.common.util.Assertions.checkArgument; import static androidx.media3.common.util.Assertions.checkNotNull; import android.os.Bundle; +import android.text.TextUtils; import androidx.annotation.DrawableRes; import androidx.annotation.Nullable; import androidx.media3.common.Bundleable; import androidx.media3.common.Player; import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; +import com.google.common.base.Objects; import com.google.errorprone.annotations.CanIgnoreReturnValue; import java.util.List; @@ -194,6 +196,27 @@ public final class CommandButton implements Bundleable { this.isEnabled = enabled; } + @Override + public boolean equals(@Nullable Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof CommandButton)) { + return false; + } + CommandButton button = (CommandButton) obj; + return Objects.equal(sessionCommand, button.sessionCommand) + && playerCommand == button.playerCommand + && iconResId == button.iconResId + && TextUtils.equals(displayName, button.displayName) + && isEnabled == button.isEnabled; + } + + @Override + public int hashCode() { + return Objects.hashCode(sessionCommand, playerCommand, iconResId, displayName, isEnabled); + } + // Bundleable implementation. private static final String FIELD_SESSION_COMMAND = Util.intToStringMaxRadix(0); diff --git a/libraries/session/src/test/java/androidx/media3/session/CommandButtonTest.java b/libraries/session/src/test/java/androidx/media3/session/CommandButtonTest.java new file mode 100644 index 0000000000..05a2ff5095 --- /dev/null +++ b/libraries/session/src/test/java/androidx/media3/session/CommandButtonTest.java @@ -0,0 +1,202 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package androidx.media3.session; + +import static androidx.media3.session.CommandButton.CREATOR; +import static com.google.common.truth.Truth.assertThat; + +import android.os.Bundle; +import androidx.media3.common.Player; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** Tests for {@link CommandButton}. */ +@RunWith(AndroidJUnit4.class) +public class CommandButtonTest { + + @Test + public void equals() { + assertThat( + new CommandButton.Builder() + .setDisplayName("button") + .setIconResId(R.drawable.media3_notification_small_icon) + .setPlayerCommand(Player.COMMAND_SEEK_TO_NEXT) + .build()) + .isEqualTo( + new CommandButton.Builder() + .setDisplayName("button") + .setIconResId(R.drawable.media3_notification_small_icon) + .setPlayerCommand(Player.COMMAND_SEEK_TO_NEXT) + .build()); + } + + @Test + public void equals_minimalDifference_notEqual() { + CommandButton button = + new CommandButton.Builder() + .setDisplayName("button") + .setIconResId(R.drawable.media3_notification_small_icon) + .setPlayerCommand(Player.COMMAND_SEEK_TO_NEXT) + .build(); + + assertThat(button).isEqualTo(CREATOR.fromBundle(button.toBundle())); + assertThat(button) + .isNotEqualTo( + new CommandButton.Builder() + .setDisplayName("button2") + .setIconResId(R.drawable.media3_notification_small_icon) + .setPlayerCommand(Player.COMMAND_SEEK_TO_NEXT) + .build()); + assertThat(button) + .isNotEqualTo( + new CommandButton.Builder() + .setPlayerCommand(Player.COMMAND_SEEK_TO_PREVIOUS) + .setDisplayName("button") + .setIconResId(R.drawable.media3_notification_small_icon) + .build()); + assertThat(button) + .isNotEqualTo( + new CommandButton.Builder() + .setIconResId(R.drawable.media3_notification_play) + .setDisplayName("button") + .setPlayerCommand(Player.COMMAND_SEEK_TO_NEXT) + .build()); + assertThat(button) + .isNotEqualTo( + new CommandButton.Builder() + .setEnabled(true) + .setDisplayName("button") + .setIconResId(R.drawable.media3_notification_small_icon) + .setPlayerCommand(Player.COMMAND_SEEK_TO_NEXT) + .build()); + assertThat(button) + .isNotEqualTo( + new CommandButton.Builder() + .setSessionCommand(new SessionCommand(Player.COMMAND_PLAY_PAUSE)) + .setDisplayName("button") + .setIconResId(R.drawable.media3_notification_small_icon) + .build()); + } + + @Test + public void equals_differenceInExtras_ignored() { + CommandButton.Builder builder = + new CommandButton.Builder() + .setDisplayName("button") + .setPlayerCommand(Player.COMMAND_SEEK_TO_NEXT) + .setIconResId(R.drawable.media3_notification_small_icon); + CommandButton button1 = builder.build(); + Bundle extras2 = new Bundle(); + extras2.putInt("something", 0); + Bundle extras3 = new Bundle(); + extras3.putInt("something", 1); + extras3.putInt("something2", 2); + + assertThat(button1).isEqualTo(builder.setExtras(extras2).build()); + assertThat(builder.setExtras(extras2).build()).isEqualTo(builder.setExtras(extras3).build()); + } + + @Test + public void equals_differencesInSessionCommand_notEqual() { + assertThat( + new CommandButton.Builder() + .setSessionCommand(new SessionCommand(Player.COMMAND_PLAY_PAUSE)) + .setDisplayName("button") + .setIconResId(R.drawable.media3_notification_play) + .build()) + .isNotEqualTo( + new CommandButton.Builder() + .setSessionCommand(new SessionCommand(Player.COMMAND_SEEK_BACK)) + .setDisplayName("button") + .setIconResId(R.drawable.media3_notification_play) + .build()); + assertThat( + new CommandButton.Builder() + .setSessionCommand(new SessionCommand(Player.COMMAND_PLAY_PAUSE)) + .setDisplayName("button") + .setIconResId(R.drawable.media3_notification_play) + .build()) + .isNotEqualTo( + new CommandButton.Builder() + .setSessionCommand(new SessionCommand("customAction", Bundle.EMPTY)) + .setDisplayName("button") + .setIconResId(R.drawable.media3_notification_play) + .build()); + assertThat( + new CommandButton.Builder() + .setSessionCommand(new SessionCommand("customAction", Bundle.EMPTY)) + .setDisplayName("button") + .setIconResId(R.drawable.media3_notification_play) + .build()) + .isNotEqualTo( + new CommandButton.Builder() + .setSessionCommand(new SessionCommand("customAction2", Bundle.EMPTY)) + .setDisplayName("button") + .setIconResId(R.drawable.media3_notification_play) + .build()); + } + + @Test + public void equals_differenceInSessionCommandExtras_ignored() { + Bundle extras = new Bundle(); + extras.putString("key", "value"); + assertThat( + new CommandButton.Builder() + .setSessionCommand(new SessionCommand("customAction", Bundle.EMPTY)) + .setDisplayName("button") + .setIconResId(R.drawable.media3_notification_play) + .build()) + .isEqualTo( + new CommandButton.Builder() + .setExtras(extras) + .setSessionCommand(new SessionCommand("customAction", extras)) + .setDisplayName("button") + .setIconResId(R.drawable.media3_notification_play) + .build()); + } + + @Test + public void hashCode_equalButtons_sameHashcode() { + assertThat( + new CommandButton.Builder() + .setDisplayName("button") + .setIconResId(R.drawable.media3_notification_small_icon) + .setPlayerCommand(Player.COMMAND_SEEK_TO_NEXT) + .build() + .hashCode()) + .isEqualTo( + new CommandButton.Builder() + .setDisplayName("button") + .setIconResId(R.drawable.media3_notification_small_icon) + .setPlayerCommand(Player.COMMAND_SEEK_TO_NEXT) + .build() + .hashCode()); + assertThat( + new CommandButton.Builder() + .setIconResId(R.drawable.media3_notification_small_icon) + .setPlayerCommand(Player.COMMAND_SEEK_TO_NEXT) + .build() + .hashCode()) + .isNotEqualTo( + new CommandButton.Builder() + .setDisplayName("button") + .setIconResId(R.drawable.media3_notification_small_icon) + .setPlayerCommand(Player.COMMAND_SEEK_TO_NEXT) + .build() + .hashCode()); + } +} diff --git a/libraries/session/src/test/java/androidx/media3/session/DefaultMediaNotificationProviderTest.java b/libraries/session/src/test/java/androidx/media3/session/DefaultMediaNotificationProviderTest.java index 935ef67d82..dc43b274e7 100644 --- a/libraries/session/src/test/java/androidx/media3/session/DefaultMediaNotificationProviderTest.java +++ b/libraries/session/src/test/java/androidx/media3/session/DefaultMediaNotificationProviderTest.java @@ -445,7 +445,7 @@ public class DefaultMediaNotificationProviderTest { DefaultMediaNotificationProvider.COMMAND_KEY_COMPACT_VIEW_INDEX, -1); CommandButton commandButton2 = new CommandButton.Builder() - .setDisplayName("displayName") + .setDisplayName("displayName2") .setIconResId(R.drawable.media3_icon_circular_play) .setSessionCommand(new SessionCommand("action1", Bundle.EMPTY)) .setExtras(commandButtonBundle2) @@ -456,7 +456,7 @@ public class DefaultMediaNotificationProviderTest { int[] compactViewIndices = defaultMediaNotificationProvider.addNotificationActions( mediaSession, - ImmutableList.of(commandButton1, commandButton2), + /* mediaButtons= */ ImmutableList.of(commandButton1, commandButton2), notificationBuilder, mockActionFactory); mediaSession.release();