Transform map of AdsLoader.State to a Bundle
This fixes an exception thrown when parceling becasue the type can not be found (expects the AdsPlaybackState to be Serializable). Transforming the map and the ad playback states to a Bundle fixes the problem. #minor-release PiperOrigin-RevId: 433491993
This commit is contained in:
parent
d06d690d78
commit
e531e788df
@ -827,6 +827,36 @@ public final class AdPlaybackState implements Bundleable {
|
|||||||
adsId, adGroups, adResumePositionUs, contentDurationUs, removedAdGroupCount);
|
adsId, adGroups, adResumePositionUs, contentDurationUs, removedAdGroupCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a copy of the ad playback state with the given ads ID.
|
||||||
|
*
|
||||||
|
* @param adsId The new ads ID.
|
||||||
|
* @param adPlaybackState The ad playback state to copy.
|
||||||
|
* @return The new ad playback state.
|
||||||
|
*/
|
||||||
|
public static AdPlaybackState fromAdPlaybackState(Object adsId, AdPlaybackState adPlaybackState) {
|
||||||
|
AdGroup[] adGroups =
|
||||||
|
new AdGroup[adPlaybackState.adGroupCount - adPlaybackState.removedAdGroupCount];
|
||||||
|
for (int i = 0; i < adGroups.length; i++) {
|
||||||
|
AdGroup adGroup = adPlaybackState.adGroups[i];
|
||||||
|
adGroups[i] =
|
||||||
|
new AdGroup(
|
||||||
|
adGroup.timeUs,
|
||||||
|
adGroup.count,
|
||||||
|
Arrays.copyOf(adGroup.states, adGroup.states.length),
|
||||||
|
Arrays.copyOf(adGroup.uris, adGroup.uris.length),
|
||||||
|
Arrays.copyOf(adGroup.durationsUs, adGroup.durationsUs.length),
|
||||||
|
adGroup.contentResumeOffsetUs,
|
||||||
|
adGroup.isServerSideInserted);
|
||||||
|
}
|
||||||
|
return new AdPlaybackState(
|
||||||
|
adsId,
|
||||||
|
adGroups,
|
||||||
|
adPlaybackState.adResumePositionUs,
|
||||||
|
adPlaybackState.contentDurationUs,
|
||||||
|
adPlaybackState.removedAdGroupCount);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(@Nullable Object o) {
|
public boolean equals(@Nullable Object o) {
|
||||||
if (this == o) {
|
if (this == o) {
|
||||||
|
@ -327,23 +327,31 @@ public final class ImaServerSideAdInsertionMediaSource extends CompositeMediaSou
|
|||||||
@Override
|
@Override
|
||||||
public Bundle toBundle() {
|
public Bundle toBundle() {
|
||||||
Bundle bundle = new Bundle();
|
Bundle bundle = new Bundle();
|
||||||
bundle.putSerializable(keyForField(FIELD_AD_PLAYBACK_STATES), adPlaybackStates);
|
Bundle adPlaybackStatesBundle = new Bundle();
|
||||||
|
for (Map.Entry<String, AdPlaybackState> entry : adPlaybackStates.entrySet()) {
|
||||||
|
adPlaybackStatesBundle.putBundle(entry.getKey(), entry.getValue().toBundle());
|
||||||
|
}
|
||||||
|
bundle.putBundle(keyForField(FIELD_AD_PLAYBACK_STATES), adPlaybackStatesBundle);
|
||||||
return bundle;
|
return bundle;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Object that can restore {@link AdsLoader.State} from a {@link Bundle}. */
|
/** Object that can restore {@link AdsLoader.State} from a {@link Bundle}. */
|
||||||
public static final Bundleable.Creator<State> CREATOR = State::fromBundle;
|
public static final Bundleable.Creator<State> CREATOR = State::fromBundle;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
private static State fromBundle(Bundle bundle) {
|
private static State fromBundle(Bundle bundle) {
|
||||||
@Nullable
|
@Nullable
|
||||||
Map<String, AdPlaybackState> adPlaybackStateMap =
|
ImmutableMap.Builder<String, AdPlaybackState> adPlaybackStateMap =
|
||||||
(Map<String, AdPlaybackState>)
|
new ImmutableMap.Builder<>();
|
||||||
bundle.getSerializable(keyForField(FIELD_AD_PLAYBACK_STATES));
|
Bundle adPlaybackStateBundle =
|
||||||
return new State(
|
checkNotNull(bundle.getBundle(keyForField(FIELD_AD_PLAYBACK_STATES)));
|
||||||
adPlaybackStateMap != null
|
for (String key : adPlaybackStateBundle.keySet()) {
|
||||||
? ImmutableMap.copyOf(adPlaybackStateMap)
|
AdPlaybackState adPlaybackState =
|
||||||
: ImmutableMap.of());
|
AdPlaybackState.CREATOR.fromBundle(
|
||||||
|
checkNotNull(adPlaybackStateBundle.getBundle(key)));
|
||||||
|
adPlaybackStateMap.put(
|
||||||
|
key, AdPlaybackState.fromAdPlaybackState(/* adsId= */ key, adPlaybackState));
|
||||||
|
}
|
||||||
|
return new State(adPlaybackStateMap.buildOrThrow());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String keyForField(@FieldNumber int field) {
|
private static String keyForField(@FieldNumber int field) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user