Make StreamKey Bundleable and remove deprecated trackIndex
#minor-release PiperOrigin-RevId: 538809105
This commit is contained in:
parent
276f2f1fe6
commit
28b8fb706a
@ -1215,7 +1215,8 @@ public final class MediaItem implements Bundleable {
|
||||
bundle.putBundle(FIELD_ADS_CONFIGURATION, adsConfiguration.toBundle());
|
||||
}
|
||||
if (!streamKeys.isEmpty()) {
|
||||
bundle.putParcelableArrayList(FIELD_STREAM_KEYS, new ArrayList<>(streamKeys));
|
||||
bundle.putParcelableArrayList(
|
||||
FIELD_STREAM_KEYS, BundleableUtil.toBundleArrayList(streamKeys));
|
||||
}
|
||||
if (customCacheKey != null) {
|
||||
bundle.putString(FIELD_CUSTOM_CACHE_KEY, customCacheKey);
|
||||
@ -1239,9 +1240,11 @@ public final class MediaItem implements Bundleable {
|
||||
@Nullable Bundle adsBundle = bundle.getBundle(FIELD_ADS_CONFIGURATION);
|
||||
AdsConfiguration adsConfiguration =
|
||||
adsBundle == null ? null : AdsConfiguration.CREATOR.fromBundle(adsBundle);
|
||||
@Nullable List<StreamKey> streamKeysList = bundle.getParcelableArrayList(FIELD_STREAM_KEYS);
|
||||
@Nullable List<Bundle> streamKeysBundles = bundle.getParcelableArrayList(FIELD_STREAM_KEYS);
|
||||
List<StreamKey> streamKeys =
|
||||
streamKeysList == null ? ImmutableList.of() : ImmutableList.copyOf(streamKeysList);
|
||||
streamKeysBundles == null
|
||||
? ImmutableList.of()
|
||||
: BundleableUtil.fromBundleList(StreamKey::fromBundle, streamKeysBundles);
|
||||
@Nullable
|
||||
List<Bundle> subtitleBundles = bundle.getParcelableArrayList(FIELD_SUBTITLE_CONFIGURATION);
|
||||
ImmutableList<SubtitleConfiguration> subtitleConfiguration =
|
||||
|
@ -15,10 +15,12 @@
|
||||
*/
|
||||
package androidx.media3.common;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.media3.common.util.UnstableApi;
|
||||
import androidx.media3.common.util.Util;
|
||||
|
||||
/**
|
||||
* A key for a subset of media that can be separately loaded (a "stream").
|
||||
@ -35,7 +37,7 @@ import androidx.media3.common.util.UnstableApi;
|
||||
* particular track selection.
|
||||
*/
|
||||
@UnstableApi
|
||||
public final class StreamKey implements Comparable<StreamKey>, Parcelable {
|
||||
public final class StreamKey implements Comparable<StreamKey>, Parcelable, Bundleable {
|
||||
|
||||
/** The period index. */
|
||||
public final int periodIndex;
|
||||
@ -44,11 +46,6 @@ public final class StreamKey implements Comparable<StreamKey>, Parcelable {
|
||||
/** The stream index. */
|
||||
public final int streamIndex;
|
||||
|
||||
/**
|
||||
* @deprecated Use {@link #streamIndex}.
|
||||
*/
|
||||
@Deprecated public final int trackIndex;
|
||||
|
||||
/**
|
||||
* Creates an instance with {@link #periodIndex} set to 0.
|
||||
*
|
||||
@ -60,26 +57,22 @@ public final class StreamKey implements Comparable<StreamKey>, Parcelable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an instance.
|
||||
* Creates an instance of {@link StreamKey} using 3 indices.
|
||||
*
|
||||
* @param periodIndex The period index.
|
||||
* @param groupIndex The group index.
|
||||
* @param streamIndex The stream index.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
public StreamKey(int periodIndex, int groupIndex, int streamIndex) {
|
||||
this.periodIndex = periodIndex;
|
||||
this.groupIndex = groupIndex;
|
||||
this.streamIndex = streamIndex;
|
||||
trackIndex = streamIndex;
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
/* package */ StreamKey(Parcel in) {
|
||||
periodIndex = in.readInt();
|
||||
groupIndex = in.readInt();
|
||||
streamIndex = in.readInt();
|
||||
trackIndex = streamIndex;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -151,4 +144,36 @@ public final class StreamKey implements Comparable<StreamKey>, Parcelable {
|
||||
return new StreamKey[size];
|
||||
}
|
||||
};
|
||||
|
||||
// Bundleable implementation.
|
||||
|
||||
private static final String FIELD_PERIOD_INDEX = Util.intToStringMaxRadix(0);
|
||||
private static final String FIELD_GROUP_INDEX = Util.intToStringMaxRadix(1);
|
||||
private static final String FIELD_STREAM_INDEX = Util.intToStringMaxRadix(2);
|
||||
|
||||
@Override
|
||||
public Bundle toBundle() {
|
||||
Bundle bundle = new Bundle();
|
||||
if (periodIndex != 0) {
|
||||
bundle.putInt(FIELD_PERIOD_INDEX, periodIndex);
|
||||
}
|
||||
if (groupIndex != 0) {
|
||||
bundle.putInt(FIELD_GROUP_INDEX, groupIndex);
|
||||
}
|
||||
if (streamIndex != 0) {
|
||||
bundle.putInt(FIELD_STREAM_INDEX, streamIndex);
|
||||
}
|
||||
return bundle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an instance of {@link StreamKey} from a {@link Bundle} produced by {@link
|
||||
* #toBundle()}.
|
||||
*/
|
||||
public static StreamKey fromBundle(Bundle bundle) {
|
||||
return new StreamKey(
|
||||
bundle.getInt(FIELD_PERIOD_INDEX, /* defaultValue= */ 0),
|
||||
bundle.getInt(FIELD_GROUP_INDEX, /* defaultValue= */ 0),
|
||||
bundle.getInt(FIELD_STREAM_INDEX, /* defaultValue= */ 0));
|
||||
}
|
||||
}
|
||||
|
@ -17,6 +17,7 @@ package androidx.media3.common;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcel;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
import org.junit.Test;
|
||||
@ -28,7 +29,8 @@ public class StreamKeyTest {
|
||||
|
||||
@Test
|
||||
public void parcelable() {
|
||||
StreamKey streamKeyToParcel = new StreamKey(1, 2, 3);
|
||||
StreamKey streamKeyToParcel =
|
||||
new StreamKey(/* periodIndex= */ 1, /* groupIndex= */ 2, /* streamIndex= */ 3);
|
||||
Parcel parcel = Parcel.obtain();
|
||||
streamKeyToParcel.writeToParcel(parcel, 0);
|
||||
parcel.setDataPosition(0);
|
||||
@ -38,4 +40,36 @@ public class StreamKeyTest {
|
||||
|
||||
parcel.recycle();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void roundTripViaBundle_withDefaultPeriodIndex_yieldsEqualInstance() {
|
||||
StreamKey originalStreamKey = new StreamKey(/* groupIndex= */ 1, /* streamIndex= */ 2);
|
||||
|
||||
StreamKey streamKeyFromBundle = StreamKey.fromBundle(originalStreamKey.toBundle());
|
||||
|
||||
assertThat(originalStreamKey).isEqualTo(streamKeyFromBundle);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void roundTripViaBundle_toBundleSkipsDefaultValues_fromBundleRestoresThem() {
|
||||
StreamKey originalStreamKey = new StreamKey(/* groupIndex= */ 0, /* streamIndex= */ 0);
|
||||
|
||||
Bundle streamKeyBundle = originalStreamKey.toBundle();
|
||||
|
||||
assertThat(streamKeyBundle.keySet()).isEmpty();
|
||||
|
||||
StreamKey streamKeyFromBundle = StreamKey.fromBundle(streamKeyBundle);
|
||||
|
||||
assertThat(originalStreamKey).isEqualTo(streamKeyFromBundle);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void roundTripViaBundle_yieldsEqualInstance() {
|
||||
StreamKey originalStreamKey =
|
||||
new StreamKey(/* periodIndex= */ 10, /* groupIndex= */ 11, /* streamIndex= */ 12);
|
||||
|
||||
StreamKey streamKeyFromBundle = StreamKey.fromBundle(originalStreamKey.toBundle());
|
||||
|
||||
assertThat(originalStreamKey).isEqualTo(streamKeyFromBundle);
|
||||
}
|
||||
}
|
||||
|
@ -102,8 +102,8 @@ public class DefaultDownloadIndexTest {
|
||||
.setStartTimeMs(10)
|
||||
.setUpdateTimeMs(20)
|
||||
.setStreamKeys(
|
||||
new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 1, /* trackIndex= */ 2),
|
||||
new StreamKey(/* periodIndex= */ 3, /* groupIndex= */ 4, /* trackIndex= */ 5))
|
||||
new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 1, /* streamIndex= */ 2),
|
||||
new StreamKey(/* periodIndex= */ 3, /* groupIndex= */ 4, /* streamIndex= */ 5))
|
||||
.setCustomMetadata(new byte[] {0, 1, 2, 3, 7, 8, 9, 10})
|
||||
.setKeySetId(new byte[] {0, 1, 2, 3})
|
||||
.build();
|
||||
|
@ -302,13 +302,13 @@ public class DownloadManagerTest {
|
||||
|
||||
@Test
|
||||
public void downloads_withSameIdsAndDifferentStreamKeys_areMerged() throws Throwable {
|
||||
StreamKey streamKey1 = new StreamKey(/* groupIndex= */ 0, /* trackIndex= */ 0);
|
||||
StreamKey streamKey1 = new StreamKey(/* groupIndex= */ 0, /* streamIndex= */ 0);
|
||||
postDownloadRequest(ID1, streamKey1);
|
||||
FakeDownloader downloader0 = getDownloaderAt(0);
|
||||
downloader0.assertId(ID1);
|
||||
downloader0.assertDownloadStarted();
|
||||
|
||||
StreamKey streamKey2 = new StreamKey(/* groupIndex= */ 1, /* trackIndex= */ 1);
|
||||
StreamKey streamKey2 = new StreamKey(/* groupIndex= */ 1, /* streamIndex= */ 1);
|
||||
postDownloadRequest(ID1, streamKey2);
|
||||
// The request for streamKey2 will cause the downloader for streamKey1 to be canceled and
|
||||
// replaced with a new downloader for both keys.
|
||||
|
Loading…
x
Reference in New Issue
Block a user