Use media item in the cast demo app

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=214750185
This commit is contained in:
aquilescanta 2018-09-27 03:42:40 -07:00 committed by Oliver Woodman
parent d487b599f8
commit 2a50621118
5 changed files with 80 additions and 81 deletions

View File

@ -15,8 +15,8 @@
*/ */
package com.google.android.exoplayer2.castdemo; package com.google.android.exoplayer2.castdemo;
import com.google.android.exoplayer2.ext.cast.MediaItem;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.gms.cast.MediaInfo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -31,57 +31,45 @@ import java.util.List;
public static final String MIME_TYPE_SS = MimeTypes.APPLICATION_SS; public static final String MIME_TYPE_SS = MimeTypes.APPLICATION_SS;
public static final String MIME_TYPE_VIDEO_MP4 = MimeTypes.VIDEO_MP4; public static final String MIME_TYPE_VIDEO_MP4 = MimeTypes.VIDEO_MP4;
/** /** The list of samples available in the cast demo app. */
* The list of samples available in the cast demo app. public static final List<MediaItem> SAMPLES;
*/
public static final List<Sample> SAMPLES;
/**
* Represents a media sample.
*/
public static final class Sample {
/**
* The uri from which the media sample is obtained.
*/
public final String uri;
/**
* A descriptive name for the sample.
*/
public final String name;
/**
* The mime type of the media sample, as required by {@link MediaInfo#setContentType}.
*/
public final String mimeType;
/**
* @param uri See {@link #uri}.
* @param name See {@link #name}.
* @param mimeType See {@link #mimeType}.
*/
public Sample(String uri, String name, String mimeType) {
this.uri = uri;
this.name = name;
this.mimeType = mimeType;
}
@Override
public String toString() {
return name;
}
}
static { static {
// App samples. // App samples.
ArrayList<Sample> samples = new ArrayList<>(); ArrayList<MediaItem> samples = new ArrayList<>();
samples.add(new Sample("https://storage.googleapis.com/wvmedia/clear/h264/tears/tears.mpd", MediaItem.Builder sampleBuilder = new MediaItem.Builder();
"DASH (clear,MP4,H264)", MIME_TYPE_DASH));
samples.add(new Sample("https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/"
+ "hls/TearsOfSteel.m3u8", "Tears of Steel (HLS)", MIME_TYPE_HLS));
samples.add(new Sample("https://html5demos.com/assets/dizzy.mp4", "Dizzy (MP4)",
MIME_TYPE_VIDEO_MP4));
samples.add(
sampleBuilder
.setTitle("DASH (clear,MP4,H264)")
.setMimeType(MIME_TYPE_DASH)
.setMedia("https://storage.googleapis.com/wvmedia/clear/h264/tears/tears.mpd")
.buildAndClear());
samples.add(
sampleBuilder
.setTitle("Tears of Steel (HLS)")
.setMimeType(MIME_TYPE_HLS)
.setMedia(
"https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/"
+ "hls/TearsOfSteel.m3u8")
.buildAndClear());
samples.add(
sampleBuilder
.setTitle("HLS Basic (TS)")
.setMimeType(MIME_TYPE_HLS)
.setMedia(
"https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_4x3"
+ "/bipbop_4x3_variant.m3u8")
.buildAndClear());
samples.add(
sampleBuilder
.setTitle("Dizzy (MP4)")
.setMimeType(MIME_TYPE_VIDEO_MP4)
.setMedia("https://html5demos.com/assets/dizzy.mp4")
.buildAndClear());
SAMPLES = Collections.unmodifiableList(samples); SAMPLES = Collections.unmodifiableList(samples);

View File

@ -17,6 +17,7 @@ package com.google.android.exoplayer2.castdemo;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.graphics.ColorUtils; import android.support.v4.graphics.ColorUtils;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
@ -35,18 +36,18 @@ import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.castdemo.DemoUtil.Sample; import com.google.android.exoplayer2.ext.cast.MediaItem;
import com.google.android.exoplayer2.ext.cast.CastPlayer;
import com.google.android.exoplayer2.ui.PlayerControlView; import com.google.android.exoplayer2.ui.PlayerControlView;
import com.google.android.exoplayer2.ui.PlayerView; import com.google.android.exoplayer2.ui.PlayerView;
import com.google.android.gms.cast.framework.CastButtonFactory; import com.google.android.gms.cast.framework.CastButtonFactory;
import com.google.android.gms.cast.framework.CastContext; import com.google.android.gms.cast.framework.CastContext;
/** /**
* An activity that plays video using {@link SimpleExoPlayer} and {@link CastPlayer}. * An activity that plays video using {@link SimpleExoPlayer} and supports casting using ExoPlayer's
* Cast extension.
*/ */
public class MainActivity extends AppCompatActivity implements OnClickListener, public class MainActivity extends AppCompatActivity
PlayerManager.QueuePositionListener { implements OnClickListener, PlayerManager.QueuePositionListener {
private PlayerView localPlayerView; private PlayerView localPlayerView;
private PlayerControlView castControlView; private PlayerControlView castControlView;
@ -181,7 +182,7 @@ public class MainActivity extends AppCompatActivity implements OnClickListener,
@Override @Override
public void onBindViewHolder(QueueItemViewHolder holder, int position) { public void onBindViewHolder(QueueItemViewHolder holder, int position) {
TextView view = holder.textView; TextView view = holder.textView;
view.setText(playerManager.getItem(position).name); view.setText(playerManager.getItem(position).title);
// TODO: Solve coloring using the theme's ColorStateList. // TODO: Solve coloring using the theme's ColorStateList.
view.setTextColor(ColorUtils.setAlphaComponent(view.getCurrentTextColor(), view.setTextColor(ColorUtils.setAlphaComponent(view.getCurrentTextColor(),
position == playerManager.getCurrentItemIndex() ? 255 : 100)); position == playerManager.getCurrentItemIndex() ? 255 : 100));
@ -244,12 +245,19 @@ public class MainActivity extends AppCompatActivity implements OnClickListener,
} }
private static final class SampleListAdapter extends ArrayAdapter<Sample> { private static final class SampleListAdapter extends ArrayAdapter<MediaItem> {
public SampleListAdapter(Context context) { public SampleListAdapter(Context context) {
super(context, android.R.layout.simple_list_item_1, DemoUtil.SAMPLES); super(context, android.R.layout.simple_list_item_1, DemoUtil.SAMPLES);
} }
@Override
public View getView(int position, @Nullable View convertView, ViewGroup parent) {
TextView view = (TextView) super.getView(position, convertView, parent);
MediaItem sample = DemoUtil.SAMPLES.get(position);
view.setText(sample.title);
return view;
}
} }
} }

View File

@ -31,8 +31,8 @@ import com.google.android.exoplayer2.RenderersFactory;
import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.Timeline.Period; import com.google.android.exoplayer2.Timeline.Period;
import com.google.android.exoplayer2.castdemo.DemoUtil.Sample;
import com.google.android.exoplayer2.ext.cast.CastPlayer; import com.google.android.exoplayer2.ext.cast.CastPlayer;
import com.google.android.exoplayer2.ext.cast.MediaItem;
import com.google.android.exoplayer2.ext.cast.RemotePlayer; import com.google.android.exoplayer2.ext.cast.RemotePlayer;
import com.google.android.exoplayer2.source.ConcatenatingMediaSource; import com.google.android.exoplayer2.source.ConcatenatingMediaSource;
import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.ExtractorMediaSource;
@ -74,7 +74,7 @@ import java.util.ArrayList;
private final PlayerControlView castControlView; private final PlayerControlView castControlView;
private final SimpleExoPlayer exoPlayer; private final SimpleExoPlayer exoPlayer;
private final CastPlayer castPlayer; private final CastPlayer castPlayer;
private final ArrayList<DemoUtil.Sample> mediaQueue; private final ArrayList<MediaItem> mediaQueue;
private final QueuePositionListener queuePositionListener; private final QueuePositionListener queuePositionListener;
private final ConcatenatingMediaSource concatenatingMediaSource; private final ConcatenatingMediaSource concatenatingMediaSource;
@ -146,15 +146,15 @@ import java.util.ArrayList;
} }
/** /**
* Appends {@code sample} to the media queue. * Appends {@code item} to the media queue.
* *
* @param sample The {@link Sample} to append. * @param item The {@link MediaItem} to append.
*/ */
public void addItem(Sample sample) { public void addItem(MediaItem item) {
mediaQueue.add(sample); mediaQueue.add(item);
concatenatingMediaSource.addMediaSource(buildMediaSource(sample)); concatenatingMediaSource.addMediaSource(buildMediaSource(item));
if (currentPlayer == castPlayer) { if (currentPlayer == castPlayer) {
castPlayer.addItems(buildMediaQueueItem(sample)); castPlayer.addItems(buildMediaQueueItem(item));
} }
} }
@ -171,7 +171,7 @@ import java.util.ArrayList;
* @param position The index of the item. * @param position The index of the item.
* @return The item at the given index in the media queue. * @return The item at the given index in the media queue.
*/ */
public Sample getItem(int position) { public MediaItem getItem(int position) {
return mediaQueue.get(position); return mediaQueue.get(position);
} }
@ -388,9 +388,9 @@ import java.util.ArrayList;
} }
} }
private static MediaSource buildMediaSource(DemoUtil.Sample sample) { private static MediaSource buildMediaSource(MediaItem item) {
Uri uri = Uri.parse(sample.uri); Uri uri = item.media.uri;
switch (sample.mimeType) { switch (item.mimeType) {
case DemoUtil.MIME_TYPE_SS: case DemoUtil.MIME_TYPE_SS:
return new SsMediaSource.Factory(DATA_SOURCE_FACTORY).createMediaSource(uri); return new SsMediaSource.Factory(DATA_SOURCE_FACTORY).createMediaSource(uri);
case DemoUtil.MIME_TYPE_DASH: case DemoUtil.MIME_TYPE_DASH:
@ -400,17 +400,20 @@ import java.util.ArrayList;
case DemoUtil.MIME_TYPE_VIDEO_MP4: case DemoUtil.MIME_TYPE_VIDEO_MP4:
return new ExtractorMediaSource.Factory(DATA_SOURCE_FACTORY).createMediaSource(uri); return new ExtractorMediaSource.Factory(DATA_SOURCE_FACTORY).createMediaSource(uri);
default: { default: {
throw new IllegalStateException("Unsupported type: " + sample.mimeType); throw new IllegalStateException("Unsupported type: " + item.mimeType);
} }
} }
} }
private static MediaQueueItem buildMediaQueueItem(DemoUtil.Sample sample) { private static MediaQueueItem buildMediaQueueItem(MediaItem item) {
MediaMetadata movieMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE); MediaMetadata movieMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);
movieMetadata.putString(MediaMetadata.KEY_TITLE, sample.name); movieMetadata.putString(MediaMetadata.KEY_TITLE, item.title);
MediaInfo mediaInfo = new MediaInfo.Builder(sample.uri) MediaInfo mediaInfo =
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED).setContentType(sample.mimeType) new MediaInfo.Builder(item.media.uri.toString())
.setMetadata(movieMetadata).build(); .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
.setContentType(item.mimeType)
.setMetadata(movieMetadata)
.build();
return new MediaQueueItem.Builder(mediaInfo).build(); return new MediaQueueItem.Builder(mediaInfo).build();
} }

View File

@ -108,7 +108,7 @@ import java.util.Map;
} }
@Override @Override
public Object getUidOfPeriod(int periodIndex) { public Integer getUidOfPeriod(int periodIndex) {
return ids[periodIndex]; return ids[periodIndex];
} }

View File

@ -67,9 +67,9 @@ public final class MediaItem {
return this; return this;
} }
/** Equivalent to {@link #setMedia(UriBundle) setMedia(new UriBundle(uri))}. */ /** Equivalent to {@link #setMedia(UriBundle) setMedia(new UriBundle(Uri.parse(uri)))}. */
public Builder setMedia(String uri) { public Builder setMedia(String uri) {
return setMedia(new UriBundle(uri)); return setMedia(new UriBundle(Uri.parse(uri)));
} }
/** See {@link MediaItem#media}. */ /** See {@link MediaItem#media}. */
@ -162,7 +162,7 @@ public final class MediaItem {
public static final class UriBundle { public static final class UriBundle {
/** An empty {@link UriBundle}. */ /** An empty {@link UriBundle}. */
public static final UriBundle EMPTY = new UriBundle(""); public static final UriBundle EMPTY = new UriBundle(Uri.EMPTY);
/** A URI. */ /** A URI. */
public final Uri uri; public final Uri uri;
@ -171,12 +171,12 @@ public final class MediaItem {
public final Map<String, String> requestHeaders; public final Map<String, String> requestHeaders;
/** /**
* Creates an instance from the given string with no request headers. * Creates an instance with no request headers.
* *
* @param uriString See {@link #uri}. * @param uri See {@link #uri}.
*/ */
public UriBundle(String uriString) { public UriBundle(Uri uri) {
this(Uri.parse(uriString), Collections.emptyMap()); this(uri, Collections.emptyMap());
} }
/** /**