package com.mercandalli.android.apps.files.file.audio.cast;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Handler;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.MediaRouteActionProvider;
import android.support.v7.media.MediaRouteSelector;
import android.support.v7.media.MediaRouter;
import android.util.Log;
import android.view.MenuItem;
import com.google.android.gms.cast.CastDevice;
import com.google.android.gms.cast.CastMediaControlIntent;
import com.google.android.gms.cast.CastRemoteDisplayLocalService;
import com.google.android.gms.common.api.Status;
import com.mercandalli.android.apps.files.R;
import com.mercandalli.android.apps.files.file.audio.FileAudioActivity;
import com.mercandalli.android.apps.files.file.audio.FileAudioModel;
import java.util.ArrayList;
import java.util.List;
/**
* A simple class with Cast methods (ChromeCast).
*/
public class FileAudioCast {
private MediaRouter mMediaRouter;
private MediaRouteSelector mMediaRouteSelector;
private MediaRouter.Callback mMediaRouterCallback;
private CastDevice mSelectedDevice;
private Activity mActivity;
private int mCurrentMusicIndex;
private final List<FileAudioModel> mFileAudioModelList = new ArrayList<>();
public void onCreate(final Activity activity) {
mActivity = activity;
mMediaRouter = MediaRouter.getInstance(activity.getApplicationContext());
mMediaRouterCallback = new MediaRouterCallback();
mMediaRouteSelector = new MediaRouteSelector.Builder()
.addControlCategory(CastMediaControlIntent.categoryForCast(
mActivity.getString(R.string.cast_id)))
.build();
}
public void onCreateOptionsMenu(MenuItem mediaRouteMenuItem) {
if (mediaRouteMenuItem == null) {
return;
}
final MediaRouteActionProvider mediaRouteActionProvider =
(MediaRouteActionProvider) MenuItemCompat.getActionProvider(mediaRouteMenuItem);
if (mediaRouteActionProvider == null) {
mediaRouteMenuItem.setVisible(false);
return;
}
mediaRouteActionProvider.setRouteSelector(mMediaRouteSelector);
}
public void onResume() {
mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback,
MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
}
public void onPause() {
mMediaRouter.removeCallback(mMediaRouterCallback);
mActivity = null;
}
public void startMusic(final int currentMusicIndex, List<FileAudioModel> musics) {
mCurrentMusicIndex = currentMusicIndex;
mFileAudioModelList.clear();
mFileAudioModelList.addAll(musics);
}
private void teardown() {
CastRemoteDisplayLocalService.stopService();
mSelectedDevice = null;
}
private class MediaRouterCallback extends MediaRouter.Callback {
private static final String TAG = "MediaRouterCallback";
@Override
public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo info) {
super.onRouteSelected(router, info);
mSelectedDevice = CastDevice.getFromBundle(info.getExtras());
final Intent intent = new Intent(mActivity, FileAudioActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent notificationPendingIntent = PendingIntent.getActivity(
mActivity, 0, intent, 0);
CastRemoteDisplayLocalService.NotificationSettings settings =
new CastRemoteDisplayLocalService.NotificationSettings.Builder()
.setNotificationPendingIntent(notificationPendingIntent)
.build();
CastRemoteDisplayLocalService.startService(
mActivity.getApplicationContext(),
FileAudioPresentationService.class,
mActivity.getString(R.string.cast_id),
mSelectedDevice,
settings,
new CastRemoteDisplayLocalService.Callbacks() {
@Override
public void onServiceCreated(CastRemoteDisplayLocalService castRemoteDisplayLocalService) {
Log.d(TAG, "onServiceCreated: " + castRemoteDisplayLocalService);
}
@Override
public void onRemoteDisplaySessionStarted(final CastRemoteDisplayLocalService service) {
// initialize sender UI
final List<FileAudioModel> fileAudioModelList = new ArrayList<>();
fileAudioModelList.addAll(mFileAudioModelList);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
FileAudioPresentationService presentationService = (FileAudioPresentationService) service;
presentationService.startMusic(mCurrentMusicIndex, fileAudioModelList);
}
}, 500);
}
@Override
public void onRemoteDisplaySessionError(Status errorReason) {
Log.e(TAG, "onRemoteDisplaySessionError: " + errorReason);
}
});
}
@Override
public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo info) {
super.onRouteUnselected(router, info);
teardown();
mSelectedDevice = null;
}
}
}