Implement equals/hashCode for CommandButton

#minor-release

PiperOrigin-RevId: 540274932
This commit is contained in:
bachinger 2023-06-14 16:13:48 +01:00 committed by Ian Baker
parent d0eda433ea
commit 3d674fa2f3
3 changed files with 227 additions and 2 deletions

View file

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

View file

@ -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());
}
}

View file

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