diff --git a/libraries/common/src/main/java/androidx/media3/common/text/VoiceSpan.java b/libraries/common/src/main/java/androidx/media3/common/text/VoiceSpan.java index 570e770dda..6e05b58714 100644 --- a/libraries/common/src/main/java/androidx/media3/common/text/VoiceSpan.java +++ b/libraries/common/src/main/java/androidx/media3/common/text/VoiceSpan.java @@ -36,27 +36,19 @@ public final class VoiceSpan { /** The speaker name. */ public final String speakerName; - /** The classes associated with the text. It can specify things like "first", "loud", etc. */ - public final Set classes; - private static final String FIELD_NAME = Util.intToStringMaxRadix(0); - private static final String FIELD_CLASSES = Util.intToStringMaxRadix(1); - public VoiceSpan(String speakerName, Set classes) { + public VoiceSpan(String speakerName) { this.speakerName = speakerName; - this.classes = classes; } public Bundle toBundle() { Bundle bundle = new Bundle(); bundle.putString(FIELD_NAME, speakerName); - bundle.putStringArray(FIELD_CLASSES, classes.toArray(new String[0])); return bundle; } public static VoiceSpan fromBundle(Bundle bundle) { - return new VoiceSpan( - /* speakerName = */ checkNotNull(bundle.getString(FIELD_NAME)), - /* classes = */ ImmutableSet.copyOf(checkNotNull(bundle.getStringArray(FIELD_CLASSES)))); + return new VoiceSpan(/* speakerName = */ checkNotNull(bundle.getString(FIELD_NAME))); } } diff --git a/libraries/common/src/test/java/androidx/media3/common/text/CustomCueBundlerTest.java b/libraries/common/src/test/java/androidx/media3/common/text/CustomCueBundlerTest.java index a2b01343f9..e795929278 100644 --- a/libraries/common/src/test/java/androidx/media3/common/text/CustomCueBundlerTest.java +++ b/libraries/common/src/test/java/androidx/media3/common/text/CustomCueBundlerTest.java @@ -42,7 +42,7 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class CustomCueBundlerTest { - private static final VoiceSpan VOICE_SPAN = new VoiceSpan("name", Set.of("first", "loud")); + private static final VoiceSpan VOICE_SPAN = new VoiceSpan("name"); private static final RubySpan RUBY_SPAN = new RubySpan("ruby text", TextAnnotation.POSITION_AFTER); private static final TextEmphasisSpan TEXT_EMPHASIS_SPAN = @@ -98,7 +98,7 @@ public class CustomCueBundlerTest { .hasVoiceSpanBetween( ALL_SPANS_TO_START_END_INDEX.get(VOICE_SPAN).first, ALL_SPANS_TO_START_END_INDEX.get(VOICE_SPAN).second) - .withSpeakerNameAndClasses(VOICE_SPAN.speakerName, VOICE_SPAN.classes); + .withSpeakerName(VOICE_SPAN.speakerName); } @Test diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/WebvttCueParser.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/WebvttCueParser.java index b2a5527db5..3b9d048b1f 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/WebvttCueParser.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/WebvttCueParser.java @@ -557,7 +557,7 @@ public final class WebvttCueParser { applyDefaultColors(text, startTag.classes, start, end); break; case TAG_VOICE: - applyVoiceSpan(text, startTag.voice, startTag.classes, start, end); + applyVoiceSpan(text, startTag.voice, start, end); break; case TAG_LANG: case "": // Case of the "whole cue" virtual tag. @@ -662,8 +662,8 @@ public final class WebvttCueParser { } private static void applyVoiceSpan( - SpannableStringBuilder text, String voice, Set classes, int start, int end) { - text.setSpan(new VoiceSpan(voice, classes), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + SpannableStringBuilder text, String voice, int start, int end) { + text.setSpan(new VoiceSpan(voice), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } private static void applyStyleToText( diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/text/webvtt/WebvttCueParserTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/text/webvtt/WebvttCueParserTest.java index 0fd5eda714..86e239b454 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/text/webvtt/WebvttCueParserTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/text/webvtt/WebvttCueParserTest.java @@ -22,7 +22,6 @@ import android.graphics.Color; import android.text.Spanned; import androidx.test.ext.junit.runners.AndroidJUnit4; import java.util.Collections; -import java.util.Set; import org.junit.Test; import org.junit.runner.RunWith; @@ -250,7 +249,7 @@ public final class WebvttCueParserTest { assertThat(text.toString()).isEqualTo("Text with a single voice span"); assertThat(text) .hasVoiceSpanBetween(0, "Text with a single voice span".length()) - .withSpeakerNameAndClasses("", Collections.emptySet()); + .withSpeakerName(""); } @Test @@ -260,7 +259,7 @@ public final class WebvttCueParserTest { assertThat(text.toString()).isEqualTo("Text with a single voice span"); assertThat(text) .hasVoiceSpanBetween(0, "Text with a single voice span".length()) - .withSpeakerNameAndClasses("Esme", Collections.emptySet()); + .withSpeakerName("Esme"); } @Test @@ -270,17 +269,17 @@ public final class WebvttCueParserTest { assertThat(text.toString()).isEqualTo("Text with a single voice span"); assertThat(text) .hasVoiceSpanBetween(0, "Text with a single voice span".length()) - .withSpeakerNameAndClasses("", Set.of("first", "loud")); + .withSpeakerName(""); } @Test - public void parseVoiceSpanWithNameAndClasses() throws Exception { + public void ignoreVoiceSpanClasses() throws Exception { Spanned text = parseCueText("Text with a single voice span"); assertThat(text.toString()).isEqualTo("Text with a single voice span"); assertThat(text) .hasVoiceSpanBetween(0, "Text with a single voice span".length()) - .withSpeakerNameAndClasses("Esme", Set.of("first", "loud")); + .withSpeakerName("Esme"); } @Test @@ -288,12 +287,10 @@ public final class WebvttCueParserTest { Spanned text = parseCueText("Text with multiple voice spans"); assertThat(text.toString()).isEqualTo("Text with multiple voice spans"); - assertThat(text) - .hasVoiceSpanBetween(0, "Text with ".length()) - .withSpeakerNameAndClasses("Esme", Set.of("loud")); + assertThat(text).hasVoiceSpanBetween(0, "Text with ".length()).withSpeakerName("Esme"); assertThat(text) .hasVoiceSpanBetween("Text with ".length(), "Text with multiple voice spans".length()) - .withSpeakerNameAndClasses("Mary", Set.of("quiet")); + .withSpeakerName("Mary"); } private static Spanned parseCueText(String string) { diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/truth/SpannedSubject.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/truth/SpannedSubject.java index a05c6fde82..70d3745de0 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/truth/SpannedSubject.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/truth/SpannedSubject.java @@ -1315,18 +1315,15 @@ public final class SpannedSubject extends Subject { /** Allows assertions about a span's voice its position. */ public interface VoiceText { /** - * Checks that at least one of the matched spans has the expected {@code name} and {@code - * classes}. + * Checks that at least one of the matched spans has the expected {@code name}. * * @param name The expected name of the voice. - * @param classes The classes used to style the voice. * @return A {@link AndSpanFlags} object for optional additional assertions on the flags. */ - AndSpanFlags withSpeakerNameAndClasses(String name, Set classes); + AndSpanFlags withSpeakerName(String name); } - private static final VoiceText ALREADY_FAILED_WITH_NAME_AND_CLASSES = - (name, classes) -> ALREADY_FAILED_AND_FLAGS; + private static final VoiceText ALREADY_FAILED_WITH_NAME_AND_CLASSES = (name) -> ALREADY_FAILED_AND_FLAGS; private static Factory> voiceSpanSubjects( Spanned actualSpanned) { @@ -1349,29 +1346,27 @@ public final class SpannedSubject extends Subject { } @Override - public AndSpanFlags withSpeakerNameAndClasses(String name, Set classes) { + public AndSpanFlags withSpeakerName(String name) { List matchingSpanFlags = new ArrayList<>(); - List voiceSpeakerNameAndClasses = new ArrayList<>(); + List voiceSpeakerName = new ArrayList<>(); for (VoiceSpan span : checkNotNull(actualSpans)) { - voiceSpeakerNameAndClasses.add(new SpeakerNameAndClasses(span.speakerName, span.classes)); - if (span.speakerName.equals(name) && span.classes.equals(classes)) { + voiceSpeakerNameAndClasses.add(new SpeakerName(span.speakerName)); + if (span.speakerName.equals(name)) { matchingSpanFlags.add(actualSpanned.getSpanFlags(span)); } } - check("voiceSpeakerNameAndClasses") + check("voiceSpeakerName") .that(voiceSpeakerNameAndClasses) - .containsExactly(new SpeakerNameAndClasses(name, classes)); + .containsExactly(new SpeakerName(name)); return check("flags").about(spanFlags()).that(matchingSpanFlags); } - private static final class SpeakerNameAndClasses { + private static final class SpeakerName { private final String speakerName; - private final Set classes; - private SpeakerNameAndClasses(String name, Set classes) { + private SpeakerName(String name) { this.speakerName = name; - this.classes = classes; } @Override @@ -1383,18 +1378,18 @@ public final class SpannedSubject extends Subject { return false; } - SpeakerNameAndClasses that = (SpeakerNameAndClasses) o; - return (speakerName.equals(that.speakerName)) && classes.equals(that.classes); + SpeakerName that = (SpeakerName) o; + return name.equals(that.name); } @Override public int hashCode() { - return Objects.hash(speakerName, classes); + return Objects.hash(speakerName); } @Override public String toString() { - return String.format("{speakerName=%s,classes=%s}", speakerName, classes); + return String.format("{speakerName=%s}", speakerName); } } } diff --git a/libraries/test_utils/src/test/java/androidx/media3/test/utils/truth/SpannedSubjectTest.java b/libraries/test_utils/src/test/java/androidx/media3/test/utils/truth/SpannedSubjectTest.java index c15ac26596..5ca83c9a30 100644 --- a/libraries/test_utils/src/test/java/androidx/media3/test/utils/truth/SpannedSubjectTest.java +++ b/libraries/test_utils/src/test/java/androidx/media3/test/utils/truth/SpannedSubjectTest.java @@ -908,25 +908,25 @@ public class SpannedSubjectTest { public void voiceSpan_success() { SpannableString spannable = createSpannable( - new VoiceSpan("speaker", Set.of("quiet")), + new VoiceSpan("speaker"), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); assertThat(spannable) .hasVoiceSpanBetween(SPAN_START, SPAN_END) - .withSpeakerNameAndClasses("speaker", Set.of("quiet")) + .withSpeakerName("speaker") .andFlags(Spanned.SPAN_INCLUSIVE_EXCLUSIVE); } @Test public void voiceSpan_wrongEndIndex() { checkHasSpanFailsDueToIndexMismatch( - new VoiceSpan("speaker", Set.of("quiet")), + new VoiceSpan("speaker"), SpannedSubject::hasVoiceSpanBetween); } @Test public void voiceSpan_wrongSpeakerName() { - SpannableString spannable = createSpannable(new VoiceSpan("speaker", Set.of("quiet"))); + SpannableString spannable = createSpannable(new VoiceSpan("speaker")); AssertionError expected = expectFailure( @@ -934,44 +934,27 @@ public class SpannedSubjectTest { whenTesting .that(spannable) .hasVoiceSpanBetween(SPAN_START, SPAN_END) - .withSpeakerNameAndClasses("different speaker", Set.of("quiet"))); + .withSpeakerName("different speaker")); - assertThat(expected).factValue("value of").contains("voiceSpeakerNameAndClasses"); + assertThat(expected).factValue("value of").contains("voiceSpeakerName"); assertThat(expected).factValue("expected").contains("speakerName=different speaker"); assertThat(expected).factValue("but was").contains("speakerName=speaker"); } - @Test - public void voiceSpan_wrongClasses() { - SpannableString spannable = createSpannable(new VoiceSpan("speaker", Set.of("quiet"))); - - AssertionError expected = - expectFailure( - whenTesting -> - whenTesting - .that(spannable) - .hasVoiceSpanBetween(SPAN_START, SPAN_END) - .withSpeakerNameAndClasses("speaker", Set.of("loud"))); - - assertThat(expected).factValue("value of").contains("voiceSpeakerNameAndClasses"); - assertThat(expected).factValue("expected").contains("classes=[loud]"); - assertThat(expected).factValue("but was").contains("classes=[quiet]"); - } - @Test public void voiceSpan_wrongFlags() { checkHasSpanFailsDueToFlagMismatch( - new VoiceSpan("speaker", Set.of("quiet")), + new VoiceSpan("speaker"), (subject, start, end) -> subject .hasVoiceSpanBetween(start, end) - .withSpeakerNameAndClasses("speaker", Set.of("quiet"))); + .withSpeakerName("speaker")); } @Test public void noVoiceSpan_success() { SpannableString spannable = - createSpannableWithUnrelatedSpanAnd(new VoiceSpan("speaker", Set.of("quiet"))); + createSpannableWithUnrelatedSpanAnd(new VoiceSpan("speaker")); assertThat(spannable).hasNoVoiceSpanBetween(UNRELATED_SPAN_START, UNRELATED_SPAN_END); } @@ -979,7 +962,7 @@ public class SpannedSubjectTest { @Test public void noVoiceSpan_failure() { checkHasNoSpanFails( - new VoiceSpan("speaker", Set.of("quiet")), + new VoiceSpan("speaker"), SpannedSubject::hasNoVoiceSpanBetween); }