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 TrackSelectionHelper trackSelectionHelper;
private DebugTextViewHelper debugViewHelper;
private boolean playerNeedsPrepare;
private boolean playerNeedsSource;
private long playerPosition;
private Uri contentUri;
private int contentType;
private String contentId;
private String provider;
// Activity lifecycle
@Override
@ -173,6 +168,8 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
if (currentHandler != defaultCookieManager) {
CookieHandler.setDefault(defaultCookieManager);
}
configureSubtitleView();
}
@Override
@ -186,28 +183,15 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
public void onStart() {
super.onStart();
if (Util.SDK_INT > 23) {
onShown();
initializePlayer();
}
}
@Override
public void onResume() {
super.onResume();
if (Util.SDK_INT <= 23 || player == null) {
onShown();
}
}
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);
if ((Util.SDK_INT <= 23 || player == null)) {
initializePlayer();
}
}
@ -215,7 +199,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
public void onPause() {
super.onPause();
if (Util.SDK_INT <= 23) {
onHidden();
releasePlayer();
}
}
@ -223,21 +207,16 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
public void onStop() {
super.onStop();
if (Util.SDK_INT > 23) {
onHidden();
}
}
private void onHidden() {
shutterView.setVisibility(View.VISIBLE);
releasePlayer();
}
}
// OnClickListener methods
@Override
public void onClick(View view) {
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,
int[] grantResults) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
preparePlayer(true);
initializePlayer();
} else {
Toast.makeText(getApplicationContext(), R.string.storage_permission_denied,
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
* 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)
private boolean maybeRequestPermission() {
if (requiresPermission(contentUri)) {
private boolean maybeRequestPermission(Uri uri) {
if (requiresPermission(uri)) {
requestPermissions(new String[] {permission.READ_EXTERNAL_STORAGE}, 0);
return true;
} else {
@ -283,24 +263,24 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
// Internal methods
private SampleSource buildSource(DemoPlayer player) {
switch (contentType) {
private SampleSource buildSource(Uri uri, String id, String provider, int type) {
switch (type) {
case Util.TYPE_SS:
return SourceBuilder.buildSmoothStreamingSource(player, dataSourceFactory,
contentUri.toString(), new SmoothStreamingTestMediaDrmCallback());
return SourceBuilder.buildSmoothStreamingSource(player, dataSourceFactory, uri,
new SmoothStreamingTestMediaDrmCallback());
case Util.TYPE_DASH:
return SourceBuilder.buildDashSource(player, dataSourceFactory, contentUri.toString(),
new WidevineTestMediaDrmCallback(contentId, provider));
return SourceBuilder.buildDashSource(player, dataSourceFactory, uri,
new WidevineTestMediaDrmCallback(id, provider));
case Util.TYPE_HLS:
return SourceBuilder.buildHlsSource(player, dataSourceFactory, contentUri.toString());
return SourceBuilder.buildHlsSource(player, dataSourceFactory, uri);
case Util.TYPE_OTHER:
return SourceBuilder.buildExtractorSource(player, dataSourceFactory, contentUri);
return SourceBuilder.buildExtractorSource(player, dataSourceFactory, uri);
default:
throw new IllegalStateException("Unsupported type: " + contentType);
throw new IllegalStateException("Unsupported type: " + type);
}
}
private void preparePlayer(boolean playWhenReady) {
private void initializePlayer() {
if (player == null) {
player = new DemoPlayer(this);
player.addListener(this);
@ -309,7 +289,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
player.seekTo(playerPosition);
trackSelector = player.getTrackSelector();
trackSelectionHelper = new TrackSelectionHelper(trackSelector);
playerNeedsPrepare = true;
playerNeedsSource = true;
mediaController.setMediaPlayer(player.getPlayerControl());
mediaController.setEnabled(true);
eventLogger = new EventLogger();
@ -317,20 +297,31 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
player.addListener(eventLogger);
player.setInfoListener(eventLogger);
player.setInternalErrorListener(eventLogger);
player.setSurface(surfaceView.getHolder().getSurface());
player.setPlayWhenReady(true);
debugViewHelper = new DebugTextViewHelper(player, debugTextView);
debugViewHelper.start();
}
if (playerNeedsPrepare) {
player.setSource(buildSource(player));
playerNeedsPrepare = false;
if (playerNeedsSource) {
Intent intent = getIntent();
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();
}
player.setSurface(surfaceView.getHolder().getSurface());
player.setPlayWhenReady(playWhenReady);
}
private void releasePlayer() {
if (player != null) {
shutterView.setVisibility(View.VISIBLE);
debugViewHelper.stop();
debugViewHelper = null;
playerPosition = player.getCurrentPosition();
@ -407,7 +398,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
if (errorString != null) {
Toast.makeText(getApplicationContext(), errorString, Toast.LENGTH_LONG).show();
}
playerNeedsPrepare = true;
playerNeedsSource = true;
updateButtonVisibilities();
showControls();
}
@ -423,7 +414,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
// User controls
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);
audioButton.setVisibility(haveTracks(DemoPlayer.TYPE_AUDIO) ? 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.DefaultAllocator;
import com.google.android.exoplayer.util.ManifestFetcher;
import com.google.android.exoplayer.util.Util;
import android.net.Uri;
import android.os.Handler;
@ -64,12 +65,12 @@ public class SourceBuilder {
// TODO[REFACTOR]: Bring back DASH DRM support.
// TODO[REFACTOR]: Bring back DASH UTC timing element support.
public static SampleSource buildDashSource(DemoPlayer player, DataSourceFactory dataSourceFactory,
String url, MediaDrmCallback drmCallback) {
Uri uri, MediaDrmCallback drmCallback) {
MediaPresentationDescriptionParser parser = new MediaPresentationDescriptionParser();
DataSource manifestDataSource = dataSourceFactory.createDataSource();
// TODO[REFACTOR]: This needs releasing.
ManifestFetcher<MediaPresentationDescription> manifestFetcher = new ManifestFetcher<>(
Uri.parse(url), manifestDataSource, parser);
ManifestFetcher<MediaPresentationDescription> manifestFetcher = new ManifestFetcher<>(uri,
manifestDataSource, parser);
Handler mainHandler = player.getMainHandler();
BandwidthMeter bandwidthMeter = player.getBandwidthMeter();
@ -103,11 +104,14 @@ public class SourceBuilder {
// TODO[REFACTOR]: Bring back DRM support.
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();
// TODO[REFACTOR]: This needs releasing.
DataSource manifestDataSource = dataSourceFactory.createDataSource();
ManifestFetcher<SmoothStreamingManifest> manifestFetcher = new ManifestFetcher<>(Uri.parse(url),
ManifestFetcher<SmoothStreamingManifest> manifestFetcher = new ManifestFetcher<>(uri,
manifestDataSource, parser);
Handler mainHandler = player.getMainHandler();
BandwidthMeter bandwidthMeter = player.getBandwidthMeter();
@ -138,13 +142,13 @@ public class SourceBuilder {
return new MultiSampleSource(videoSampleSource, audioSampleSource, textSampleSource);
}
public static SampleSource buildHlsSource(DemoPlayer player,
DataSourceFactory dataSourceFactory, String url) {
public static SampleSource buildHlsSource(DemoPlayer player, DataSourceFactory dataSourceFactory,
Uri uri) {
HlsPlaylistParser parser = new HlsPlaylistParser();
DataSource manifestDataSource = dataSourceFactory.createDataSource();
// TODO[REFACTOR]: This needs releasing.
ManifestFetcher<HlsPlaylist> manifestFetcher = new ManifestFetcher<>(Uri.parse(url),
manifestDataSource, parser);
ManifestFetcher<HlsPlaylist> manifestFetcher = new ManifestFetcher<>(uri, manifestDataSource,
parser);
Handler mainHandler = player.getMainHandler();
BandwidthMeter bandwidthMeter = player.getBandwidthMeter();