From 6ce9fdee8cd8863c9fd2e5b252587a4a6b4d9594 Mon Sep 17 00:00:00 2001 From: tonihei Date: Thu, 24 Apr 2025 12:45:03 +0100 Subject: [PATCH] Add test and formatting fixes --- .../exoplayer/source/MergingMediaPeriod.java | 134 ++---------------- .../ForwardingTrackSelection.java | 40 ++++-- .../ForwardingTrackSelectionTest.java | 38 +++++ 3 files changed, 72 insertions(+), 140 deletions(-) create mode 100644 libraries/exoplayer/src/test/java/androidx/media3/exoplayer/trackselection/ForwardingTrackSelectionTest.java diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaPeriod.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaPeriod.java index 4a3cf8412f..b63441ebc1 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaPeriod.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaPeriod.java @@ -25,9 +25,6 @@ import androidx.media3.common.util.Assertions; import androidx.media3.common.util.NullableType; import androidx.media3.exoplayer.LoadingInfo; import androidx.media3.exoplayer.SeekParameters; -import androidx.media3.exoplayer.source.chunk.Chunk; -import androidx.media3.exoplayer.source.chunk.MediaChunk; -import androidx.media3.exoplayer.source.chunk.MediaChunkIterator; import androidx.media3.exoplayer.trackselection.ExoTrackSelection; import androidx.media3.exoplayer.trackselection.ForwardingTrackSelection; import com.google.common.collect.Lists; @@ -36,7 +33,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.IdentityHashMap; -import java.util.List; /** Merges multiple {@link MediaPeriod}s. */ /* package */ final class MergingMediaPeriod implements MediaPeriod, MediaPeriod.Callback { @@ -141,7 +137,8 @@ import java.util.List; TrackGroup mergedTrackGroup = mergedTrackSelection.getTrackGroup(); TrackGroup childTrackGroup = checkNotNull(childTrackGroupByMergedTrackGroup.get(mergedTrackGroup)); - childSelections[j] = new MergingMediaPeriodTrackSelection(mergedTrackSelection, childTrackGroup); + childSelections[j] = + new MergingMediaPeriodTrackSelection(mergedTrackSelection, childTrackGroup); } else { childSelections[j] = null; } @@ -317,157 +314,44 @@ import java.util.List; private static final class MergingMediaPeriodTrackSelection extends ForwardingTrackSelection { private final TrackGroup trackGroup; - public MergingMediaPeriodTrackSelection(ExoTrackSelection trackSelection, TrackGroup trackGroup) { + public MergingMediaPeriodTrackSelection( + ExoTrackSelection trackSelection, TrackGroup trackGroup) { super(trackSelection); this.trackGroup = trackGroup; } - @Override - public @Type int getType() { - return getWrappedInstance().getType(); - } - @Override public TrackGroup getTrackGroup() { return trackGroup; } - @Override - public int length() { - return getWrappedInstance().length(); - } - @Override public Format getFormat(int index) { return trackGroup.getFormat(getWrappedInstance().getIndexInTrackGroup(index)); } - @Override - public int getIndexInTrackGroup(int index) { - return getWrappedInstance().getIndexInTrackGroup(index); - } - @Override public int indexOf(Format format) { return getWrappedInstance().indexOf(trackGroup.indexOf(format)); } - @Override - public int indexOf(int indexInTrackGroup) { - return getWrappedInstance().indexOf(indexInTrackGroup); - } - - @Override - public void enable() { - getWrappedInstance().enable(); - } - - @Override - public void disable() { - getWrappedInstance().disable(); - } - @Override public Format getSelectedFormat() { return trackGroup.getFormat(getWrappedInstance().getSelectedIndexInTrackGroup()); } @Override - public int getSelectedIndexInTrackGroup() { - return getWrappedInstance().getSelectedIndexInTrackGroup(); - } - - @Override - public int getSelectedIndex() { - return getWrappedInstance().getSelectedIndex(); - } - - @Override - public @C.SelectionReason int getSelectionReason() { - return getWrappedInstance().getSelectionReason(); - } - - @Nullable - @Override - public Object getSelectionData() { - return getWrappedInstance().getSelectionData(); - } - - @Override - public void onPlaybackSpeed(float playbackSpeed) { - getWrappedInstance().onPlaybackSpeed(playbackSpeed); - } - - @Override - public void onDiscontinuity() { - getWrappedInstance().onDiscontinuity(); - } - - @Override - public void onRebuffer() { - getWrappedInstance().onRebuffer(); - } - - @Override - public void onPlayWhenReadyChanged(boolean playWhenReady) { - getWrappedInstance().onPlayWhenReadyChanged(playWhenReady); - } - - @Override - public void updateSelectedTrack( - long playbackPositionUs, - long bufferedDurationUs, - long availableDurationUs, - List queue, - MediaChunkIterator[] mediaChunkIterators) { - getWrappedInstance().updateSelectedTrack( - playbackPositionUs, bufferedDurationUs, availableDurationUs, queue, mediaChunkIterators); - } - - @Override - public int evaluateQueueSize(long playbackPositionUs, List queue) { - return getWrappedInstance().evaluateQueueSize(playbackPositionUs, queue); - } - - @Override - public boolean shouldCancelChunkLoad( - long playbackPositionUs, Chunk loadingChunk, List queue) { - return getWrappedInstance().shouldCancelChunkLoad(playbackPositionUs, loadingChunk, queue); - } - - @Override - public boolean excludeTrack(int index, long exclusionDurationMs) { - return getWrappedInstance().excludeTrack(index, exclusionDurationMs); - } - - @Override - public boolean isTrackExcluded(int index, long nowMs) { - return getWrappedInstance().isTrackExcluded(index, nowMs); - } - - @Override - public long getLatestBitrateEstimate() { - return getWrappedInstance().getLatestBitrateEstimate(); - } - - @Override - public boolean equals(@Nullable Object o) { - if (this == o) { - return true; - } - if (!(o instanceof MergingMediaPeriodTrackSelection)) { + public boolean equals(@Nullable Object other) { + if (!super.equals(other) || !(other instanceof MergingMediaPeriodTrackSelection)) { return false; } - MergingMediaPeriodTrackSelection that = (MergingMediaPeriodTrackSelection) o; - return getWrappedInstance().equals(that.getWrappedInstance()) && trackGroup.equals(that.trackGroup); + MergingMediaPeriodTrackSelection that = (MergingMediaPeriodTrackSelection) other; + return trackGroup.equals(that.trackGroup); } @Override public int hashCode() { - int result = 17; - result = 31 * result + trackGroup.hashCode(); - result = 31 * result + getWrappedInstance().hashCode(); - return result; + return 31 * super.hashCode() + trackGroup.hashCode(); } } } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/ForwardingTrackSelection.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/ForwardingTrackSelection.java index 5788540ec8..70cab50f9e 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/ForwardingTrackSelection.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/ForwardingTrackSelection.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 The Android Open Source Project + * Copyright 2025 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. @@ -25,14 +25,25 @@ import androidx.media3.exoplayer.source.chunk.MediaChunk; import androidx.media3.exoplayer.source.chunk.MediaChunkIterator; import java.util.List; +/** An {@link ExoTrackSelection} forwarding all calls to a wrapped instance. */ @UnstableApi public class ForwardingTrackSelection implements ExoTrackSelection { private final ExoTrackSelection trackSelection; + /** + * Creates the forwarding track selection. + * + * @param trackSelection The wrapped {@link ExoTrackSelection}. + */ public ForwardingTrackSelection(ExoTrackSelection trackSelection) { this.trackSelection = trackSelection; } + /** Returns the wrapped {@link ExoTrackSelection}. */ + public ExoTrackSelection getWrappedInstance() { + return trackSelection; + } + @Override public void enable() { trackSelection.enable(); @@ -90,11 +101,14 @@ public class ForwardingTrackSelection implements ExoTrackSelection { } @Override - public void updateSelectedTrack(long playbackPositionUs, long bufferedDurationUs, - long availableDurationUs, List queue, + public void updateSelectedTrack( + long playbackPositionUs, + long bufferedDurationUs, + long availableDurationUs, + List queue, MediaChunkIterator[] mediaChunkIterators) { - trackSelection.updateSelectedTrack(playbackPositionUs, bufferedDurationUs, - availableDurationUs, queue, mediaChunkIterators); + trackSelection.updateSelectedTrack( + playbackPositionUs, bufferedDurationUs, availableDurationUs, queue, mediaChunkIterators); } @Override @@ -103,8 +117,8 @@ public class ForwardingTrackSelection implements ExoTrackSelection { } @Override - public boolean shouldCancelChunkLoad(long playbackPositionUs, Chunk loadingChunk, - List queue) { + public boolean shouldCancelChunkLoad( + long playbackPositionUs, Chunk loadingChunk, List queue) { return trackSelection.shouldCancelChunkLoad(playbackPositionUs, loadingChunk, queue); } @@ -158,12 +172,9 @@ public class ForwardingTrackSelection implements ExoTrackSelection { return trackSelection.indexOf(indexInTrackGroup); } - public ExoTrackSelection getWrappedInstance() { - return trackSelection; - } - + @Override public int hashCode() { - return getWrappedInstance().hashCode(); + return trackSelection.hashCode(); } @Override @@ -171,11 +182,10 @@ public class ForwardingTrackSelection implements ExoTrackSelection { if (this == obj) { return true; } - if (obj == null || getClass() != obj.getClass()) { + if (!(obj instanceof ForwardingTrackSelection)) { return false; } ForwardingTrackSelection other = (ForwardingTrackSelection) obj; - - return getWrappedInstance().equals(other.getWrappedInstance()); + return trackSelection.equals(other.trackSelection); } } diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/trackselection/ForwardingTrackSelectionTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/trackselection/ForwardingTrackSelectionTest.java new file mode 100644 index 0000000000..3f6c8a5529 --- /dev/null +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/trackselection/ForwardingTrackSelectionTest.java @@ -0,0 +1,38 @@ +/* + * Copyright 2025 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.exoplayer.trackselection; + +import static androidx.media3.test.utils.TestUtil.assertForwardingClassForwardsAllMethods; +import static androidx.media3.test.utils.TestUtil.assertSubclassOverridesAllMethods; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** Unit test for {@link ForwardingTrackSelection}. */ +@RunWith(AndroidJUnit4.class) +public class ForwardingTrackSelectionTest { + + @Test + public void overridesAllMethods() throws NoSuchMethodException { + assertSubclassOverridesAllMethods(ExoTrackSelection.class, ForwardingTrackSelection.class); + } + + @Test + public void forwardsAllMethods() throws Exception { + assertForwardingClassForwardsAllMethods(ExoTrackSelection.class, ForwardingTrackSelection::new); + } +}