diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ForwardingTimeline.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ForwardingTimeline.java
index 8182c017f4..becf42395e 100644
--- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ForwardingTimeline.java
+++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ForwardingTimeline.java
@@ -15,11 +15,22 @@
*/
package androidx.media3.exoplayer.source;
+import androidx.annotation.Nullable;
import androidx.media3.common.Player;
import androidx.media3.common.Timeline;
import androidx.media3.common.util.UnstableApi;
-/** An overridable {@link Timeline} implementation forwarding all methods to another timeline. */
+/**
+ * An overridable {@link Timeline} implementation forwarding methods to another timeline.
+ *
+ *
The following methods call through to {@code super} instead of the {@code timeline} delegate:
+ *
+ *
+ * - {@link #getPeriodByUid(Object, Period)}
+ *
- {@link #equals(Object)}
+ *
- {@link #hashCode()}
+ *
+ */
@UnstableApi
public abstract class ForwardingTimeline extends Timeline {
@@ -66,6 +77,11 @@ public abstract class ForwardingTimeline extends Timeline {
return timeline.getPeriodCount();
}
+ @Override
+ public final Period getPeriodByUid(Object periodUid, Period period) {
+ return super.getPeriodByUid(periodUid, period);
+ }
+
@Override
public Period getPeriod(int periodIndex, Period period, boolean setIds) {
return timeline.getPeriod(periodIndex, period, setIds);
@@ -80,4 +96,14 @@ public abstract class ForwardingTimeline extends Timeline {
public Object getUidOfPeriod(int periodIndex) {
return timeline.getUidOfPeriod(periodIndex);
}
+
+ @Override
+ public final boolean equals(@Nullable Object obj) {
+ return super.equals(obj);
+ }
+
+ @Override
+ public final int hashCode() {
+ return super.hashCode();
+ }
}
diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/ForwardingTimelineTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/ForwardingTimelineTest.java
index 3105d49cf9..e52fb52180 100644
--- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/ForwardingTimelineTest.java
+++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/ForwardingTimelineTest.java
@@ -16,7 +16,7 @@
package androidx.media3.exoplayer.source;
import static androidx.media3.test.utils.TestUtil.assertForwardingClassForwardsAllMethodsExcept;
-import static androidx.media3.test.utils.TestUtil.assertForwardingClassOverridesAllMethodsExcept;
+import static androidx.media3.test.utils.TestUtil.assertForwardingClassOverridesAllMethods;
import androidx.media3.common.Timeline;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -30,14 +30,14 @@ public class ForwardingTimelineTest {
@Test
public void overridesAllMethods() throws Exception {
- assertForwardingClassOverridesAllMethodsExcept(
- Timeline.class,
- ForwardingTimeline.class,
- ImmutableSet.of("equals", "hashCode", "getPeriodByUid"));
+ assertForwardingClassOverridesAllMethods(Timeline.class, ForwardingTimeline.class);
}
@Test
public void forwardsAllMethods() throws Exception {
+ // ForwardingTimeline equals, hashCode, and getPeriodByUid implementations deliberately call
+ // through to super rather than the delegate instance. This is because these methods are already
+ // correctly implemented on Timeline in terms of the publicly visible parts of Timeline.
assertForwardingClassForwardsAllMethodsExcept(
Timeline.class,
delegate -> new ForwardingTimeline(delegate) {},