package com.tutsplus.googlecastv3;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.google.android.gms.cast.MediaInfo;
import com.google.android.gms.cast.MediaMetadata;
import com.google.android.gms.cast.framework.AppVisibilityListener;
import com.google.android.gms.cast.framework.CastButtonFactory;
import com.google.android.gms.cast.framework.CastContext;
import com.google.android.gms.cast.framework.CastState;
import com.google.android.gms.cast.framework.CastStateListener;
import com.google.android.gms.cast.framework.IntroductoryOverlay;
import com.google.android.gms.cast.framework.Session;
import com.google.android.gms.cast.framework.SessionManagerListener;
import com.google.android.gms.cast.framework.media.RemoteMediaClient;
import com.google.android.gms.common.images.WebImage;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener,
SessionManagerListener,
AppVisibilityListener,
CastStateListener {
private ListView mListView;
private ArrayAdapter<String> mAdapter;
private IntroductoryOverlay mIntroductoryOverlay;
private MenuItem mMediaRouterButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
mListView = (ListView) findViewById(R.id.list);
mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, new ArrayList<String>());
mAdapter.add("Movie 1");
mAdapter.add("Movie 2");
mAdapter.add("Movie 3");
mAdapter.add("Movie 4");
mAdapter.add("Movie 5");
mAdapter.add("Movie 6");
mAdapter.add("Movie 7");
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(this);
CastContext.getSharedInstance(this).addCastStateListener(this);
CastContext.getSharedInstance(this).addAppVisibilityListener(this);
CastContext.getSharedInstance(this).getSessionManager().addSessionManagerListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.menu_main, menu);
mMediaRouterButton = CastButtonFactory.setUpMediaRouteButton(getApplicationContext(),
menu,
R.id.media_route_menu_item);
showIntroductoryOverlay();
return true;
}
@Override
protected void onDestroy() {
super.onDestroy();
CastContext.getSharedInstance(this).removeAppVisibilityListener(this);
CastContext.getSharedInstance(this).removeCastStateListener(this);
CastContext.getSharedInstance(this).getSessionManager().removeSessionManagerListener(this);
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
if( CastContext.getSharedInstance(this).getSessionManager().getCurrentCastSession() != null
&& CastContext.getSharedInstance(this).getSessionManager().getCurrentCastSession().getRemoteMediaClient() != null ) {
RemoteMediaClient remoteMediaClient = CastContext.getSharedInstance(this).getSessionManager().getCurrentCastSession().getRemoteMediaClient();
if( remoteMediaClient.getMediaInfo() != null &&
remoteMediaClient.getMediaInfo().getMetadata() != null
&& mAdapter.getItem(position).equalsIgnoreCase(
remoteMediaClient.getMediaInfo().getMetadata().getString(MediaMetadata.KEY_TITLE))) {
startActivity(new Intent(this, ExpandedControlsActivity.class));
} else {
MediaMetadata metadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);
metadata.putString(MediaMetadata.KEY_TITLE, mAdapter.getItem(position));
metadata.putString(MediaMetadata.KEY_SUBTITLE, "Subtitle");
metadata.addImage(new WebImage(Uri.parse(getString(R.string.movie_poster))));
metadata.addImage(new WebImage(Uri.parse(getString(R.string.movie_poster))));
MediaInfo mediaInfo = new MediaInfo.Builder(getString(R.string.movie_link))
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
.setContentType("videos/mp4")
.setMetadata(metadata)
.build();
remoteMediaClient.load(mediaInfo, true, 0);
}
} else {
startActivity(new Intent(this, MovieDetailActivity.class));
}
}
private void showIntroductoryOverlay() {
if (mIntroductoryOverlay != null) {
mIntroductoryOverlay.remove();
}
if ((mMediaRouterButton != null) && mMediaRouterButton.isVisible()) {
new Handler().post(new Runnable() {
@Override
public void run() {
mIntroductoryOverlay = new IntroductoryOverlay.Builder(
MainActivity.this, mMediaRouterButton)
.setTitleText("Introduction text")
.setOverlayColor(R.color.colorPrimary)
.setSingleTime()
.setOnOverlayDismissedListener(
new IntroductoryOverlay.OnOverlayDismissedListener() {
@Override
public void onOverlayDismissed() {
mIntroductoryOverlay = null;
}
})
.build();
mIntroductoryOverlay.show();
}
});
}
}
@Override
public void onSessionStarting(Session session) {
Log.e("Tuts+", "onSessionsStarting");
}
@Override
public void onSessionStarted(Session session, String s) {
Log.e("Tuts+", "onSessionStarted");
invalidateOptionsMenu();
}
@Override
public void onSessionStartFailed(Session session, int i) {
Log.e("Tuts+", "onSessionStartFailed");
}
@Override
public void onSessionEnding(Session session) {
Log.e("Tuts+", "onSessionEnding");
}
@Override
public void onSessionEnded(Session session, int i) {
Log.e("Tuts+", "onSessionEnded");
}
@Override
public void onSessionResuming(Session session, String s) {
Log.e("Tuts+", "onSessionResuming");
}
@Override
public void onSessionResumed(Session session, boolean b) {
Log.e("Tuts+", "onSessionResumed");
invalidateOptionsMenu();
}
@Override
public void onSessionResumeFailed(Session session, int i) {
Log.e("Tuts+", "onSessionResumeFailed");
}
@Override
public void onSessionSuspended(Session session, int i) {
Log.e("Tuts+", "onSessionSuspended");
}
@Override
public void onAppEnteredForeground() {
Log.e("Tuts+", "onAppEnteredForeground");
}
@Override
public void onAppEnteredBackground() {
Log.e("Tuts+", "onAppEnteredBackground");
}
@Override
public void onCastStateChanged(int newState) {
Log.e("Tuts+", "onCastStateChanged");
switch( newState ) {
case CastState.CONNECTED: {
break;
} case CastState.CONNECTING: {
break;
} case CastState.NOT_CONNECTED: {
break;
} case CastState.NO_DEVICES_AVAILABLE: {
}
}
if (newState != CastState.NO_DEVICES_AVAILABLE) {
showIntroductoryOverlay();
}
}
}