From 60f3d8168c7466c4e09363520ab92fa7c7d32de3 Mon Sep 17 00:00:00 2001 From: krocard Date: Thu, 28 Jan 2021 08:15:06 +0000 Subject: [PATCH] CastPlayer only depends on common Thanks to the move of the Player API to common, the cast player no longer need to depend on core. #player-to-common PiperOrigin-RevId: 354257309 --- extensions/cast/build.gradle | 2 +- .../exoplayer2/ext/cast/CastPlayer.java | 3 +- .../ext/cast/CastTrackSelection.java | 91 +++++++++++++++++++ .../ext/cast/CastTrackSelectionTest.java | 77 ++++++++++++++++ 4 files changed, 170 insertions(+), 3 deletions(-) create mode 100644 extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastTrackSelection.java create mode 100644 extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastTrackSelectionTest.java diff --git a/extensions/cast/build.gradle b/extensions/cast/build.gradle index 4c8f648e34..d0cc501fcb 100644 --- a/extensions/cast/build.gradle +++ b/extensions/cast/build.gradle @@ -16,7 +16,7 @@ apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle" dependencies { api 'com.google.android.gms:play-services-cast-framework:18.1.0' implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion - implementation project(modulePrefix + 'library-core') + implementation project(modulePrefix + 'library-common') implementation project(modulePrefix + 'library-ui') compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion compileOnly 'org.checkerframework:checker-compat-qual:' + checkerframeworkCompatVersion diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index 7ac24b4f8d..d20b84cbc3 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -30,7 +30,6 @@ import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; -import com.google.android.exoplayer2.trackselection.FixedTrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.util.Assertions; @@ -766,7 +765,7 @@ public final class CastPlayer extends BasePlayer { int rendererIndex = getRendererIndexForTrackType(trackType); if (isTrackActive(id, activeTrackIds) && rendererIndex != C.INDEX_UNSET && trackSelections[rendererIndex] == null) { - trackSelections[rendererIndex] = new FixedTrackSelection(trackGroups[i], 0); + trackSelections[rendererIndex] = new CastTrackSelection(trackGroups[i]); } } TrackGroupArray newTrackGroups = new TrackGroupArray(trackGroups); diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastTrackSelection.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastTrackSelection.java new file mode 100644 index 0000000000..22fe86d9e4 --- /dev/null +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastTrackSelection.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2021 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 com.google.android.exoplayer2.ext.cast; + +import androidx.annotation.Nullable; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.source.TrackGroup; +import com.google.android.exoplayer2.trackselection.TrackSelection; +import com.google.android.exoplayer2.util.Assertions; + +/** + * {@link TrackSelection} that only selects the first track of the provided {@link TrackGroup}. + * + *

This relies on {@link CastPlayer} track groups only having one track. + */ +/* package */ class CastTrackSelection implements TrackSelection { + + private final TrackGroup trackGroup; + + /** @param trackGroup The {@link TrackGroup} from which the first track will only be selected. */ + public CastTrackSelection(TrackGroup trackGroup) { + this.trackGroup = trackGroup; + } + + @Override + public TrackGroup getTrackGroup() { + return trackGroup; + } + + @Override + public int length() { + return 1; + } + + @Override + public Format getFormat(int index) { + Assertions.checkArgument(index == 0); + return trackGroup.getFormat(0); + } + + @Override + public int getIndexInTrackGroup(int index) { + return index == 0 ? 0 : C.INDEX_UNSET; + } + + @Override + @SuppressWarnings("ReferenceEquality") + public int indexOf(Format format) { + return format == trackGroup.getFormat(0) ? 0 : C.INDEX_UNSET; + } + + @Override + public int indexOf(int indexInTrackGroup) { + return indexInTrackGroup == 0 ? 0 : C.INDEX_UNSET; + } + + // Object overrides. + + @Override + public int hashCode() { + return System.identityHashCode(trackGroup); + } + + // Track groups are compared by identity not value, as distinct groups may have the same value. + @Override + @SuppressWarnings({"ReferenceEquality", "EqualsGetClass"}) + public boolean equals(@Nullable Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + CastTrackSelection other = (CastTrackSelection) obj; + return trackGroup == other.trackGroup; + } +} diff --git a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastTrackSelectionTest.java b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastTrackSelectionTest.java new file mode 100644 index 0000000000..0a30c0c4b8 --- /dev/null +++ b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastTrackSelectionTest.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2018 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 com.google.android.exoplayer2.ext.cast; + +import static com.google.common.truth.Truth.assertThat; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.source.TrackGroup; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** Test for {@link CastTrackSelection}. */ +@RunWith(AndroidJUnit4.class) +public class CastTrackSelectionTest { + + private static final TrackGroup TRACK_GROUP = + new TrackGroup(new Format.Builder().build(), new Format.Builder().build()); + + private static final CastTrackSelection SELECTION = new CastTrackSelection(TRACK_GROUP); + + @Test + public void length_isOne() { + assertThat(SELECTION.length()).isEqualTo(1); + } + + @Test + public void getTrackGroup_returnsSameGroup() { + assertThat(SELECTION.getTrackGroup()).isSameInstanceAs(TRACK_GROUP); + } + + @Test + public void getFormatSelectedTrack_isFirstTrack() { + assertThat(SELECTION.getFormat(0)).isSameInstanceAs(TRACK_GROUP.getFormat(0)); + } + + @Test + public void getIndexInTrackGroup_ofSelectedTrack_returnsFirstTrack() { + assertThat(SELECTION.getIndexInTrackGroup(0)).isEqualTo(0); + } + + @Test + public void getIndexInTrackGroup_onePastTheEnd_returnsIndexUnset() { + assertThat(SELECTION.getIndexInTrackGroup(1)).isEqualTo(C.INDEX_UNSET); + } + + @Test + public void indexOf_selectedTrack_returnsFirstTrack() { + assertThat(SELECTION.indexOf(0)).isEqualTo(0); + } + + @Test + public void indexOf_onePastTheEnd_returnsIndexUnset() { + assertThat(SELECTION.indexOf(1)).isEqualTo(C.INDEX_UNSET); + } + + @Test(expected = Exception.class) + public void getFormat_outOfBound_throws() { + CastTrackSelection selection = new CastTrackSelection(TRACK_GROUP); + + selection.getFormat(1); + } +}