package com.distantfuture.videos.cast; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.View; import com.distantfuture.castcompanionlibrary.lib.cast.VideoCastManager; import com.distantfuture.castcompanionlibrary.lib.cast.callbacks.VideoCastConsumerImpl; import com.distantfuture.castcompanionlibrary.lib.utils.MiniController; import com.distantfuture.videos.R; import com.distantfuture.videos.misc.DUtils; import com.distantfuture.videos.misc.MainApplication; import com.distantfuture.videos.misc.Utils; import com.google.android.gms.cast.ApplicationMetadata; import com.google.android.gms.cast.MediaInfo; import com.google.android.gms.cast.MediaMetadata; import com.google.android.gms.common.images.WebImage; public class CastActivity extends FragmentActivity { private static final String TAG = "CastActivity"; private static String TAG_MEDIA = "videos"; private static String THUMB_PREFIX_URL = "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/"; private static String TAG_CATEGORIES = "categories"; private static String TAG_NAME = "name"; private static String TAG_STUDIO = "studio"; private static String TAG_SOURCES = "sources"; private static String TAG_SUBTITLE = "subtitle"; private static String TAG_THUMB = "image-480x270"; // "thumb"; private static String TAG_IMG_780_1200 = "image-780x1200"; private static String TAG_TITLE = "title"; protected MediaInfo mRemoteMediaInformation; private VideoCastManager mCastManager; private PlaybackState mPlaybackState = PlaybackState.PAUSED; private MiniController mMini; private VideoCastConsumerImpl mCastConsumer; private MediaInfo mSelectedMedia; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_cast); mCastManager = MainApplication.getCastManager(this); getActionBar().setDisplayHomeAsUpEnabled(false); getActionBar().setDisplayUseLogoEnabled(false); getActionBar().setDisplayShowHomeEnabled(false); getActionBar().setDisplayShowTitleEnabled(false); setupMiniController(); setupCastListener(); MediaMetadata movieMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE); movieMetadata.putString(MediaMetadata.KEY_SUBTITLE, "Animal Fats"); movieMetadata.putString(MediaMetadata.KEY_TITLE, "Stuff that Sucks"); movieMetadata.putString(MediaMetadata.KEY_STUDIO, "Google"); movieMetadata.addImage(new WebImage(Uri.parse("http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images_480x270/ForBiggerEscapes.jpg"))); movieMetadata.addImage(new WebImage(Uri.parse("http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images_780x1200/Escape-780x1200.jpg"))); mSelectedMedia = new MediaInfo.Builder("http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4") .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) .setContentType("video/mp4") .setMetadata(movieMetadata) .build(); View button = findViewById(R.id.play_button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { togglePlayback(); } }); } private void setupCastListener() { mCastConsumer = new VideoCastConsumerImpl() { @Override public void onApplicationConnected(ApplicationMetadata appMetadata, String sessionId, boolean wasLaunched) { Log.d(TAG, "onApplicationLaunched() is reached"); if (null != mSelectedMedia) { if (mPlaybackState == PlaybackState.PLAYING) { try { loadRemoteMedia(0, true); finish(); } catch (Exception e) { DUtils.log(e.getMessage()); } } else { } } } @Override public void onApplicationDisconnected(int errorCode) { Log.d(TAG, "onApplicationDisconnected() is reached with errorCode: " + errorCode); } @Override public void onDisconnected() { Log.d(TAG, "onDisconnected() is reached"); mPlaybackState = PlaybackState.PAUSED; } @Override public void onRemoteMediaPlayerMetadataUpdated() { try { mRemoteMediaInformation = mCastManager.getRemoteMediaInformation(); } catch (Exception e) { // silent } } @Override public void onFailed(int resourceId, int statusCode) { } @Override public void onConnectionSuspended(int cause) { Utils.toast(CastActivity.this, "Connection Lost"); } @Override public void onConnectivityRecovered() { Utils.toast(CastActivity.this, "Connection Recovered"); } }; } private void setupMiniController() { mMini = (MiniController) findViewById(R.id.miniController1); mCastManager.addMiniController(mMini); } private void togglePlayback() { switch (mPlaybackState) { case PAUSED: try { mCastManager.checkConnectivity(); loadRemoteMedia(0, true); finish(); } catch (Exception e) { DUtils.log("Exception: " + e.getMessage()); return; } break; case PLAYING: mPlaybackState = PlaybackState.PAUSED; break; case IDLE: mPlaybackState = PlaybackState.PLAYING; break; default: break; } } private void loadRemoteMedia(int position, boolean autoPlay) { mCastManager.startCastControllerActivity(this, mSelectedMedia, position, autoPlay); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause() was called"); mCastManager.removeVideoCastConsumer(mCastConsumer); mMini.removeOnMiniControllerChangedListener(mCastManager); mCastManager.decrementUiCounter(); } @Override protected void onDestroy() { if (null != mCastManager) { mMini.removeOnMiniControllerChangedListener(mCastManager); mCastConsumer = null; } super.onDestroy(); } @Override protected void onResume() { mCastManager = MainApplication.getCastManager(this); mCastManager.addVideoCastConsumer(mCastConsumer); mCastManager.incrementUiCounter(); super.onResume(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (!mCastManager.isConnected()) { return super.onKeyDown(keyCode, event); } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { onVolumeChange(MainApplication.VOLUME_INCREMENT); } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { onVolumeChange(-MainApplication.VOLUME_INCREMENT); } else { return super.onKeyDown(keyCode, event); } return true; } private void onVolumeChange(double volumeIncrement) { if (mCastManager == null) { try { mCastManager.incrementVolume(volumeIncrement); } catch (Exception e) { Log.e(TAG, "onVolumeChange() Failed to change volume", e); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.cast_menu, menu); mCastManager.addMediaRouterButton(menu, R.id.action_cast, this, false); return true; } public static enum PlaybackState { PLAYING, PAUSED, BUFFERING, IDLE } }