From 642b2009f32dad6237393de599b538db2882ddfd Mon Sep 17 00:00:00 2001 From: eguven Date: Fri, 6 May 2016 08:08:46 -0700 Subject: [PATCH] Add extensions to v2 demo app. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=121674924 --- demo/build.gradle | 12 ++ .../android/exoplayer/demo/EventLogger.java | 3 +- .../exoplayer/demo/PlayerActivity.java | 70 ++++++----- .../exoplayer/demo/SampleChooserActivity.java | 8 +- .../android/exoplayer/demo/Samples.java | 31 ++++- .../exoplayer/demo/player/DemoPlayer.java | 116 ++++++++++++++---- .../demo/ui/TrackSelectionHelper.java | 6 +- demo/src/main/res/layout/player_activity.xml | 24 ---- .../ext/flac/LibflacAudioTrackRenderer.java | 3 +- .../ext/opus/LibopusAudioTrackRenderer.java | 4 +- .../ext/vp9/LibvpxVideoTrackRenderer.java | 102 ++++----------- .../AudioTrackRendererEventListener.java | 56 +++++++++ .../java/com/google/android/exoplayer/C.java | 8 ++ .../MediaCodecAudioTrackRenderer.java | 69 +++++------ .../exoplayer/MediaCodecTrackRenderer.java | 20 +-- .../MediaCodecVideoTrackRenderer.java | 69 +++-------- .../android/exoplayer/TrackRenderer.java | 2 +- .../exoplayer/TrackRendererEventListener.java | 41 +++++++ .../VideoTrackRendererEventListener.java | 74 +++++++++++ .../metadata/MetadataTrackRenderer.java | 2 +- .../exoplayer/text/TextTrackRenderer.java | 2 +- .../extensions/AudioDecoderTrackRenderer.java | 47 ++----- 22 files changed, 449 insertions(+), 320 deletions(-) create mode 100644 library/src/main/java/com/google/android/exoplayer/AudioTrackRendererEventListener.java create mode 100644 library/src/main/java/com/google/android/exoplayer/TrackRendererEventListener.java create mode 100644 library/src/main/java/com/google/android/exoplayer/VideoTrackRendererEventListener.java diff --git a/demo/build.gradle b/demo/build.gradle index ff294ad0b5..46f6ed3b21 100644 --- a/demo/build.gradle +++ b/demo/build.gradle @@ -26,13 +26,25 @@ android { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } + debug { + jniDebuggable = true + debuggable = true + } } lintOptions { abortOnError false } + + productFlavors { + demo + demo_ext + } } dependencies { compile project(':library') + demo_extCompile project(path: ':extension-opus') + demo_extCompile project(path: ':extension-flac') + demo_extCompile project(path: ':extension-vp9') } diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/EventLogger.java b/demo/src/main/java/com/google/android/exoplayer/demo/EventLogger.java index 1e7340c6c7..2343d87242 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/EventLogger.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/EventLogger.java @@ -18,7 +18,6 @@ package com.google.android.exoplayer.demo; import com.google.android.exoplayer.DefaultTrackSelector.TrackInfo; import com.google.android.exoplayer.ExoPlayer; import com.google.android.exoplayer.Format; -import com.google.android.exoplayer.MediaCodecTrackRenderer.DecoderInitializationException; import com.google.android.exoplayer.TrackGroup; import com.google.android.exoplayer.TrackGroupArray; import com.google.android.exoplayer.TrackRenderer; @@ -182,7 +181,7 @@ public class EventLogger implements DemoPlayer.Listener, DemoPlayer.InfoListener } @Override - public void onDecoderInitializationError(DecoderInitializationException e) { + public void onDecoderInitializationError(Exception e) { printInternalError("decoderInitializationError", e); } diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/PlayerActivity.java b/demo/src/main/java/com/google/android/exoplayer/demo/PlayerActivity.java index 1f70a17a59..d8c41bcd42 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/PlayerActivity.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/PlayerActivity.java @@ -16,12 +16,14 @@ package com.google.android.exoplayer.demo; import com.google.android.exoplayer.AspectRatioFrameLayout; +import com.google.android.exoplayer.C; import com.google.android.exoplayer.DefaultTrackSelector.TrackInfo; import com.google.android.exoplayer.ExoPlaybackException; import com.google.android.exoplayer.ExoPlayer; import com.google.android.exoplayer.MediaCodecTrackRenderer.DecoderInitializationException; import com.google.android.exoplayer.MediaCodecUtil.DecoderQueryException; import com.google.android.exoplayer.SampleSource; +import com.google.android.exoplayer.TrackGroupArray; import com.google.android.exoplayer.demo.player.DemoPlayer; import com.google.android.exoplayer.demo.player.SourceBuilder; import com.google.android.exoplayer.demo.ui.TrackSelectionHelper; @@ -58,6 +60,7 @@ import android.view.View.OnKeyListener; import android.view.View.OnTouchListener; import android.view.accessibility.CaptioningManager; import android.widget.Button; +import android.widget.LinearLayout; import android.widget.MediaController; import android.widget.TextView; import android.widget.Toast; @@ -77,6 +80,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, public static final String CONTENT_ID_EXTRA = "content_id"; public static final String CONTENT_TYPE_EXTRA = "content_type"; public static final String PROVIDER_EXTRA = "provider"; + public static final String USE_EXTENSION_DECODERS = "use_extension_decoders"; // For use when launching the demo app using adb. private static final String CONTENT_EXT_EXTRA = "type"; @@ -84,6 +88,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, private static final String TAG = "PlayerActivity"; private static final CookieManager defaultCookieManager; + static { defaultCookieManager = new CookieManager(); defaultCookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER); @@ -91,16 +96,13 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, private EventLogger eventLogger; private MediaController mediaController; - private View debugRootView; + private LinearLayout debugRootView; private View shutterView; private AspectRatioFrameLayout videoFrame; private SurfaceView surfaceView; private TextView debugTextView; private TextView playerStateTextView; private SubtitleLayout subtitleLayout; - private Button videoButton; - private Button audioButton; - private Button textButton; private Button retryButton; private DataSourceFactory dataSourceFactory; @@ -141,7 +143,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, }); shutterView = findViewById(R.id.shutter); - debugRootView = findViewById(R.id.controls_root); + debugRootView = (LinearLayout) findViewById(R.id.controls_root); videoFrame = (AspectRatioFrameLayout) findViewById(R.id.video_frame); surfaceView = (SurfaceView) findViewById(R.id.surface_view); @@ -155,9 +157,6 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, mediaController.setAnchorView(root); retryButton = (Button) findViewById(R.id.retry_button); retryButton.setOnClickListener(this); - videoButton = (Button) findViewById(R.id.video_controls); - audioButton = (Button) findViewById(R.id.audio_controls); - textButton = (Button) findViewById(R.id.text_controls); CookieHandler currentHandler = CookieHandler.getDefault(); if (currentHandler != defaultCookieManager) { @@ -212,6 +211,9 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, public void onClick(View view) { if (view == retryButton) { initializePlayer(); + } else if (view.getParent() == debugRootView) { + trackSelectionHelper.showSelectionDialog(this, ((Button) view).getText(), + player.getTrackInfo(), (int) view.getTag()); } } @@ -277,7 +279,8 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, private void initializePlayer() { if (player == null) { - player = new DemoPlayer(this); + boolean useExtensionDecoders = getIntent().getBooleanExtra(USE_EXTENSION_DECODERS, false); + player = new DemoPlayer(this, useExtensionDecoders); player.addListener(this); player.setCaptionListener(this); player.setMetadataListener(this); @@ -408,33 +411,34 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, // User controls private void updateButtonVisibilities() { + debugRootView.removeAllViews(); + retryButton.setVisibility(playerNeedsSource ? View.VISIBLE : View.GONE); - videoButton.setVisibility(haveTracks(DemoPlayer.RENDERER_INDEX_VIDEO) ? View.VISIBLE - : View.GONE); - audioButton.setVisibility(haveTracks(DemoPlayer.RENDERER_INDEX_AUDIO) ? View.VISIBLE - : View.GONE); - textButton.setVisibility(haveTracks(DemoPlayer.RENDERER_INDEX_TEXT) ? View.VISIBLE - : View.GONE); - } + debugRootView.addView(retryButton); - private boolean haveTracks(int rendererIndex) { - TrackInfo trackInfo = player == null ? null : player.getTrackInfo(); - return trackInfo != null && trackInfo.getTrackGroups(rendererIndex).length != 0; - } + TrackInfo trackInfo; + if (player == null || (trackInfo = player.getTrackInfo()) == null) { + return; + } - public void showVideoPopup(@SuppressWarnings("unused") View v) { - trackSelectionHelper.showSelectionDialog(this, R.string.video, player.getTrackInfo(), - DemoPlayer.RENDERER_INDEX_VIDEO); - } - - public void showAudioPopup(@SuppressWarnings("unused") View v) { - trackSelectionHelper.showSelectionDialog(this, R.string.audio, player.getTrackInfo(), - DemoPlayer.RENDERER_INDEX_AUDIO); - } - - public void showTextPopup(@SuppressWarnings("unused") View v) { - trackSelectionHelper.showSelectionDialog(this, R.string.text, player.getTrackInfo(), - DemoPlayer.RENDERER_INDEX_TEXT); + int rendererCount = trackInfo.rendererCount; + for (int i = 0; i < rendererCount; i++) { + TrackGroupArray trackGroups = trackInfo.getTrackGroups(i); + if (trackGroups.length != 0) { + Button button = new Button(this); + int label; + switch (player.getRendererType(i)) { + case C.TRACK_TYPE_AUDIO: label = R.string.audio; break; + case C.TRACK_TYPE_VIDEO: label = R.string.video; break; + case C.TRACK_TYPE_TEXT: label = R.string.text; break; + default: continue; + } + button.setText(label); + button.setTag(i); + button.setOnClickListener(this); + debugRootView.addView(button); + } + } } private void toggleControlsVisibility() { diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/SampleChooserActivity.java b/demo/src/main/java/com/google/android/exoplayer/demo/SampleChooserActivity.java index fa8315190b..4af33e9326 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/SampleChooserActivity.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/SampleChooserActivity.java @@ -75,6 +75,11 @@ public class SampleChooserActivity extends Activity { group = new SampleGroup("Misc"); group.addAll(Samples.MISC); sampleGroups.add(group); + group = new SampleGroup("Extensions"); + group.addAll(Samples.VP9_EXTENSION_SAMPLES); + group.addAll(Samples.VP9_OPUS_EXTENSION_SAMPLES); + sampleGroups.add(group); + ExpandableListView sampleList = (ExpandableListView) findViewById(R.id.sample_list); sampleList.setAdapter(new SampleAdapter(this, sampleGroups)); sampleList.setOnChildClickListener(new OnChildClickListener() { @@ -92,7 +97,8 @@ public class SampleChooserActivity extends Activity { .setData(Uri.parse(sample.uri)) .putExtra(PlayerActivity.CONTENT_ID_EXTRA, sample.contentId) .putExtra(PlayerActivity.CONTENT_TYPE_EXTRA, sample.type) - .putExtra(PlayerActivity.PROVIDER_EXTRA, sample.provider); + .putExtra(PlayerActivity.PROVIDER_EXTRA, sample.provider) + .putExtra(PlayerActivity.USE_EXTENSION_DECODERS, sample.useExtensionDecoders); startActivity(mpdIntent); } diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/Samples.java b/demo/src/main/java/com/google/android/exoplayer/demo/Samples.java index 9be0c43b76..1537bea5ed 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/Samples.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/Samples.java @@ -22,7 +22,7 @@ import java.util.Locale; /** * Holds statically defined sample definitions. */ -/* package */ class Samples { +/* package */ final class Samples { public static class Sample { @@ -31,17 +31,29 @@ import java.util.Locale; public final String provider; public final String uri; public final int type; + public final boolean useExtensionDecoders; public Sample(String name, String uri, int type) { - this(name, name.toLowerCase(Locale.US).replaceAll("\\s", ""), "", uri, type); + this(name, uri, type, false); + } + + public Sample(String name, String uri, int type, boolean useExtensionDecoders) { + this(name, name.toLowerCase(Locale.US).replaceAll("\\s", ""), "", uri, type, + useExtensionDecoders); } public Sample(String name, String contentId, String provider, String uri, int type) { + this(name, contentId, provider, uri, type, false); + } + + public Sample(String name, String contentId, String provider, String uri, int type, + boolean useExtensionDecoders) { this.name = name; this.contentId = contentId; this.provider = provider; this.uri = uri; this.type = type; + this.useExtensionDecoders = useExtensionDecoders; } } @@ -250,6 +262,21 @@ import java.util.Locale; "http://vod.leasewebcdn.com/bbb.flv?ri=1024&rs=150&start=0", Util.TYPE_OTHER), }; + public static final Sample[] VP9_EXTENSION_SAMPLES = new Sample[] { + new Sample("Google Glass DASH - VP9 Only", + "http://demos.webmproject.org/dash/201410/vp9_glass/manifest_vp9.mpd", + Util.TYPE_DASH, true), + new Sample("Google Glass DASH - VP9 and Vorbis", + "http://demos.webmproject.org/dash/201410/vp9_glass/manifest_vp9_vorbis.mpd", + Util.TYPE_DASH, true), + }; + + public static final Sample[] VP9_OPUS_EXTENSION_SAMPLES = new Sample[] { + new Sample("Google Glass DASH - VP9 and Opus", + "http://demos.webmproject.org/dash/201410/vp9_glass/manifest_vp9_opus.mpd", + Util.TYPE_DASH, true), + }; + private Samples() {} } diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/player/DemoPlayer.java b/demo/src/main/java/com/google/android/exoplayer/demo/player/DemoPlayer.java index a8b79e6c45..a8c6b6bc64 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/player/DemoPlayer.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/player/DemoPlayer.java @@ -24,11 +24,11 @@ import com.google.android.exoplayer.ExoPlayer; import com.google.android.exoplayer.Format; import com.google.android.exoplayer.MediaCodecAudioTrackRenderer; import com.google.android.exoplayer.MediaCodecSelector; -import com.google.android.exoplayer.MediaCodecTrackRenderer.DecoderInitializationException; import com.google.android.exoplayer.MediaCodecVideoTrackRenderer; import com.google.android.exoplayer.SampleSource; import com.google.android.exoplayer.SingleSampleSource; import com.google.android.exoplayer.TrackRenderer; +import com.google.android.exoplayer.VideoTrackRendererEventListener; import com.google.android.exoplayer.audio.AudioCapabilities; import com.google.android.exoplayer.audio.AudioTrack; import com.google.android.exoplayer.chunk.ChunkTrackStreamEventListener; @@ -51,9 +51,12 @@ import android.media.AudioManager; import android.media.MediaCodec; import android.media.MediaCodec.CryptoException; import android.os.Handler; +import android.util.Log; import android.view.Surface; import java.io.IOException; +import java.lang.reflect.Constructor; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -91,7 +94,7 @@ public class DemoPlayer implements ExoPlayer.Listener, DefaultTrackSelector.Even void onAudioTrackInitializationError(AudioTrack.InitializationException e); void onAudioTrackWriteError(AudioTrack.WriteException e); void onAudioTrackUnderrun(int bufferSize, long bufferSizeMs, long elapsedSinceLastFeedMs); - void onDecoderInitializationError(DecoderInitializationException e); + void onDecoderInitializationError(Exception e); void onCryptoError(CryptoException e); void onLoadError(int sourceId, IOException e); void onDrmSessionManagerError(Exception e); @@ -133,16 +136,12 @@ public class DemoPlayer implements ExoPlayer.Listener, DefaultTrackSelector.Even public static final int STATE_READY = ExoPlayer.STATE_READY; public static final int STATE_ENDED = ExoPlayer.STATE_ENDED; - public static final int RENDERER_COUNT = 4; - public static final int RENDERER_INDEX_VIDEO = 0; - public static final int RENDERER_INDEX_AUDIO = 1; - public static final int RENDERER_INDEX_TEXT = 2; - public static final int RENDERER_INDEX_METADATA = 3; + private static final String TAG = "DemoPlayer"; private final ExoPlayer player; private final DefaultTrackSelector trackSelector; private final BandwidthMeter bandwidthMeter; - private final MediaCodecVideoTrackRenderer videoRenderer; + private final TrackRenderer[] renderers; private final PlayerControl playerControl; private final Handler mainHandler; private final CopyOnWriteArrayList listeners; @@ -155,23 +154,20 @@ public class DemoPlayer implements ExoPlayer.Listener, DefaultTrackSelector.Even private Id3MetadataListener id3MetadataListener; private InternalErrorListener internalErrorListener; private InfoListener infoListener; + private CodecCounters videoCodecCounters; - public DemoPlayer(Context context) { + public DemoPlayer(Context context, boolean useExtensionDecoders) { mainHandler = new Handler(); bandwidthMeter = new DefaultBandwidthMeter(); listeners = new CopyOnWriteArrayList<>(); // Build the renderers. - videoRenderer = new MediaCodecVideoTrackRenderer(context, MediaCodecSelector.DEFAULT, - MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT, 5000, mainHandler, this, 50); - TrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(MediaCodecSelector.DEFAULT, null, - true, mainHandler, this, AudioCapabilities.getCapabilities(context), - AudioManager.STREAM_MUSIC); - TrackRenderer textRenderer = new TextTrackRenderer(this, mainHandler.getLooper()); - MetadataTrackRenderer> id3Renderer = new MetadataTrackRenderer<>(new Id3Parser(), - this, mainHandler.getLooper()); - TrackRenderer[] renderers = new TrackRenderer[] {videoRenderer, audioRenderer, textRenderer, - id3Renderer}; + ArrayList renderersList = new ArrayList<>(); + buildRenderers(context, renderersList); + if (useExtensionDecoders) { + buildExtensionRenderers(renderersList); + } + renderers = renderersList.toArray(new TrackRenderer[renderersList.size()]); // Build the player and associated objects. trackSelector = new DefaultTrackSelector(mainHandler, this); @@ -263,7 +259,7 @@ public class DemoPlayer implements ExoPlayer.Listener, DefaultTrackSelector.Even @Override public CodecCounters getCodecCounters() { - return videoRenderer.codecCounters; + return videoCodecCounters; } @Override @@ -358,7 +354,7 @@ public class DemoPlayer implements ExoPlayer.Listener, DefaultTrackSelector.Even } @Override - public void onDecoderInitializationError(DecoderInitializationException e) { + public void onDecoderInitializationError(Exception e) { if (internalErrorListener != null) { internalErrorListener.onDecoderInitializationError(e); } @@ -385,6 +381,11 @@ public class DemoPlayer implements ExoPlayer.Listener, DefaultTrackSelector.Even } } + @Override + public void onAudioCodecCounters(CodecCounters counters) { + // do nothing + } + @Override public void onCryptoError(CryptoException e) { if (internalErrorListener != null) { @@ -431,6 +432,11 @@ public class DemoPlayer implements ExoPlayer.Listener, DefaultTrackSelector.Even // Do nothing. } + @Override + public void onVideoCodecCounters(CodecCounters counters) { + this.videoCodecCounters = counters; + } + @Override public void onLoadStarted(int sourceId, long length, int type, int trigger, Format format, long mediaStartTimeMs, long mediaEndTimeMs) { @@ -459,14 +465,70 @@ public class DemoPlayer implements ExoPlayer.Listener, DefaultTrackSelector.Even // Do nothing. } + public int getRendererType(int index) { + return renderers[index].getTrackType(); + } + private void pushSurface(boolean blockForSurfacePush) { - if (blockForSurfacePush) { - player.blockingSendMessage( - videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, surface); - } else { - player.sendMessage( - videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, surface); + for (TrackRenderer renderer : renderers) { + if (renderer.getTrackType() == C.TRACK_TYPE_VIDEO) { + if (blockForSurfacePush) { + player.blockingSendMessage(renderer, C.MSG_SET_SURFACE, surface); + } else { + player.sendMessage(renderer, C.MSG_SET_SURFACE, surface); + } + } } } + private void buildRenderers(Context context, ArrayList renderersList) { + MediaCodecVideoTrackRenderer videoRenderer = + new MediaCodecVideoTrackRenderer(context, MediaCodecSelector.DEFAULT, + MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT, 5000, mainHandler, this, 50); + renderersList.add(videoRenderer); + + TrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(MediaCodecSelector.DEFAULT, null, + true, mainHandler, this, AudioCapabilities.getCapabilities(context), + AudioManager.STREAM_MUSIC); + renderersList.add(audioRenderer); + + TrackRenderer textRenderer = new TextTrackRenderer(this, mainHandler.getLooper()); + renderersList.add(textRenderer); + + MetadataTrackRenderer> id3Renderer = new MetadataTrackRenderer<>(new Id3Parser(), + this, mainHandler.getLooper()); + renderersList.add(id3Renderer); + } + + private void buildExtensionRenderers(ArrayList renderersList) { + // Load extension renderers using reflection so that demo app doesn't depend on them. + // Class.forName() appears for each renderer so that automated tools like proguard + // can detect the use of reflection (see http://proguard.sourceforge.net/FAQ.html#forname). + try { + Class clazz = + Class.forName("com.google.android.exoplayer.ext.vp9.LibvpxVideoTrackRenderer"); + Constructor constructor = clazz.getConstructor(boolean.class, Handler.class, + VideoTrackRendererEventListener.class, int.class); + Object renderer = constructor.newInstance(true, mainHandler, this, 50); + renderersList.add(0, (TrackRenderer) renderer); + } catch (Exception e) { + Log.i(TAG, "can't load LibvpxVideoTrackRenderer."); + } + + try { + Class clazz = + Class.forName("com.google.android.exoplayer.ext.opus.LibopusAudioTrackRenderer"); + renderersList.add(1, (TrackRenderer) clazz.newInstance()); + } catch (Exception e) { + Log.i(TAG, "can't load LibopusAudioTrackRenderer."); + } + + try { + Class clazz = + Class.forName("com.google.android.exoplayer.ext.flac.LibflacAudioTrackRenderer"); + renderersList.add(2, (TrackRenderer) clazz.newInstance()); + } catch (Exception e) { + Log.i(TAG, "can't load LibflacAudioTrackRenderer."); + } + } } diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/ui/TrackSelectionHelper.java b/demo/src/main/java/com/google/android/exoplayer/demo/ui/TrackSelectionHelper.java index 978a68cb56..a7259546bf 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/ui/TrackSelectionHelper.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/ui/TrackSelectionHelper.java @@ -68,11 +68,11 @@ public class TrackSelectionHelper implements View.OnClickListener, DialogInterfa * Shows the selection dialog for a given renderer. * * @param activity The parent activity. - * @param titleId The dialog's title. + * @param title The dialog's title. * @param trackInfo The current track information. * @param rendererIndex The index of the renderer. */ - public void showSelectionDialog(Activity activity, int titleId, TrackInfo trackInfo, + public void showSelectionDialog(Activity activity, CharSequence title, TrackInfo trackInfo, int rendererIndex) { this.trackInfo = trackInfo; this.rendererIndex = rendererIndex; @@ -88,7 +88,7 @@ public class TrackSelectionHelper implements View.OnClickListener, DialogInterfa ? trackInfo.getTrackSelection(rendererIndex) : null; AlertDialog.Builder builder = new AlertDialog.Builder(activity); - builder.setTitle(titleId) + builder.setTitle(title) .setView(buildView(LayoutInflater.from(builder.getContext()))) .setPositiveButton(android.R.string.ok, this) .setNegativeButton(android.R.string.cancel, null) diff --git a/demo/src/main/res/layout/player_activity.xml b/demo/src/main/res/layout/player_activity.xml index 4e189292c1..1c8e8ba01b 100644 --- a/demo/src/main/res/layout/player_activity.xml +++ b/demo/src/main/res/layout/player_activity.xml @@ -70,30 +70,6 @@ android:orientation="horizontal" android:visibility="gone"> -