Clean up demo app source building.

- Rename preparePlayer to initializePlayer, to reflect the fact that the
preparing state is gone. Replace playerNeedsPrepare with playerNeedsSource.
- playWhenReady is now always true in calls to initializePlayer.
- Handle the intent just before setting the source.
- Use URIs consistently instead of Strings to avoid reparsing.
- onShown becomes initializePlayer.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=120125576
This commit is contained in:
andrewlewis 2016-04-18 08:30:51 -07:00 committed by Oliver Woodman
parent 4e0638ce06
commit febf86c54e
2 changed files with 56 additions and 61 deletions

View File

@ -109,15 +109,10 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
private DefaultTrackSelector trackSelector; private DefaultTrackSelector trackSelector;
private TrackSelectionHelper trackSelectionHelper; private TrackSelectionHelper trackSelectionHelper;
private DebugTextViewHelper debugViewHelper; private DebugTextViewHelper debugViewHelper;
private boolean playerNeedsPrepare; private boolean playerNeedsSource;
private long playerPosition; private long playerPosition;
private Uri contentUri;
private int contentType;
private String contentId;
private String provider;
// Activity lifecycle // Activity lifecycle
@Override @Override
@ -173,6 +168,8 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
if (currentHandler != defaultCookieManager) { if (currentHandler != defaultCookieManager) {
CookieHandler.setDefault(defaultCookieManager); CookieHandler.setDefault(defaultCookieManager);
} }
configureSubtitleView();
} }
@Override @Override
@ -186,28 +183,15 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
public void onStart() { public void onStart() {
super.onStart(); super.onStart();
if (Util.SDK_INT > 23) { if (Util.SDK_INT > 23) {
onShown(); initializePlayer();
} }
} }
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
if (Util.SDK_INT <= 23 || player == null) { if ((Util.SDK_INT <= 23 || player == null)) {
onShown(); initializePlayer();
}
}
private void onShown() {
Intent intent = getIntent();
contentUri = intent.getData();
contentType = intent.getIntExtra(CONTENT_TYPE_EXTRA,
inferContentType(contentUri, intent.getStringExtra(CONTENT_EXT_EXTRA)));
contentId = intent.getStringExtra(CONTENT_ID_EXTRA);
provider = intent.getStringExtra(PROVIDER_EXTRA);
configureSubtitleView();
if (!maybeRequestPermission()) {
preparePlayer(true);
} }
} }
@ -215,7 +199,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
if (Util.SDK_INT <= 23) { if (Util.SDK_INT <= 23) {
onHidden(); releasePlayer();
} }
} }
@ -223,21 +207,16 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
public void onStop() { public void onStop() {
super.onStop(); super.onStop();
if (Util.SDK_INT > 23) { if (Util.SDK_INT > 23) {
onHidden(); releasePlayer();
} }
} }
private void onHidden() {
shutterView.setVisibility(View.VISIBLE);
releasePlayer();
}
// OnClickListener methods // OnClickListener methods
@Override @Override
public void onClick(View view) { public void onClick(View view) {
if (view == retryButton) { if (view == retryButton) {
preparePlayer(true); initializePlayer();
} }
} }
@ -247,7 +226,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
public void onRequestPermissionsResult(int requestCode, String[] permissions, public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) { int[] grantResults) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
preparePlayer(true); initializePlayer();
} else { } else {
Toast.makeText(getApplicationContext(), R.string.storage_permission_denied, Toast.makeText(getApplicationContext(), R.string.storage_permission_denied,
Toast.LENGTH_LONG).show(); Toast.LENGTH_LONG).show();
@ -261,11 +240,12 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
* Checks whether it is necessary to ask for permission to read storage. If necessary, it also * Checks whether it is necessary to ask for permission to read storage. If necessary, it also
* requests permission. * requests permission.
* *
* @return true if a permission request is made. False if it is not necessary. * @param uri A URI that may require {@link permission#READ_EXTERNAL_STORAGE} to play.
* @return True if a permission request is made. False if it is not necessary.
*/ */
@TargetApi(23) @TargetApi(23)
private boolean maybeRequestPermission() { private boolean maybeRequestPermission(Uri uri) {
if (requiresPermission(contentUri)) { if (requiresPermission(uri)) {
requestPermissions(new String[] {permission.READ_EXTERNAL_STORAGE}, 0); requestPermissions(new String[] {permission.READ_EXTERNAL_STORAGE}, 0);
return true; return true;
} else { } else {
@ -283,24 +263,24 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
// Internal methods // Internal methods
private SampleSource buildSource(DemoPlayer player) { private SampleSource buildSource(Uri uri, String id, String provider, int type) {
switch (contentType) { switch (type) {
case Util.TYPE_SS: case Util.TYPE_SS:
return SourceBuilder.buildSmoothStreamingSource(player, dataSourceFactory, return SourceBuilder.buildSmoothStreamingSource(player, dataSourceFactory, uri,
contentUri.toString(), new SmoothStreamingTestMediaDrmCallback()); new SmoothStreamingTestMediaDrmCallback());
case Util.TYPE_DASH: case Util.TYPE_DASH:
return SourceBuilder.buildDashSource(player, dataSourceFactory, contentUri.toString(), return SourceBuilder.buildDashSource(player, dataSourceFactory, uri,
new WidevineTestMediaDrmCallback(contentId, provider)); new WidevineTestMediaDrmCallback(id, provider));
case Util.TYPE_HLS: case Util.TYPE_HLS:
return SourceBuilder.buildHlsSource(player, dataSourceFactory, contentUri.toString()); return SourceBuilder.buildHlsSource(player, dataSourceFactory, uri);
case Util.TYPE_OTHER: case Util.TYPE_OTHER:
return SourceBuilder.buildExtractorSource(player, dataSourceFactory, contentUri); return SourceBuilder.buildExtractorSource(player, dataSourceFactory, uri);
default: default:
throw new IllegalStateException("Unsupported type: " + contentType); throw new IllegalStateException("Unsupported type: " + type);
} }
} }
private void preparePlayer(boolean playWhenReady) { private void initializePlayer() {
if (player == null) { if (player == null) {
player = new DemoPlayer(this); player = new DemoPlayer(this);
player.addListener(this); player.addListener(this);
@ -309,7 +289,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
player.seekTo(playerPosition); player.seekTo(playerPosition);
trackSelector = player.getTrackSelector(); trackSelector = player.getTrackSelector();
trackSelectionHelper = new TrackSelectionHelper(trackSelector); trackSelectionHelper = new TrackSelectionHelper(trackSelector);
playerNeedsPrepare = true; playerNeedsSource = true;
mediaController.setMediaPlayer(player.getPlayerControl()); mediaController.setMediaPlayer(player.getPlayerControl());
mediaController.setEnabled(true); mediaController.setEnabled(true);
eventLogger = new EventLogger(); eventLogger = new EventLogger();
@ -317,20 +297,31 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
player.addListener(eventLogger); player.addListener(eventLogger);
player.setInfoListener(eventLogger); player.setInfoListener(eventLogger);
player.setInternalErrorListener(eventLogger); player.setInternalErrorListener(eventLogger);
player.setSurface(surfaceView.getHolder().getSurface());
player.setPlayWhenReady(true);
debugViewHelper = new DebugTextViewHelper(player, debugTextView); debugViewHelper = new DebugTextViewHelper(player, debugTextView);
debugViewHelper.start(); debugViewHelper.start();
} }
if (playerNeedsPrepare) { if (playerNeedsSource) {
player.setSource(buildSource(player)); Intent intent = getIntent();
playerNeedsPrepare = false; Uri uri = intent.getData();
if (maybeRequestPermission(uri)) {
// The player will be reinitialized if permission is granted.
return;
}
String id = intent.getStringExtra(CONTENT_ID_EXTRA);
String provider = intent.getStringExtra(PROVIDER_EXTRA);
int type = intent.getIntExtra(CONTENT_TYPE_EXTRA,
inferContentType(uri, intent.getStringExtra(CONTENT_EXT_EXTRA)));
player.setSource(buildSource(uri, id, provider, type));
playerNeedsSource = false;
updateButtonVisibilities(); updateButtonVisibilities();
} }
player.setSurface(surfaceView.getHolder().getSurface());
player.setPlayWhenReady(playWhenReady);
} }
private void releasePlayer() { private void releasePlayer() {
if (player != null) { if (player != null) {
shutterView.setVisibility(View.VISIBLE);
debugViewHelper.stop(); debugViewHelper.stop();
debugViewHelper = null; debugViewHelper = null;
playerPosition = player.getCurrentPosition(); playerPosition = player.getCurrentPosition();
@ -407,7 +398,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
if (errorString != null) { if (errorString != null) {
Toast.makeText(getApplicationContext(), errorString, Toast.LENGTH_LONG).show(); Toast.makeText(getApplicationContext(), errorString, Toast.LENGTH_LONG).show();
} }
playerNeedsPrepare = true; playerNeedsSource = true;
updateButtonVisibilities(); updateButtonVisibilities();
showControls(); showControls();
} }
@ -423,7 +414,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
// User controls // User controls
private void updateButtonVisibilities() { private void updateButtonVisibilities() {
retryButton.setVisibility(playerNeedsPrepare ? View.VISIBLE : View.GONE); retryButton.setVisibility(playerNeedsSource ? View.VISIBLE : View.GONE);
videoButton.setVisibility(haveTracks(DemoPlayer.TYPE_VIDEO) ? View.VISIBLE : View.GONE); videoButton.setVisibility(haveTracks(DemoPlayer.TYPE_VIDEO) ? View.VISIBLE : View.GONE);
audioButton.setVisibility(haveTracks(DemoPlayer.TYPE_AUDIO) ? View.VISIBLE : View.GONE); audioButton.setVisibility(haveTracks(DemoPlayer.TYPE_AUDIO) ? View.VISIBLE : View.GONE);
textButton.setVisibility(haveTracks(DemoPlayer.TYPE_TEXT) ? View.VISIBLE : View.GONE); textButton.setVisibility(haveTracks(DemoPlayer.TYPE_TEXT) ? View.VISIBLE : View.GONE);

View File

@ -43,6 +43,7 @@ import com.google.android.exoplayer.upstream.DataSource;
import com.google.android.exoplayer.upstream.DataSourceFactory; import com.google.android.exoplayer.upstream.DataSourceFactory;
import com.google.android.exoplayer.upstream.DefaultAllocator; import com.google.android.exoplayer.upstream.DefaultAllocator;
import com.google.android.exoplayer.util.ManifestFetcher; import com.google.android.exoplayer.util.ManifestFetcher;
import com.google.android.exoplayer.util.Util;
import android.net.Uri; import android.net.Uri;
import android.os.Handler; import android.os.Handler;
@ -64,12 +65,12 @@ public class SourceBuilder {
// TODO[REFACTOR]: Bring back DASH DRM support. // TODO[REFACTOR]: Bring back DASH DRM support.
// TODO[REFACTOR]: Bring back DASH UTC timing element support. // TODO[REFACTOR]: Bring back DASH UTC timing element support.
public static SampleSource buildDashSource(DemoPlayer player, DataSourceFactory dataSourceFactory, public static SampleSource buildDashSource(DemoPlayer player, DataSourceFactory dataSourceFactory,
String url, MediaDrmCallback drmCallback) { Uri uri, MediaDrmCallback drmCallback) {
MediaPresentationDescriptionParser parser = new MediaPresentationDescriptionParser(); MediaPresentationDescriptionParser parser = new MediaPresentationDescriptionParser();
DataSource manifestDataSource = dataSourceFactory.createDataSource(); DataSource manifestDataSource = dataSourceFactory.createDataSource();
// TODO[REFACTOR]: This needs releasing. // TODO[REFACTOR]: This needs releasing.
ManifestFetcher<MediaPresentationDescription> manifestFetcher = new ManifestFetcher<>( ManifestFetcher<MediaPresentationDescription> manifestFetcher = new ManifestFetcher<>(uri,
Uri.parse(url), manifestDataSource, parser); manifestDataSource, parser);
Handler mainHandler = player.getMainHandler(); Handler mainHandler = player.getMainHandler();
BandwidthMeter bandwidthMeter = player.getBandwidthMeter(); BandwidthMeter bandwidthMeter = player.getBandwidthMeter();
@ -103,11 +104,14 @@ public class SourceBuilder {
// TODO[REFACTOR]: Bring back DRM support. // TODO[REFACTOR]: Bring back DRM support.
public static SampleSource buildSmoothStreamingSource(DemoPlayer player, public static SampleSource buildSmoothStreamingSource(DemoPlayer player,
DataSourceFactory dataSourceFactory, String url, MediaDrmCallback drmCallback) { DataSourceFactory dataSourceFactory, Uri uri, MediaDrmCallback drmCallback) {
if (!Util.toLowerInvariant(uri.getLastPathSegment()).equals("manifest")) {
uri = Uri.withAppendedPath(uri, "Manifest");
}
SmoothStreamingManifestParser parser = new SmoothStreamingManifestParser(); SmoothStreamingManifestParser parser = new SmoothStreamingManifestParser();
// TODO[REFACTOR]: This needs releasing. // TODO[REFACTOR]: This needs releasing.
DataSource manifestDataSource = dataSourceFactory.createDataSource(); DataSource manifestDataSource = dataSourceFactory.createDataSource();
ManifestFetcher<SmoothStreamingManifest> manifestFetcher = new ManifestFetcher<>(Uri.parse(url), ManifestFetcher<SmoothStreamingManifest> manifestFetcher = new ManifestFetcher<>(uri,
manifestDataSource, parser); manifestDataSource, parser);
Handler mainHandler = player.getMainHandler(); Handler mainHandler = player.getMainHandler();
BandwidthMeter bandwidthMeter = player.getBandwidthMeter(); BandwidthMeter bandwidthMeter = player.getBandwidthMeter();
@ -138,13 +142,13 @@ public class SourceBuilder {
return new MultiSampleSource(videoSampleSource, audioSampleSource, textSampleSource); return new MultiSampleSource(videoSampleSource, audioSampleSource, textSampleSource);
} }
public static SampleSource buildHlsSource(DemoPlayer player, public static SampleSource buildHlsSource(DemoPlayer player, DataSourceFactory dataSourceFactory,
DataSourceFactory dataSourceFactory, String url) { Uri uri) {
HlsPlaylistParser parser = new HlsPlaylistParser(); HlsPlaylistParser parser = new HlsPlaylistParser();
DataSource manifestDataSource = dataSourceFactory.createDataSource(); DataSource manifestDataSource = dataSourceFactory.createDataSource();
// TODO[REFACTOR]: This needs releasing. // TODO[REFACTOR]: This needs releasing.
ManifestFetcher<HlsPlaylist> manifestFetcher = new ManifestFetcher<>(Uri.parse(url), ManifestFetcher<HlsPlaylist> manifestFetcher = new ManifestFetcher<>(uri, manifestDataSource,
manifestDataSource, parser); parser);
Handler mainHandler = player.getMainHandler(); Handler mainHandler = player.getMainHandler();
BandwidthMeter bandwidthMeter = player.getBandwidthMeter(); BandwidthMeter bandwidthMeter = player.getBandwidthMeter();