use of com.google.android.libraries.cast.companionlibrary.cast.exceptions.TransientNetworkDisconnectionException in project Shuttle by timusus.
the class VideoCastManager method updateMediaSession.
/*
* Updates the playback status of the Media Session
*/
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
private void updateMediaSession(boolean playing) {
if (!isFeatureEnabled(CastConfiguration.FEATURE_LOCKSCREEN)) {
return;
}
if (!isConnected()) {
return;
}
try {
if ((mMediaSessionCompat == null) && playing) {
setUpMediaSession(getRemoteMediaInformation());
}
if (mMediaSessionCompat != null) {
int playState = isRemoteStreamLive() ? PlaybackStateCompat.STATE_BUFFERING : PlaybackStateCompat.STATE_PLAYING;
int state = playing ? playState : PlaybackStateCompat.STATE_PAUSED;
PendingIntent pi = getCastControllerPendingIntent();
if (pi != null) {
mMediaSessionCompat.setSessionActivity(pi);
}
mMediaSessionCompat.setPlaybackState(new PlaybackStateCompat.Builder().setState(state, 0, 1.0f).setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE).build());
}
} catch (TransientNetworkDisconnectionException | NoConnectionException e) {
LOGE(TAG, "Failed to set up MediaSessionCompat due to network issues", e);
}
}
use of com.google.android.libraries.cast.companionlibrary.cast.exceptions.TransientNetworkDisconnectionException in project Shuttle by timusus.
the class VideoCastManager method onRemoteMediaPlayerMetadataUpdated.
/*
* This is called by onMetadataUpdated() of RemoteMediaPlayer
*/
public void onRemoteMediaPlayerMetadataUpdated() {
LOGD(TAG, "onRemoteMediaPlayerMetadataUpdated() reached");
updateMediaSessionMetadata();
for (VideoCastConsumer consumer : mVideoConsumers) {
consumer.onRemoteMediaPlayerMetadataUpdated();
}
try {
updateLockScreenImage(getRemoteMediaInformation());
} catch (TransientNetworkDisconnectionException | NoConnectionException e) {
LOGE(TAG, "Failed to update lock screen metadata due to a network issue", e);
}
}
use of com.google.android.libraries.cast.companionlibrary.cast.exceptions.TransientNetworkDisconnectionException in project Shuttle by timusus.
the class VideoCastControllerFragment method updatePlayerStatus.
private void updatePlayerStatus() {
int mediaStatus = mCastManager.getPlaybackStatus();
mMediaStatus = mCastManager.getMediaStatus();
LOGD(TAG, "updatePlayerStatus(), state: " + mediaStatus);
if (mSelectedMedia == null) {
return;
}
mCastController.setStreamType(mSelectedMedia.getStreamType());
if (mediaStatus == MediaStatus.PLAYER_STATE_BUFFERING) {
mCastController.setSubTitle(getString(R.string.ccl_loading));
} else {
mCastController.setSubTitle(getString(R.string.ccl_casting_to_device, mCastManager.getDeviceName()));
}
switch(mediaStatus) {
case MediaStatus.PLAYER_STATE_PLAYING:
mIsFresh = false;
if (mPlaybackState != MediaStatus.PLAYER_STATE_PLAYING) {
mPlaybackState = MediaStatus.PLAYER_STATE_PLAYING;
mCastController.setPlaybackStatus(mPlaybackState);
}
break;
case MediaStatus.PLAYER_STATE_PAUSED:
mIsFresh = false;
if (mPlaybackState != MediaStatus.PLAYER_STATE_PAUSED) {
mPlaybackState = MediaStatus.PLAYER_STATE_PAUSED;
mCastController.setPlaybackStatus(mPlaybackState);
}
break;
case MediaStatus.PLAYER_STATE_BUFFERING:
mIsFresh = false;
if (mPlaybackState != MediaStatus.PLAYER_STATE_BUFFERING) {
mPlaybackState = MediaStatus.PLAYER_STATE_BUFFERING;
mCastController.setPlaybackStatus(mPlaybackState);
}
break;
case MediaStatus.PLAYER_STATE_IDLE:
LOGD(TAG, "Idle Reason: " + (mCastManager.getIdleReason()));
switch(mCastManager.getIdleReason()) {
case MediaStatus.IDLE_REASON_FINISHED:
if (!mIsFresh && (mMediaStatus == null || mMediaStatus.getLoadingItemId() == MediaQueueItem.INVALID_ITEM_ID)) {
mCastController.closeActivity();
}
break;
case MediaStatus.IDLE_REASON_CANCELED:
try {
if (mCastManager.isRemoteStreamLive()) {
if (mPlaybackState != MediaStatus.PLAYER_STATE_IDLE) {
mPlaybackState = MediaStatus.PLAYER_STATE_IDLE;
mCastController.setPlaybackStatus(mPlaybackState);
}
} else {
mCastController.closeActivity();
}
} catch (TransientNetworkDisconnectionException | NoConnectionException e) {
LOGD(TAG, "Failed to determine if stream is live", e);
}
break;
case MediaStatus.IDLE_REASON_INTERRUPTED:
mPlaybackState = MediaStatus.PLAYER_STATE_IDLE;
mCastController.setPlaybackStatus(mPlaybackState);
break;
default:
break;
}
break;
default:
break;
}
}
use of com.google.android.libraries.cast.companionlibrary.cast.exceptions.TransientNetworkDisconnectionException 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.TransientNetworkDisconnectionException 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();
}
}
}
}
}
Aggregations