diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/DemoUtil.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/DemoUtil.java index 26ab5eb0dd..0ff2e09a39 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/DemoUtil.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/DemoUtil.java @@ -15,8 +15,8 @@ */ 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.gms.cast.MediaInfo; import java.util.ArrayList; import java.util.Collections; 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_VIDEO_MP4 = MimeTypes.VIDEO_MP4; - /** - * The list of samples available in the cast demo app. - */ - public static final List 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; - } - - } + /** The list of samples available in the cast demo app. */ + public static final List SAMPLES; static { // App samples. - ArrayList samples = new ArrayList<>(); - samples.add(new Sample("https://storage.googleapis.com/wvmedia/clear/h264/tears/tears.mpd", - "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)); + ArrayList samples = new ArrayList<>(); + MediaItem.Builder sampleBuilder = new MediaItem.Builder(); + 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); diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/MainActivity.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/MainActivity.java index 30968b8f85..44305afb5b 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/MainActivity.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/MainActivity.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.castdemo; import android.content.Context; import android.os.Bundle; +import android.support.annotation.Nullable; import android.support.v4.graphics.ColorUtils; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; @@ -35,18 +36,18 @@ import android.widget.ListView; import android.widget.TextView; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.SimpleExoPlayer; -import com.google.android.exoplayer2.castdemo.DemoUtil.Sample; -import com.google.android.exoplayer2.ext.cast.CastPlayer; +import com.google.android.exoplayer2.ext.cast.MediaItem; import com.google.android.exoplayer2.ui.PlayerControlView; import com.google.android.exoplayer2.ui.PlayerView; import com.google.android.gms.cast.framework.CastButtonFactory; 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, - PlayerManager.QueuePositionListener { +public class MainActivity extends AppCompatActivity + implements OnClickListener, PlayerManager.QueuePositionListener { private PlayerView localPlayerView; private PlayerControlView castControlView; @@ -181,7 +182,7 @@ public class MainActivity extends AppCompatActivity implements OnClickListener, @Override public void onBindViewHolder(QueueItemViewHolder holder, int position) { TextView view = holder.textView; - view.setText(playerManager.getItem(position).name); + view.setText(playerManager.getItem(position).title); // TODO: Solve coloring using the theme's ColorStateList. view.setTextColor(ColorUtils.setAlphaComponent(view.getCurrentTextColor(), position == playerManager.getCurrentItemIndex() ? 255 : 100)); @@ -244,12 +245,19 @@ public class MainActivity extends AppCompatActivity implements OnClickListener, } - private static final class SampleListAdapter extends ArrayAdapter { + private static final class SampleListAdapter extends ArrayAdapter { public SampleListAdapter(Context context) { 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; + } } } diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java index 0c69e40164..eb4808d1ed 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java @@ -31,8 +31,8 @@ import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; 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.MediaItem; import com.google.android.exoplayer2.ext.cast.RemotePlayer; import com.google.android.exoplayer2.source.ConcatenatingMediaSource; import com.google.android.exoplayer2.source.ExtractorMediaSource; @@ -74,7 +74,7 @@ import java.util.ArrayList; private final PlayerControlView castControlView; private final SimpleExoPlayer exoPlayer; private final CastPlayer castPlayer; - private final ArrayList mediaQueue; + private final ArrayList mediaQueue; private final QueuePositionListener queuePositionListener; 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) { - mediaQueue.add(sample); - concatenatingMediaSource.addMediaSource(buildMediaSource(sample)); + public void addItem(MediaItem item) { + mediaQueue.add(item); + concatenatingMediaSource.addMediaSource(buildMediaSource(item)); 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. * @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); } @@ -388,9 +388,9 @@ import java.util.ArrayList; } } - private static MediaSource buildMediaSource(DemoUtil.Sample sample) { - Uri uri = Uri.parse(sample.uri); - switch (sample.mimeType) { + private static MediaSource buildMediaSource(MediaItem item) { + Uri uri = item.media.uri; + switch (item.mimeType) { case DemoUtil.MIME_TYPE_SS: return new SsMediaSource.Factory(DATA_SOURCE_FACTORY).createMediaSource(uri); case DemoUtil.MIME_TYPE_DASH: @@ -400,17 +400,20 @@ import java.util.ArrayList; case DemoUtil.MIME_TYPE_VIDEO_MP4: return new ExtractorMediaSource.Factory(DATA_SOURCE_FACTORY).createMediaSource(uri); 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); - movieMetadata.putString(MediaMetadata.KEY_TITLE, sample.name); - MediaInfo mediaInfo = new MediaInfo.Builder(sample.uri) - .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED).setContentType(sample.mimeType) - .setMetadata(movieMetadata).build(); + movieMetadata.putString(MediaMetadata.KEY_TITLE, item.title); + MediaInfo mediaInfo = + new MediaInfo.Builder(item.media.uri.toString()) + .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) + .setContentType(item.mimeType) + .setMetadata(movieMetadata) + .build(); return new MediaQueueItem.Builder(mediaInfo).build(); } diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastTimeline.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastTimeline.java index 4939e62a2b..d86c4b3ebf 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastTimeline.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastTimeline.java @@ -108,7 +108,7 @@ import java.util.Map; } @Override - public Object getUidOfPeriod(int periodIndex) { + public Integer getUidOfPeriod(int periodIndex) { return ids[periodIndex]; } diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/MediaItem.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/MediaItem.java index 67428e8af4..f9188e08be 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/MediaItem.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/MediaItem.java @@ -67,9 +67,9 @@ public final class MediaItem { 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) { - return setMedia(new UriBundle(uri)); + return setMedia(new UriBundle(Uri.parse(uri))); } /** See {@link MediaItem#media}. */ @@ -162,7 +162,7 @@ public final class MediaItem { public static final class UriBundle { /** An empty {@link UriBundle}. */ - public static final UriBundle EMPTY = new UriBundle(""); + public static final UriBundle EMPTY = new UriBundle(Uri.EMPTY); /** A URI. */ public final Uri uri; @@ -171,12 +171,12 @@ public final class MediaItem { public final Map 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) { - this(Uri.parse(uriString), Collections.emptyMap()); + public UriBundle(Uri uri) { + this(uri, Collections.emptyMap()); } /**