use of com.google.android.libraries.cast.companionlibrary.cast.exceptions.NoConnectionException in project AntennaPod by AntennaPod.
the class RemotePSMP method endPlayback.
@Override
protected Future<?> endPlayback(boolean hasEnded, boolean wasSkipped, boolean shouldContinue, boolean toStoppedState) {
Log.d(TAG, "endPlayback() called");
boolean isPlaying = playerStatus == PlayerStatus.PLAYING;
if (playerStatus != PlayerStatus.INDETERMINATE) {
setPlayerStatus(PlayerStatus.INDETERMINATE, media);
}
if (media != null && wasSkipped) {
// current position only really matters when we skip
int position = getPosition();
if (position >= 0) {
media.setPosition(position);
}
}
final Playable currentMedia = media;
Playable nextMedia = null;
if (shouldContinue) {
nextMedia = callback.getNextInQueue(currentMedia);
boolean playNextEpisode = isPlaying && nextMedia != null && UserPreferences.isFollowQueue();
if (playNextEpisode) {
Log.d(TAG, "Playback of next episode will start immediately.");
} else if (nextMedia == null) {
Log.d(TAG, "No more episodes available to play");
} else {
Log.d(TAG, "Loading next episode, but not playing automatically.");
}
if (nextMedia != null) {
callback.onPlaybackEnded(nextMedia.getMediaType(), !playNextEpisode);
// setting media to null signals to playMediaObject() that we're taking care of post-playback processing
media = null;
playMediaObject(nextMedia, false, true, /*TODO for now we always stream*/
playNextEpisode, playNextEpisode);
}
}
if (shouldContinue || toStoppedState) {
boolean shouldPostProcess = true;
if (nextMedia == null) {
try {
castMgr.stop();
shouldPostProcess = false;
} catch (CastException | TransientNetworkDisconnectionException | NoConnectionException e) {
Log.e(TAG, "Unable to stop playback", e);
callback.onPlaybackEnded(null, true);
stop();
}
}
if (shouldPostProcess) {
// Otherwise we rely on the chromecast callback to tell us the playback has stopped.
callback.onPostPlayback(currentMedia, hasEnded, wasSkipped, nextMedia != null);
}
} else if (isPlaying) {
callback.onPlaybackPause(currentMedia, currentMedia != null ? currentMedia.getPosition() : INVALID_TIME);
}
FutureTask<?> future = new FutureTask<>(() -> {
}, null);
future.run();
return future;
}
use of com.google.android.libraries.cast.companionlibrary.cast.exceptions.NoConnectionException in project Shuttle by timusus.
the class MusicService method play.
/**
* Starts playback of a previously opened file.
*/
public void play() {
int status = mAudioManager.requestAudioFocus(mAudioFocusListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
if (status != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
return;
}
if (mPlaybackLocation == LOCAL) {
if (SettingsManager.getInstance().getEqualizerEnabled()) {
//Shutdown any existing external audio sessions
EqualizerService.closeEqualizerSessions(this, false, getAudioSessionId());
//Start internal equalizer session (will only turn on if enabled)
EqualizerService.openEqualizerSession(this, true, getAudioSessionId());
} else {
EqualizerService.openEqualizerSession(this, false, getAudioSessionId());
}
}
if (mSession != null && !mSession.isActive()) {
try {
mSession.setActive(true);
} catch (Exception e) {
Log.e(TAG, "mSession.setActive() failed");
}
}
switch(mPlaybackLocation) {
case LOCAL:
{
if (player != null && player.isInitialized()) {
// if we are at the end of the song, go to the next song first
final long duration = player.getDuration();
if (repeatMode != RepeatMode.ONE && duration > 2000 && player.getPosition() >= duration - 2000) {
gotoNext(true);
}
player.start();
// make sure we fade in, in case a previous fadein was stopped
// because of another focus loss
playerHandler.removeMessages(PlayerHandler.FADE_DOWN);
playerHandler.sendEmptyMessage(PlayerHandler.FADE_UP);
setIsSupposedToBePlaying(true, true);
cancelShutdown();
updateNotification();
} else if (getCurrentPlaylist().size() == 0) {
if (queueReloading) {
playOnQueueLoad = true;
} else {
playAutoShuffleList();
}
}
break;
}
case REMOTE:
{
// if we are at the end of the song, go to the next song first
final long duration = player.getDuration();
if (repeatMode != RepeatMode.ONE && duration > 2000 && player.getPosition() >= duration - 2000) {
gotoNext(true);
}
if (!isSupposedToBePlaying) {
isSupposedToBePlaying = true;
notifyChange(InternalIntents.PLAY_STATE_CHANGED);
}
cancelShutdown();
updateNotification();
switch(playbackState) {
case STOPPED:
{
try {
mCastManager.checkConnectivity();
prepareChromeCastLoad(0, true);
playbackState = PLAYING;
updateNotification();
} catch (TransientNetworkDisconnectionException | NoConnectionException e) {
Log.e(TAG, "Play() called & failed. State: Stopped " + e.toString());
playbackState = STOPPED;
updateNotification();
}
break;
}
case PAUSED:
{
try {
mCastManager.checkConnectivity();
mCastManager.play();
playbackState = PLAYING;
updateNotification();
} catch (TransientNetworkDisconnectionException | NoConnectionException | CastException e) {
Log.e(TAG, "Play() called & failed. State: Paused " + e.toString());
playbackState = PAUSED;
updateNotification();
}
break;
}
}
if (getCurrentPlaylist().size() == 0) {
if (queueReloading) {
playOnQueueLoad = true;
} else {
playAutoShuffleList();
}
}
}
}
}
use of com.google.android.libraries.cast.companionlibrary.cast.exceptions.NoConnectionException in project Shuttle by timusus.
the class VideoCastManager method onVolumeChanged.
private void onVolumeChanged() {
LOGD(TAG, "onVolumeChanged() reached");
double volume;
try {
volume = getVolume();
boolean isMute = isMute();
for (VideoCastConsumer consumer : mVideoConsumers) {
consumer.onVolumeChanged(volume, isMute);
}
} catch (TransientNetworkDisconnectionException | NoConnectionException e) {
LOGE(TAG, "Failed to get volume", e);
}
}
use of com.google.android.libraries.cast.companionlibrary.cast.exceptions.NoConnectionException in project Shuttle by timusus.
the class VideoCastManager method onRemoteMediaPlayerStatusUpdated.
/*
* This is called by onStatusUpdated() of the RemoteMediaPlayer
*/
private void onRemoteMediaPlayerStatusUpdated() {
LOGD(TAG, "onRemoteMediaPlayerStatusUpdated() reached");
if (mApiClient == null || mRemoteMediaPlayer == null || mRemoteMediaPlayer.getMediaStatus() == null) {
LOGD(TAG, "mApiClient or mRemoteMediaPlayer is null, so will not proceed");
return;
}
mMediaStatus = mRemoteMediaPlayer.getMediaStatus();
List<MediaQueueItem> queueItems = mMediaStatus.getQueueItems();
if (queueItems != null) {
int itemId = mMediaStatus.getCurrentItemId();
MediaQueueItem item = mMediaStatus.getQueueItemById(itemId);
int repeatMode = mMediaStatus.getQueueRepeatMode();
onQueueUpdated(queueItems, item, repeatMode, false);
} else {
onQueueUpdated(null, null, MediaStatus.REPEAT_MODE_REPEAT_OFF, false);
}
mState = mMediaStatus.getPlayerState();
mIdleReason = mMediaStatus.getIdleReason();
try {
double volume = getVolume();
boolean isMute = isMute();
boolean makeUiHidden = false;
if (mState == MediaStatus.PLAYER_STATE_PLAYING) {
LOGD(TAG, "onRemoteMediaPlayerStatusUpdated(): Player status = playing");
updateMediaSession(true);
long mediaDurationLeft = getMediaTimeRemaining();
startReconnectionService(mediaDurationLeft);
startNotificationService();
} else if (mState == MediaStatus.PLAYER_STATE_PAUSED) {
LOGD(TAG, "onRemoteMediaPlayerStatusUpdated(): Player status = paused");
updateMediaSession(false);
startNotificationService();
} else if (mState == MediaStatus.PLAYER_STATE_IDLE) {
LOGD(TAG, "onRemoteMediaPlayerStatusUpdated(): Player status = IDLE with reason: " + mIdleReason);
updateMediaSession(false);
switch(mIdleReason) {
case MediaStatus.IDLE_REASON_FINISHED:
if (mMediaStatus.getLoadingItemId() == MediaQueueItem.INVALID_ITEM_ID) {
// we have reached the end of queue
clearMediaSession();
makeUiHidden = true;
}
break;
case MediaStatus.IDLE_REASON_ERROR:
// something bad happened on the cast device
LOGD(TAG, "onRemoteMediaPlayerStatusUpdated(): IDLE reason = ERROR");
makeUiHidden = true;
clearMediaSession();
onFailed(R.string.ccl_failed_receiver_player_error, NO_STATUS_CODE);
break;
case MediaStatus.IDLE_REASON_CANCELED:
LOGD(TAG, "onRemoteMediaPlayerStatusUpdated(): IDLE reason = CANCELLED");
makeUiHidden = !isRemoteStreamLive();
break;
case MediaStatus.IDLE_REASON_INTERRUPTED:
if (mMediaStatus.getLoadingItemId() == MediaQueueItem.INVALID_ITEM_ID) {
// we have reached the end of queue
clearMediaSession();
makeUiHidden = true;
}
break;
default:
LOGE(TAG, "onRemoteMediaPlayerStatusUpdated(): Unexpected Idle Reason " + mIdleReason);
}
} else if (mState == MediaStatus.PLAYER_STATE_BUFFERING) {
LOGD(TAG, "onRemoteMediaPlayerStatusUpdated(): Player status = buffering");
} else {
LOGD(TAG, "onRemoteMediaPlayerStatusUpdated(): Player status = unknown");
makeUiHidden = true;
}
if (makeUiHidden) {
stopReconnectionService();
stopNotificationService();
}
updateMiniControllersVisibility(!makeUiHidden);
updateMiniControllers();
for (VideoCastConsumer consumer : mVideoConsumers) {
consumer.onRemoteMediaPlayerStatusUpdated();
consumer.onVolumeChanged(volume, isMute);
}
} catch (TransientNetworkDisconnectionException | NoConnectionException e) {
LOGE(TAG, "Failed to get volume state due to network issues", e);
}
}
use of com.google.android.libraries.cast.companionlibrary.cast.exceptions.NoConnectionException in project Shuttle by timusus.
the class VideoIntentReceiver method onReceive.
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action == null) {
return;
}
VideoCastManager castManager = VideoCastManager.getInstance();
switch(action) {
case VideoCastNotificationService.ACTION_TOGGLE_PLAYBACK:
try {
castManager.togglePlayback();
} catch (CastException | TransientNetworkDisconnectionException | NoConnectionException e) {
LOGE(TAG, "onReceive() Failed to toggle playback");
}
break;
case VideoCastNotificationService.ACTION_PLAY_NEXT:
try {
castManager.queueNext(null);
} catch (TransientNetworkDisconnectionException | NoConnectionException e) {
LOGE(TAG, "onReceive() Failed to skip to the next in queue");
}
break;
case VideoCastNotificationService.ACTION_PLAY_PREV:
try {
castManager.queuePrev(null);
} catch (TransientNetworkDisconnectionException | NoConnectionException e) {
LOGE(TAG, "onReceive() Failed to skip to the previous in queue");
}
break;
case VideoCastNotificationService.ACTION_FORWARD:
int forwardAmount = intent.getIntExtra(VideoCastNotificationService.EXTRA_FORWARD_STEP_MS, 0);
try {
castManager.forward(forwardAmount);
} catch (TransientNetworkDisconnectionException | NoConnectionException e) {
LOGE(TAG, "onReceive() Failed to forward the media");
}
break;
case VideoCastNotificationService.ACTION_REWIND:
int rewindAmount = intent.getIntExtra(VideoCastNotificationService.EXTRA_FORWARD_STEP_MS, 0);
try {
castManager.forward(rewindAmount);
} catch (TransientNetworkDisconnectionException | NoConnectionException e) {
LOGE(TAG, "onReceive() Failed to rewind the media");
}
break;
case VideoCastNotificationService.ACTION_STOP:
LOGD(TAG, "Calling stopApplication from intent");
castManager.disconnectDevice(true, true, true);
// persistent notification if other things go wrong
if (castManager.getNotificationServiceClass() != null) {
context.stopService(new Intent(context, castManager.getNotificationServiceClass()));
}
break;
case Intent.ACTION_MEDIA_BUTTON:
// Lollipop
if (!intent.hasExtra(Intent.EXTRA_KEY_EVENT)) {
return;
}
KeyEvent keyEvent = (KeyEvent) intent.getExtras().get(Intent.EXTRA_KEY_EVENT);
if (keyEvent == null || keyEvent.getAction() != KeyEvent.ACTION_DOWN) {
return;
}
if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) {
try {
castManager.togglePlayback();
} catch (CastException | TransientNetworkDisconnectionException | NoConnectionException e) {
LOGE(TAG, "onReceive() Failed to toggle playback ");
}
}
break;
}
}
Aggregations