diff options
Diffstat (limited to 'core/src')
-rw-r--r-- | core/src/main/java/de/danoeh/antennapod/core/cast/CastManager.java | 319 | ||||
-rw-r--r-- | core/src/main/java/de/danoeh/antennapod/core/cast/DefaultCastConsumer.java (renamed from core/src/main/java/de/danoeh/antennapod/core/cast/CastConsumerImpl.java) | 2 | ||||
-rw-r--r-- | core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java | 154 | ||||
-rw-r--r-- | core/src/main/java/de/danoeh/antennapod/core/service/playback/RemotePSMP.java | 11 |
4 files changed, 241 insertions, 245 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/cast/CastManager.java b/core/src/main/java/de/danoeh/antennapod/core/cast/CastManager.java index 629798f41..9530d93ad 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/cast/CastManager.java +++ b/core/src/main/java/de/danoeh/antennapod/core/cast/CastManager.java @@ -13,8 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. * + * ------------------------------------------------------------------------ * - * TODO altered by Domingos Lopes + * Changes made by Domingos Lopes <domingos86lopes@gmail.com> + * + * original can be found at http://www.github.com/googlecast/CastCompanionLibrary-android */ package de.danoeh.antennapod.core.cast; @@ -76,7 +79,7 @@ import static com.google.android.gms.cast.RemoteMediaPlayer.RESUME_STATE_UNCHANG * (see {@link CastConsumer}). * Since the number of these callbacks is usually much larger than what a single application might * be interested in, there is a no-op implementation of this interface (see - * {@link CastConsumerImpl}) that applications can subclass to override only those methods that + * {@link DefaultCastConsumer}) that applications can subclass to override only those methods that * they are interested in. Since this library depends on the cast functionalities provided by the * Google Play services, the library checks to ensure that the right version of that service is * installed. It also provides a simple static method {@code checkGooglePlayServices()} that clients @@ -92,17 +95,17 @@ public class CastManager extends BaseCastManager implements OnFailedListener { public static final double DEFAULT_VOLUME_STEP = 0.05; public static final long DEFAULT_LIVE_STREAM_DURATION_MS = TimeUnit.HOURS.toMillis(2); - private double mVolumeStep = DEFAULT_VOLUME_STEP; - private MediaQueue mMediaQueue; - private MediaStatus mMediaStatus; + private double volumeStep = DEFAULT_VOLUME_STEP; + private MediaQueue mediaQueue; + private MediaStatus mediaStatus; private static CastManager INSTANCE; - private RemoteMediaPlayer mRemoteMediaPlayer; - private int mState = MediaStatus.PLAYER_STATE_IDLE; - private int mIdleReason; - private final Set<CastConsumer> mCastConsumers = new CopyOnWriteArraySet<>(); - private long mLiveStreamDuration = DEFAULT_LIVE_STREAM_DURATION_MS; - private MediaQueueItem mPreLoadingItem; + private RemoteMediaPlayer remoteMediaPlayer; + private int state = MediaStatus.PLAYER_STATE_IDLE; + private int idleReason; + private final Set<CastConsumer> castConsumers = new CopyOnWriteArraySet<>(); + private long liveStreamDuration = DEFAULT_LIVE_STREAM_DURATION_MS; + private MediaQueueItem preLoadingItem; public static final int QUEUE_OPERATION_LOAD = 1; public static final int QUEUE_OPERATION_INSERT_ITEMS = 2; @@ -163,7 +166,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { * those methods directly after obtaining an instance of the active {@link RemoteMediaPlayer}. */ public final RemoteMediaPlayer getRemoteMediaPlayer() { - return mRemoteMediaPlayer; + return remoteMediaPlayer; } /** @@ -180,10 +183,10 @@ public class CastManager extends BaseCastManager implements OnFailedListener { } /* - * A simple check to make sure mRemoteMediaPlayer is not null + * A simple check to make sure remoteMediaPlayer is not null */ private void checkRemoteMediaPlayerAvailable() throws NoConnectionException { - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { throw new NoConnectionException(); } } @@ -199,9 +202,9 @@ public class CastManager extends BaseCastManager implements OnFailedListener { public String getRemoteMediaUrl() throws TransientNetworkDisconnectionException, NoConnectionException { checkConnectivity(); - if (mRemoteMediaPlayer != null && mRemoteMediaPlayer.getMediaInfo() != null) { - MediaInfo info = mRemoteMediaPlayer.getMediaInfo(); - mRemoteMediaPlayer.getMediaStatus().getPlayerState(); + if (remoteMediaPlayer != null && remoteMediaPlayer.getMediaInfo() != null) { + MediaInfo info = remoteMediaPlayer.getMediaInfo(); + remoteMediaPlayer.getMediaStatus().getPlayerState(); return info.getContentId(); } throw new NoConnectionException(); @@ -216,8 +219,8 @@ public class CastManager extends BaseCastManager implements OnFailedListener { public boolean isRemoteMediaPlaying() throws TransientNetworkDisconnectionException, NoConnectionException { checkConnectivity(); - return mState == MediaStatus.PLAYER_STATE_BUFFERING - || mState == MediaStatus.PLAYER_STATE_PLAYING; + return state == MediaStatus.PLAYER_STATE_BUFFERING + || state == MediaStatus.PLAYER_STATE_PLAYING; } /** @@ -229,7 +232,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { public boolean isRemoteMediaPaused() throws TransientNetworkDisconnectionException, NoConnectionException { checkConnectivity(); - return mState == MediaStatus.PLAYER_STATE_PAUSED; + return state == MediaStatus.PLAYER_STATE_PAUSED; } /** @@ -256,7 +259,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { NoConnectionException { checkConnectivity(); checkRemoteMediaPlayerAvailable(); - return mRemoteMediaPlayer.getMediaInfo(); + return remoteMediaPlayer.getMediaInfo(); } /** @@ -269,7 +272,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { public double getStreamVolume() throws TransientNetworkDisconnectionException, NoConnectionException { checkConnectivity(); checkRemoteMediaPlayerAvailable(); - return mRemoteMediaPlayer.getMediaStatus().getStreamVolume(); + return remoteMediaPlayer.getMediaStatus().getStreamVolume(); } /** @@ -313,7 +316,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { public boolean isStreamMute() throws TransientNetworkDisconnectionException, NoConnectionException { checkConnectivity(); checkRemoteMediaPlayerAvailable(); - return mRemoteMediaPlayer.getMediaStatus().isMute(); + return remoteMediaPlayer.getMediaStatus().isMute(); } /** @@ -337,7 +340,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { NoConnectionException { checkConnectivity(); checkRemoteMediaPlayerAvailable(); - mRemoteMediaPlayer.setStreamMute(mApiClient, mute); + remoteMediaPlayer.setStreamMute(mApiClient, mute); } /** @@ -350,7 +353,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { NoConnectionException { checkConnectivity(); checkRemoteMediaPlayerAvailable(); - return mRemoteMediaPlayer.getStreamDuration(); + return remoteMediaPlayer.getStreamDuration(); } /** @@ -363,11 +366,11 @@ public class CastManager extends BaseCastManager implements OnFailedListener { public long getMediaTimeRemaining() throws TransientNetworkDisconnectionException, NoConnectionException { checkConnectivity(); - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { return -1; } - return isRemoteStreamLive() ? mLiveStreamDuration : mRemoteMediaPlayer.getStreamDuration() - - mRemoteMediaPlayer.getApproximateStreamPosition(); + return isRemoteStreamLive() ? liveStreamDuration : remoteMediaPlayer.getStreamDuration() + - remoteMediaPlayer.getApproximateStreamPosition(); } /** @@ -380,13 +383,13 @@ public class CastManager extends BaseCastManager implements OnFailedListener { NoConnectionException { checkConnectivity(); checkRemoteMediaPlayerAvailable(); - return mRemoteMediaPlayer.getApproximateStreamPosition(); + return remoteMediaPlayer.getApproximateStreamPosition(); } private void onApplicationDisconnected(int errorCode) { Log.d(TAG, "onApplicationDisconnected() reached with error code: " + errorCode); mApplicationErrorCode = errorCode; - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onApplicationDisconnected(errorCode); } if (mMediaRouter != null) { @@ -408,7 +411,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { try { String appStatus = Cast.CastApi.getApplicationStatus(mApiClient); Log.d(TAG, "onApplicationStatusChanged() reached: " + appStatus); - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onApplicationStatusChanged(appStatus); } } catch (IllegalStateException e) { @@ -422,7 +425,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { try { volume = getDeviceVolume(); boolean isMute = isDeviceMute(); - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onVolumeChanged(volume, isMute); } } catch (TransientNetworkDisconnectionException | NoConnectionException e) { @@ -437,7 +440,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { try { volume = getStreamVolume(); boolean isMute = isStreamMute(); - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onStreamVolumeChanged(volume, isMute); } } catch (TransientNetworkDisconnectionException | NoConnectionException e) { @@ -474,13 +477,13 @@ public class CastManager extends BaseCastManager implements OnFailedListener { mSessionId = sessionId; // saving device for future retrieval; we only save the last session info mPreferenceAccessor.saveStringToPreference(PREFS_KEY_SESSION_ID, mSessionId); - mRemoteMediaPlayer.requestStatus(mApiClient).setResultCallback(result -> { + remoteMediaPlayer.requestStatus(mApiClient).setResultCallback(result -> { if (!result.getStatus().isSuccess()) { onFailed(R.string.cast_failed_status_request, result.getStatus().getStatusCode()); } }); - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onApplicationConnected(appMetadata, mSessionId, wasLaunched); } } catch (TransientNetworkDisconnectionException e) { @@ -510,7 +513,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { */ @Override public void onApplicationStopFailed(int errorCode) { - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onApplicationStopFailed(errorCode); } } @@ -527,7 +530,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { onDeviceSelected(null /* CastDevice */, null /* RouteInfo */); } } else { - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onApplicationConnectionFailed(errorCode); } onDeviceSelected(null /* CastDevice */, null /* RouteInfo */); @@ -590,14 +593,14 @@ public class CastManager extends BaseCastManager implements OnFailedListener { if (media == null) { return; } - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to load a video with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer.load(mApiClient, media, autoPlay, position, activeTracks, customData) + remoteMediaPlayer.load(mApiClient, media, autoPlay, position, activeTracks, customData) .setResultCallback(result -> { - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onMediaLoadResult(result.getStatus().getStatusCode()); } }); @@ -637,14 +640,14 @@ public class CastManager extends BaseCastManager implements OnFailedListener { if (items == null || items.length == 0) { return; } - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to queue one or more videos with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer + remoteMediaPlayer .queueLoad(mApiClient, items, startIndex, repeatMode, customData) .setResultCallback(result -> { - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onMediaQueueOperationResult(QUEUE_OPERATION_LOAD, result.getStatus().getStatusCode()); } @@ -676,15 +679,15 @@ public class CastManager extends BaseCastManager implements OnFailedListener { if (itemsToInsert == null || itemsToInsert.length == 0) { throw new IllegalArgumentException("items cannot be empty or null"); } - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to insert into queue with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer + remoteMediaPlayer .queueInsertItems(mApiClient, itemsToInsert, insertBeforeItemId, customData) .setResultCallback( result -> { - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onMediaQueueOperationResult( QUEUE_OPERATION_INSERT_ITEMS, result.getStatus().getStatusCode()); @@ -709,16 +712,16 @@ public class CastManager extends BaseCastManager implements OnFailedListener { public void queueUpdateItems(final MediaQueueItem[] itemsToUpdate, final JSONObject customData) throws TransientNetworkDisconnectionException, NoConnectionException { checkConnectivity(); - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to update the queue with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer + remoteMediaPlayer .queueUpdateItems(mApiClient, itemsToUpdate, customData).setResultCallback( result -> { Log.d(TAG, "queueUpdateItems() " + result.getStatus() + result.getStatus() .isSuccess()); - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onMediaQueueOperationResult(QUEUE_OPERATION_UPDATE_ITEMS, result.getStatus().getStatusCode()); } @@ -745,14 +748,14 @@ public class CastManager extends BaseCastManager implements OnFailedListener { if (itemId == MediaQueueItem.INVALID_ITEM_ID) { throw new IllegalArgumentException("itemId is not valid"); } - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to jump in a queue with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer + remoteMediaPlayer .queueJumpToItem(mApiClient, itemId, customData).setResultCallback( result -> { - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onMediaQueueOperationResult(QUEUE_OPERATION_JUMP, result.getStatus().getStatusCode()); } @@ -779,14 +782,14 @@ public class CastManager extends BaseCastManager implements OnFailedListener { if (itemIdsToRemove == null || itemIdsToRemove.length == 0) { throw new IllegalArgumentException("itemIds cannot be empty or null"); } - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to remove items from queue with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer + remoteMediaPlayer .queueRemoveItems(mApiClient, itemIdsToRemove, customData).setResultCallback( result -> { - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onMediaQueueOperationResult(QUEUE_OPERATION_REMOVE_ITEMS, result.getStatus().getStatusCode()); } @@ -815,14 +818,14 @@ public class CastManager extends BaseCastManager implements OnFailedListener { if (itemId == MediaQueueItem.INVALID_ITEM_ID) { throw new IllegalArgumentException("itemId is invalid"); } - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to remove an item from queue with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer + remoteMediaPlayer .queueRemoveItem(mApiClient, itemId, customData).setResultCallback( result -> { - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onMediaQueueOperationResult(QUEUE_OPERATION_REMOVE_ITEM, result.getStatus().getStatusCode()); } @@ -874,15 +877,15 @@ public class CastManager extends BaseCastManager implements OnFailedListener { if (itemIdsToReorder == null || itemIdsToReorder.length == 0) { throw new IllegalArgumentException("itemIdsToReorder cannot be empty or null"); } - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to reorder items in a queue with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer + remoteMediaPlayer .queueReorderItems(mApiClient, itemIdsToReorder, insertBeforeItemId, customData) .setResultCallback( result -> { - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onMediaQueueOperationResult(QUEUE_OPERATION_REORDER, result.getStatus().getStatusCode()); } @@ -910,15 +913,15 @@ public class CastManager extends BaseCastManager implements OnFailedListener { throws TransientNetworkDisconnectionException, NoConnectionException { Log.d(TAG, "queueMoveItemToNewIndex"); checkConnectivity(); - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to mote item to new index with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer + remoteMediaPlayer .queueMoveItemToNewIndex(mApiClient, itemId, newIndex, customData) .setResultCallback( result -> { - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onMediaQueueOperationResult(QUEUE_OPERATION_MOVE, result.getStatus().getStatusCode()); } @@ -938,15 +941,15 @@ public class CastManager extends BaseCastManager implements OnFailedListener { throws TransientNetworkDisconnectionException, NoConnectionException { Log.d(TAG, "queueAppendItem"); checkConnectivity(); - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to append item with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer + remoteMediaPlayer .queueAppendItem(mApiClient, item, customData) .setResultCallback( result -> { - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onMediaQueueOperationResult(QUEUE_OPERATION_APPEND, result.getStatus().getStatusCode()); } @@ -965,14 +968,14 @@ public class CastManager extends BaseCastManager implements OnFailedListener { throws TransientNetworkDisconnectionException, NoConnectionException { Log.d(TAG, "queueNext"); checkConnectivity(); - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to update the queue with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer + remoteMediaPlayer .queueNext(mApiClient, customData).setResultCallback( result -> { - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onMediaQueueOperationResult(QUEUE_OPERATION_NEXT, result.getStatus().getStatusCode()); } @@ -991,14 +994,14 @@ public class CastManager extends BaseCastManager implements OnFailedListener { throws TransientNetworkDisconnectionException, NoConnectionException { Log.d(TAG, "queuePrev"); checkConnectivity(); - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to update the queue with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer + remoteMediaPlayer .queuePrev(mApiClient, customData).setResultCallback( result -> { - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onMediaQueueOperationResult(QUEUE_OPERATION_PREV, result.getStatus().getStatusCode()); } @@ -1023,7 +1026,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { throws TransientNetworkDisconnectionException, NoConnectionException { Log.d(TAG, "queueInsertBeforeCurrentAndPlay"); checkConnectivity(); - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to insert into queue with no active media session"); throw new NoConnectionException(); } @@ -1031,7 +1034,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { throw new IllegalArgumentException( "item cannot be empty or insertBeforeItemId cannot be invalid"); } - mRemoteMediaPlayer.queueInsertItems(mApiClient, new MediaQueueItem[]{item}, + remoteMediaPlayer.queueInsertItems(mApiClient, new MediaQueueItem[]{item}, insertBeforeItemId, customData).setResultCallback( result -> { if (result.getStatus().isSuccess()) { @@ -1043,7 +1046,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { Log.e(TAG, "queuePrev() Failed to skip to previous", e); } } - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onMediaQueueOperationResult(QUEUE_OPERATION_INSERT_ITEMS, result.getStatus().getStatusCode()); } @@ -1063,17 +1066,17 @@ public class CastManager extends BaseCastManager implements OnFailedListener { throws TransientNetworkDisconnectionException, NoConnectionException { Log.d(TAG, "queueSetRepeatMode"); checkConnectivity(); - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to update the queue with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer + remoteMediaPlayer .queueSetRepeatMode(mApiClient, repeatMode, customData).setResultCallback( result -> { if (!result.getStatus().isSuccess()) { Log.d(TAG, "Failed with status: " + result.getStatus()); } - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onMediaQueueOperationResult(QUEUE_OPERATION_SET_REPEAT, result.getStatus().getStatusCode()); } @@ -1091,7 +1094,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { NoConnectionException { checkConnectivity(); Log.d(TAG, "attempting to play media at position " + position + " seconds"); - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to play a video with no active media session"); throw new NoConnectionException(); } @@ -1109,11 +1112,11 @@ public class CastManager extends BaseCastManager implements OnFailedListener { TransientNetworkDisconnectionException, NoConnectionException { Log.d(TAG, "play(customData)"); checkConnectivity(); - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to play a video with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer.play(mApiClient, customData) + remoteMediaPlayer.play(mApiClient, customData) .setResultCallback(result -> { if (!result.getStatus().isSuccess()) { onFailed(R.string.cast_failed_to_play, @@ -1145,11 +1148,11 @@ public class CastManager extends BaseCastManager implements OnFailedListener { TransientNetworkDisconnectionException, NoConnectionException { Log.d(TAG, "stop()"); checkConnectivity(); - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to stop a stream with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer.stop(mApiClient, customData).setResultCallback( + remoteMediaPlayer.stop(mApiClient, customData).setResultCallback( result -> { if (!result.getStatus().isSuccess()) { onFailed(R.string.cast_failed_to_stop, @@ -1194,11 +1197,11 @@ public class CastManager extends BaseCastManager implements OnFailedListener { TransientNetworkDisconnectionException, NoConnectionException { Log.d(TAG, "attempting to pause media"); checkConnectivity(); - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to pause a video with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer.pause(mApiClient, customData) + remoteMediaPlayer.pause(mApiClient, customData) .setResultCallback(result -> { if (!result.getStatus().isSuccess()) { onFailed(R.string.cast_failed_to_pause, @@ -1219,11 +1222,11 @@ public class CastManager extends BaseCastManager implements OnFailedListener { NoConnectionException { Log.d(TAG, "attempting to seek media"); checkConnectivity(); - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to seek a video with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer.seek(mApiClient, + remoteMediaPlayer.seek(mApiClient, position, RESUME_STATE_UNCHANGED). setResultCallback(result -> { @@ -1245,11 +1248,11 @@ public class CastManager extends BaseCastManager implements OnFailedListener { NoConnectionException { Log.d(TAG, "forward(): attempting to forward media by " + lengthInMillis); checkConnectivity(); - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to seek a video with no active media session"); throw new NoConnectionException(); } - long position = mRemoteMediaPlayer.getApproximateStreamPosition() + lengthInMillis; + long position = remoteMediaPlayer.getApproximateStreamPosition() + lengthInMillis; seek((int) position); } @@ -1264,11 +1267,11 @@ public class CastManager extends BaseCastManager implements OnFailedListener { NoConnectionException { Log.d(TAG, "attempting to seek media"); checkConnectivity(); - if (mRemoteMediaPlayer == null) { + if (remoteMediaPlayer == null) { Log.e(TAG, "Trying to seekAndPlay a video with no active media session"); throw new NoConnectionException(); } - mRemoteMediaPlayer.seek(mApiClient, position, RESUME_STATE_PLAY) + remoteMediaPlayer.seek(mApiClient, position, RESUME_STATE_PLAY) .setResultCallback(result -> { if (!result.getStatus().isSuccess()) { onFailed(R.string.cast_failed_seek, result.getStatus().getStatusCode()); @@ -1290,8 +1293,8 @@ public class CastManager extends BaseCastManager implements OnFailedListener { if (isPlaying) { pause(); } else { - if (mState == MediaStatus.PLAYER_STATE_IDLE - && mIdleReason == MediaStatus.IDLE_REASON_FINISHED) { + if (state == MediaStatus.PLAYER_STATE_IDLE + && idleReason == MediaStatus.IDLE_REASON_FINISHED) { loadMedia(getRemoteMediaInformation(), true, 0); } else { play(); @@ -1303,17 +1306,17 @@ public class CastManager extends BaseCastManager implements OnFailedListener { NoConnectionException { Log.d(TAG, "attachMediaChannel()"); checkConnectivity(); - if (mRemoteMediaPlayer == null) { - mRemoteMediaPlayer = new RemoteMediaPlayer(); + if (remoteMediaPlayer == null) { + remoteMediaPlayer = new RemoteMediaPlayer(); - mRemoteMediaPlayer.setOnStatusUpdatedListener( + remoteMediaPlayer.setOnStatusUpdatedListener( () -> { Log.d(TAG, "RemoteMediaPlayer::onStatusUpdated() is reached"); CastManager.this.onRemoteMediaPlayerStatusUpdated(); } ); - mRemoteMediaPlayer.setOnPreloadStatusUpdatedListener( + remoteMediaPlayer.setOnPreloadStatusUpdatedListener( () -> { Log.d(TAG, "RemoteMediaPlayer::onPreloadStatusUpdated() is " @@ -1322,27 +1325,27 @@ public class CastManager extends BaseCastManager implements OnFailedListener { }); - mRemoteMediaPlayer.setOnMetadataUpdatedListener( + remoteMediaPlayer.setOnMetadataUpdatedListener( () -> { Log.d(TAG, "RemoteMediaPlayer::onMetadataUpdated() is reached"); CastManager.this.onRemoteMediaPlayerMetadataUpdated(); } ); - mRemoteMediaPlayer.setOnQueueStatusUpdatedListener( + remoteMediaPlayer.setOnQueueStatusUpdatedListener( () -> { Log.d(TAG, "RemoteMediaPlayer::onQueueStatusUpdated() is " + "reached"); - mMediaStatus = mRemoteMediaPlayer.getMediaStatus(); - if (mMediaStatus != null - && mMediaStatus.getQueueItems() != null) { - List<MediaQueueItem> queueItems = mMediaStatus + mediaStatus = remoteMediaPlayer.getMediaStatus(); + if (mediaStatus != null + && mediaStatus.getQueueItems() != null) { + List<MediaQueueItem> queueItems = mediaStatus .getQueueItems(); - int itemId = mMediaStatus.getCurrentItemId(); - MediaQueueItem item = mMediaStatus + int itemId = mediaStatus.getCurrentItemId(); + MediaQueueItem item = mediaStatus .getQueueItemById(itemId); - int repeatMode = mMediaStatus.getQueueRepeatMode(); + int repeatMode = mediaStatus.getQueueRepeatMode(); onQueueUpdated(queueItems, item, repeatMode, false); } else { onQueueUpdated(null, null, @@ -1353,19 +1356,19 @@ public class CastManager extends BaseCastManager implements OnFailedListener { } try { Log.d(TAG, "Registering MediaChannel namespace"); - Cast.CastApi.setMessageReceivedCallbacks(mApiClient, mRemoteMediaPlayer.getNamespace(), - mRemoteMediaPlayer); + Cast.CastApi.setMessageReceivedCallbacks(mApiClient, remoteMediaPlayer.getNamespace(), + remoteMediaPlayer); } catch (IOException | IllegalStateException e) { Log.e(TAG, "attachMediaChannel()", e); } } private void reattachMediaChannel() { - if (mRemoteMediaPlayer != null && mApiClient != null) { + if (remoteMediaPlayer != null && mApiClient != null) { try { Log.d(TAG, "Registering MediaChannel namespace"); Cast.CastApi.setMessageReceivedCallbacks(mApiClient, - mRemoteMediaPlayer.getNamespace(), mRemoteMediaPlayer); + remoteMediaPlayer.getNamespace(), remoteMediaPlayer); } catch (IOException | IllegalStateException e) { Log.e(TAG, "reattachMediaChannel()", e); } @@ -1374,14 +1377,14 @@ public class CastManager extends BaseCastManager implements OnFailedListener { private void detachMediaChannel() { Log.d(TAG, "trying to detach media channel"); - if (mRemoteMediaPlayer != null) { + if (remoteMediaPlayer != null) { try { Cast.CastApi.removeMessageReceivedCallbacks(mApiClient, - mRemoteMediaPlayer.getNamespace()); + remoteMediaPlayer.getNamespace()); } catch (IOException | IllegalStateException e) { Log.e(TAG, "detachMediaChannel()", e); } - mRemoteMediaPlayer = null; + remoteMediaPlayer = null; } } @@ -1398,7 +1401,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { * </ul> */ public int getPlaybackStatus() { - return mState; + return state; } /** @@ -1406,7 +1409,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { * whenever the onStatusUpdated callback is called. */ public final MediaStatus getMediaStatus() { - return mMediaStatus; + return mediaStatus; } /** @@ -1424,11 +1427,11 @@ public class CastManager extends BaseCastManager implements OnFailedListener { * </ul> */ public int getIdleReason() { - return mIdleReason; + return idleReason; } private void onMessageSendFailed(int errorCode) { - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onDataMessageSendFailed(errorCode); } } @@ -1438,48 +1441,48 @@ public class CastManager extends BaseCastManager implements OnFailedListener { */ private void onRemoteMediaPlayerStatusUpdated() { Log.d(TAG, "onRemoteMediaPlayerStatusUpdated() reached"); - if (mApiClient == null || mRemoteMediaPlayer == null - || mRemoteMediaPlayer.getMediaStatus() == null) { - Log.d(TAG, "mApiClient or mRemoteMediaPlayer is null, so will not proceed"); + if (mApiClient == null || remoteMediaPlayer == null + || remoteMediaPlayer.getMediaStatus() == null) { + Log.d(TAG, "mApiClient or remoteMediaPlayer is null, so will not proceed"); return; } - mMediaStatus = mRemoteMediaPlayer.getMediaStatus(); - List<MediaQueueItem> queueItems = mMediaStatus.getQueueItems(); + mediaStatus = remoteMediaPlayer.getMediaStatus(); + List<MediaQueueItem> queueItems = mediaStatus.getQueueItems(); if (queueItems != null) { - int itemId = mMediaStatus.getCurrentItemId(); - MediaQueueItem item = mMediaStatus.getQueueItemById(itemId); - int repeatMode = mMediaStatus.getQueueRepeatMode(); + int itemId = mediaStatus.getCurrentItemId(); + MediaQueueItem item = mediaStatus.getQueueItemById(itemId); + int repeatMode = mediaStatus.getQueueRepeatMode(); onQueueUpdated(queueItems, item, repeatMode, false); } else { onQueueUpdated(null, null, MediaStatus.REPEAT_MODE_REPEAT_OFF, false); } - mState = mMediaStatus.getPlayerState(); - mIdleReason = mMediaStatus.getIdleReason(); + state = mediaStatus.getPlayerState(); + idleReason = mediaStatus.getIdleReason(); try { double volume = getStreamVolume(); boolean isMute = isStreamMute(); - if (mState == MediaStatus.PLAYER_STATE_PLAYING) { + if (state == MediaStatus.PLAYER_STATE_PLAYING) { Log.d(TAG, "onRemoteMediaPlayerStatusUpdated(): Player status = playing"); long mediaDurationLeft = getMediaTimeRemaining(); //startReconnectionService(mediaDurationLeft); - } else if (mState == MediaStatus.PLAYER_STATE_PAUSED) { + } else if (state == MediaStatus.PLAYER_STATE_PAUSED) { Log.d(TAG, "onRemoteMediaPlayerStatusUpdated(): Player status = paused"); - } else if (mState == MediaStatus.PLAYER_STATE_IDLE) { + } else if (state == MediaStatus.PLAYER_STATE_IDLE) { Log.d(TAG, "onRemoteMediaPlayerStatusUpdated(): Player status = IDLE with reason: " - + mIdleReason ); - if (mIdleReason == MediaStatus.IDLE_REASON_ERROR) { + + idleReason); + if (idleReason == MediaStatus.IDLE_REASON_ERROR) { // something bad happened on the cast device Log.d(TAG, "onRemoteMediaPlayerStatusUpdated(): IDLE reason = ERROR"); onFailed(R.string.cast_failed_receiver_player_error, NO_STATUS_CODE); } //stopReconnectionService(); - } else if (mState == MediaStatus.PLAYER_STATE_BUFFERING) { + } else if (state == MediaStatus.PLAYER_STATE_BUFFERING) { Log.d(TAG, "onRemoteMediaPlayerStatusUpdated(): Player status = buffering"); } else { Log.d(TAG, "onRemoteMediaPlayerStatusUpdated(): Player status = unknown"); } - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onRemoteMediaPlayerStatusUpdated(); consumer.onStreamVolumeChanged(volume, isMute); } @@ -1491,19 +1494,19 @@ public class CastManager extends BaseCastManager implements OnFailedListener { private void onRemoteMediaPreloadStatusUpdated() { MediaQueueItem item = null; - mMediaStatus = mRemoteMediaPlayer.getMediaStatus(); - if (mMediaStatus != null) { - item = mMediaStatus.getQueueItemById(mMediaStatus.getPreloadedItemId()); + mediaStatus = remoteMediaPlayer.getMediaStatus(); + if (mediaStatus != null) { + item = mediaStatus.getQueueItemById(mediaStatus.getPreloadedItemId()); } - mPreLoadingItem = item; + preLoadingItem = item; Log.d(TAG, "onRemoteMediaPreloadStatusUpdated() " + item); - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onRemoteMediaPreloadStatusUpdated(item); } } public MediaQueueItem getPreLoadingItem() { - return mPreLoadingItem; + return preLoadingItem; } /* @@ -1515,13 +1518,13 @@ public class CastManager extends BaseCastManager implements OnFailedListener { Log.d(TAG, String.format("Queue Items size: %d, Item: %s, Repeat Mode: %d, Shuffle: %s", queueItems == null ? 0 : queueItems.size(), item, repeatMode, shuffle)); if (queueItems != null) { - mMediaQueue = new MediaQueue(new CopyOnWriteArrayList<>(queueItems), item, shuffle, + mediaQueue = new MediaQueue(new CopyOnWriteArrayList<>(queueItems), item, shuffle, repeatMode); } else { - mMediaQueue = new MediaQueue(new CopyOnWriteArrayList<>(), null, false, + mediaQueue = new MediaQueue(new CopyOnWriteArrayList<>(), null, false, MediaStatus.REPEAT_MODE_REPEAT_OFF); } - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onMediaQueueUpdated(queueItems, item, repeatMode, shuffle); } } @@ -1531,7 +1534,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { */ public void onRemoteMediaPlayerMetadataUpdated() { Log.d(TAG, "onRemoteMediaPlayerMetadataUpdated() reached"); - for (CastConsumer consumer : mCastConsumers) { + for (CastConsumer consumer : castConsumers) { consumer.onRemoteMediaPlayerMetadataUpdated(); } } @@ -1541,12 +1544,12 @@ public class CastManager extends BaseCastManager implements OnFailedListener { * Registered listeners will be notified of changes to a variety of * lifecycle and media status changes through the callbacks that the interface provides. * - * @see CastConsumerImpl + * @see DefaultCastConsumer */ public synchronized void addCastConsumer(CastConsumer listener) { if (listener != null) { addBaseCastConsumer(listener); - mCastConsumers.add(listener); + castConsumers.add(listener); Log.d(TAG, "Successfully added the new CastConsumer listener " + listener); } } @@ -1557,7 +1560,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { public synchronized void removeCastConsumer(CastConsumer listener) { if (listener != null) { removeBaseCastConsumer(listener); - mCastConsumers.remove(listener); + castConsumers.remove(listener); } } @@ -1565,8 +1568,8 @@ public class CastManager extends BaseCastManager implements OnFailedListener { protected void onDeviceUnselected() { detachMediaChannel(); //removeDataChannel(); - mState = MediaStatus.PLAYER_STATE_IDLE; - mMediaStatus = null; + state = MediaStatus.PLAYER_STATE_IDLE; + mediaStatus = null; } @Override @@ -1581,17 +1584,17 @@ public class CastManager extends BaseCastManager implements OnFailedListener { @Override public void onConnectionFailed(ConnectionResult result) { super.onConnectionFailed(result); - mState = MediaStatus.PLAYER_STATE_IDLE; - mMediaStatus = null; + state = MediaStatus.PLAYER_STATE_IDLE; + mediaStatus = null; } @Override public void onDisconnected(boolean stopAppOnExit, boolean clearPersistedConnectionData, boolean setDefaultRoute) { super.onDisconnected(stopAppOnExit, clearPersistedConnectionData, setDefaultRoute); - mState = MediaStatus.PLAYER_STATE_IDLE; - mMediaStatus = null; - mMediaQueue = null; + state = MediaStatus.PLAYER_STATE_IDLE; + mediaStatus = null; + mediaQueue = null; } class CastListener extends Cast.Listener { @@ -1682,7 +1685,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { if ((volumeStep > 1) || (volumeStep < 0)) { throw new IllegalArgumentException("Volume Step should be between 0 and 1, inclusive"); } - mVolumeStep = volumeStep; + this.volumeStep = volumeStep; return this; } @@ -1690,11 +1693,11 @@ public class CastManager extends BaseCastManager implements OnFailedListener { * Returns the volume step. The default value is {@code DEFAULT_VOLUME_STEP}. */ public double getVolumeStep() { - return mVolumeStep; + return volumeStep; } public final MediaQueue getMediaQueue() { - return mMediaQueue; + return mediaQueue; } /** diff --git a/core/src/main/java/de/danoeh/antennapod/core/cast/CastConsumerImpl.java b/core/src/main/java/de/danoeh/antennapod/core/cast/DefaultCastConsumer.java index 59fc09902..fe4183d54 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/cast/CastConsumerImpl.java +++ b/core/src/main/java/de/danoeh/antennapod/core/cast/DefaultCastConsumer.java @@ -2,7 +2,7 @@ package de.danoeh.antennapod.core.cast; import com.google.android.libraries.cast.companionlibrary.cast.callbacks.VideoCastConsumerImpl; -public class CastConsumerImpl extends VideoCastConsumerImpl implements CastConsumer { +public class DefaultCastConsumer extends VideoCastConsumerImpl implements CastConsumer { @Override public void onStreamVolumeChanged(double value, boolean isMute) { // no-op diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index 79560f4ae..1507662e1 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java @@ -47,7 +47,7 @@ import java.util.List; import de.danoeh.antennapod.core.ClientConfig; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.cast.CastConsumer; -import de.danoeh.antennapod.core.cast.CastConsumerImpl; +import de.danoeh.antennapod.core.cast.DefaultCastConsumer; import de.danoeh.antennapod.core.cast.CastManager; import de.danoeh.antennapod.core.feed.Chapter; import de.danoeh.antennapod.core.feed.FeedItem; @@ -198,16 +198,16 @@ public class PlaybackService extends Service { */ private volatile PlaybackServiceMediaPlayer.PSMPInfo infoBeforeCastDisconnection; - private boolean mWifiConnectivity = true; - private BroadcastReceiver mWifiBroadcastReceiver; + private boolean wifiConnectivity = true; + private BroadcastReceiver wifiBroadcastReceiver; private static final int NOTIFICATION_ID = 1; private PlaybackServiceMediaPlayer mediaPlayer; private PlaybackServiceTaskManager taskManager; - private CastManager mCastMgr; - private MediaRouter mMediaRouter; + private CastManager castManager; + private MediaRouter mediaRouter; /** * Only used for Lollipop notifications. */ @@ -231,7 +231,6 @@ public class PlaybackService extends Service { return super.onUnbind(intent); } - //TODO review the general intent handling and how a casting activity can be introduced /** * Returns an intent which starts an audio- or videoplayer, depending on the * type of media that is being played. If the playbackservice is not @@ -282,7 +281,7 @@ public class PlaybackService extends Service { ACTION_RESUME_PLAY_CURRENT_EPISODE)); taskManager = new PlaybackServiceTaskManager(this, taskManagerCallback); - mMediaRouter = MediaRouter.getInstance(getApplicationContext()); + mediaRouter = MediaRouter.getInstance(getApplicationContext()); PreferenceManager.getDefaultSharedPreferences(this) .registerOnSharedPreferenceChangeListener(prefListener); @@ -306,14 +305,14 @@ public class PlaybackService extends Service { npe.printStackTrace(); } - mCastMgr = CastManager.getInstance(); - mCastMgr.addCastConsumer(castConsumer); - isCasting = mCastMgr.isConnected(); + castManager = CastManager.getInstance(); + castManager.addCastConsumer(castConsumer); + isCasting = castManager.isConnected(); if (isCasting) { if (UserPreferences.isCastEnabled()) { onCastAppConnected(false); } else { - mCastMgr.disconnect(); + castManager.disconnect(); } } else { mediaPlayer = new LocalPSMP(this, mediaPlayerCallback); @@ -344,7 +343,7 @@ public class PlaybackService extends Service { unregisterReceiver(skipCurrentEpisodeReceiver); unregisterReceiver(pausePlayCurrentEpisodeReceiver); unregisterReceiver(pauseResumeCurrentEpisodeReceiver); - mCastMgr.removeCastConsumer(castConsumer); + castManager.removeCastConsumer(castConsumer); unregisterWifiBroadcastReceiver(); mediaPlayer.shutdown(); taskManager.shutdown(); @@ -387,7 +386,7 @@ public class PlaybackService extends Service { sendNotificationBroadcast(NOTIFICATION_TYPE_RELOAD, 0); //If the user asks to play External Media, the casting session, if on, should end. if (playable instanceof ExternalMedia) { - mCastMgr.disconnect(); + castManager.disconnect(); } mediaPlayer.playMediaObject(playable, stream, startWhenPrepared, prepareImmediately); } @@ -1485,6 +1484,57 @@ public class PlaybackService extends Service { } } + private CastConsumer castConsumer = new DefaultCastConsumer() { + @Override + public void onApplicationConnected(ApplicationMetadata appMetadata, String sessionId, boolean wasLaunched) { + PlaybackService.this.onCastAppConnected(wasLaunched); + } + + @Override + public void onDisconnectionReason(int reason) { + Log.d(TAG, "onDisconnectionReason() with code " + reason); + // This is our final chance to update the underlying stream position + // In onDisconnected(), the underlying CastPlayback#mVideoCastConsumer + // is disconnected and hence we update our local value of stream position + // to the latest position. + if (mediaPlayer != null) { + saveCurrentPosition(false, 0); + infoBeforeCastDisconnection = mediaPlayer.getPSMPInfo(); + if (reason != BaseCastManager.DISCONNECT_REASON_EXPLICIT && + infoBeforeCastDisconnection.playerStatus == PlayerStatus.PLAYING) { + // If it's NOT based on user action, we shouldn't automatically resume local playback + infoBeforeCastDisconnection.playerStatus = PlayerStatus.PAUSED; + } + } + } + + @Override + public void onDisconnected() { + Log.d(TAG, "onDisconnected()"); + isCasting = false; + PlaybackServiceMediaPlayer.PSMPInfo info = infoBeforeCastDisconnection; + infoBeforeCastDisconnection = null; + if (info == null && mediaPlayer != null) { + info = mediaPlayer.getPSMPInfo(); + } + if (info == null) { + info = new PlaybackServiceMediaPlayer.PSMPInfo(PlayerStatus.STOPPED, null); + } + switchMediaPlayer(new LocalPSMP(PlaybackService.this, mediaPlayerCallback), + info, false); + if (info.playable != null) { + sendNotificationBroadcast(NOTIFICATION_TYPE_RELOAD, + info.playable.getMediaType() == MediaType.AUDIO ? EXTRA_CODE_AUDIO : EXTRA_CODE_VIDEO); + } else { + Log.d(TAG, "Cast session disconnected, but no current media"); + sendNotificationBroadcast(NOTIFICATION_TYPE_PLAYBACK_END, 0); + } + // hardware volume buttons control the local device volume + mediaRouter.setMediaSessionCompat(null); + unregisterWifiBroadcastReceiver(); + } + }; + private final MediaSessionCompat.Callback sessionCallback = new MediaSessionCompat.Callback() { private static final String TAG = "MediaSessionCompat"; @@ -1570,56 +1620,6 @@ public class PlaybackService extends Service { } }; - private CastConsumer castConsumer = new CastConsumerImpl() { - @Override - public void onApplicationConnected(ApplicationMetadata appMetadata, String sessionId, boolean wasLaunched) { - PlaybackService.this.onCastAppConnected(wasLaunched); - } - - @Override - public void onDisconnectionReason(int reason) { - Log.d(TAG, "onDisconnectionReason() with code " + reason); - // This is our final chance to update the underlying stream position - // In onDisconnected(), the underlying CastPlayback#mVideoCastConsumer - // is disconnected and hence we update our local value of stream position - // to the latest position. - if (mediaPlayer != null) { - saveCurrentPosition(false, 0); - infoBeforeCastDisconnection = mediaPlayer.getPSMPInfo(); - if (reason != BaseCastManager.DISCONNECT_REASON_EXPLICIT && - infoBeforeCastDisconnection.playerStatus == PlayerStatus.PLAYING) { - // If it's NOT based on user action, we shouldn't automatically resume local playback - infoBeforeCastDisconnection.playerStatus = PlayerStatus.PAUSED; - } - } - } - - @Override - public void onDisconnected() { - Log.d(TAG, "onDisconnected()"); - isCasting = false; - PlaybackServiceMediaPlayer.PSMPInfo info = infoBeforeCastDisconnection; - infoBeforeCastDisconnection = null; - if (info == null && mediaPlayer != null) { - info = mediaPlayer.getPSMPInfo(); - } - if (info == null) { - info = new PlaybackServiceMediaPlayer.PSMPInfo(PlayerStatus.STOPPED, null); - } - switchMediaPlayer(new LocalPSMP(PlaybackService.this, mediaPlayerCallback), - info, false); - if (info.playable != null) { - sendNotificationBroadcast(NOTIFICATION_TYPE_RELOAD, - info.playable.getMediaType() == MediaType.AUDIO ? EXTRA_CODE_AUDIO : EXTRA_CODE_VIDEO); - } else { - Log.d(TAG, "Cast session disconnected, but no current media"); - sendNotificationBroadcast(NOTIFICATION_TYPE_PLAYBACK_END, 0); - } - mMediaRouter.setMediaSessionCompat(null); - unregisterWifiBroadcastReceiver(); - } - }; - private void onCastAppConnected(boolean wasLaunched) { Log.d(TAG, "A cast device application was " + (wasLaunched ? "launched" : "joined")); isCasting = true; @@ -1638,7 +1638,7 @@ public class PlaybackService extends Service { wasLaunched); sendNotificationBroadcast(NOTIFICATION_TYPE_RELOAD, EXTRA_CODE_CAST); // hardware volume buttons control the remote device volume - mMediaRouter.setMediaSessionCompat(mediaSession); + mediaRouter.setMediaSessionCompat(mediaSession); registerWifiBroadcastReceiver(); } @@ -1668,34 +1668,34 @@ public class PlaybackService extends Service { } private void registerWifiBroadcastReceiver() { - if (mWifiBroadcastReceiver != null) { + if (wifiBroadcastReceiver != null) { return; } - mWifiBroadcastReceiver = new BroadcastReceiver() { + wifiBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); boolean isConnected = info.isConnected(); //apparently this method gets called twice when a change happens, but one run is enough. - if (isConnected && !mWifiConnectivity) { - mWifiConnectivity = true; - mCastMgr.startCastDiscovery(); - mCastMgr.reconnectSessionIfPossible(RECONNECTION_ATTEMPT_PERIOD_S, NetworkUtils.getWifiSsid()); + if (isConnected && !wifiConnectivity) { + wifiConnectivity = true; + castManager.startCastDiscovery(); + castManager.reconnectSessionIfPossible(RECONNECTION_ATTEMPT_PERIOD_S, NetworkUtils.getWifiSsid()); } else { - mWifiConnectivity = isConnected; + wifiConnectivity = isConnected; } } } }; - registerReceiver(mWifiBroadcastReceiver, + registerReceiver(wifiBroadcastReceiver, new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION)); } private void unregisterWifiBroadcastReceiver() { - if (mWifiBroadcastReceiver != null) { - unregisterReceiver(mWifiBroadcastReceiver); - mWifiBroadcastReceiver = null; + if (wifiBroadcastReceiver != null) { + unregisterReceiver(wifiBroadcastReceiver); + wifiBroadcastReceiver = null; } } @@ -1703,9 +1703,9 @@ public class PlaybackService extends Service { (sharedPreferences, key) -> { if (UserPreferences.PREF_CAST_ENABLED.equals(key)) { if (!UserPreferences.isCastEnabled()) { - if (mCastMgr.isConnecting() || mCastMgr.isConnected()) { + if (castManager.isConnecting() || castManager.isConnected()) { Log.d(TAG, "Disconnecting cast device due to a change in user preferences"); - mCastMgr.disconnect(); + castManager.disconnect(); } } } else if (UserPreferences.PREF_LOCKSCREEN_BACKGROUND.equals(key)) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/RemotePSMP.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/RemotePSMP.java index 645f0fe2d..2a9df4a75 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/RemotePSMP.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/RemotePSMP.java @@ -20,7 +20,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import de.danoeh.antennapod.core.cast.CastConsumer; -import de.danoeh.antennapod.core.cast.CastConsumerImpl; +import de.danoeh.antennapod.core.cast.DefaultCastConsumer; import de.danoeh.antennapod.core.cast.CastManager; import de.danoeh.antennapod.core.cast.RemoteMedia; import de.danoeh.antennapod.core.feed.FeedMedia; @@ -47,11 +47,6 @@ public class RemotePSMP extends PlaybackServiceMediaPlayer { private final AtomicBoolean startWhenPrepared; - /** - * Some asynchronous calls might change the state of the MediaPlayer object. Therefore calls in other threads - * have to wait until these operations have finished. - */ - //private final ReentrantLock playerLock; private final ThreadPoolExecutor executor; public RemotePSMP(@NonNull Context context, @NonNull PSMPCallback callback) { @@ -63,7 +58,6 @@ public class RemotePSMP extends PlaybackServiceMediaPlayer { startWhenPrepared = new AtomicBoolean(false); isBuffering = new AtomicBoolean(false); - //playerLock = new ReentrantLock(); executor = new ThreadPoolExecutor(1, 1, 5, TimeUnit.MINUTES, new LinkedBlockingDeque<>(), (r, executor) -> Log.d(TAG, "Rejected execution of runnable")); @@ -82,7 +76,7 @@ public class RemotePSMP extends PlaybackServiceMediaPlayer { //TODO } - private CastConsumer castConsumer = new CastConsumerImpl() { + private CastConsumer castConsumer = new DefaultCastConsumer() { @Override public void onRemoteMediaPlayerMetadataUpdated() { RemotePSMP.this.onRemoteMediaPlayerStatusUpdated(callback::endPlayback); @@ -432,7 +426,6 @@ public class RemotePSMP extends PlaybackServiceMediaPlayer { return 1; } - //TODO make device volume being selected by the hardware keys @Override public void setVolume(float volumeLeft, float volumeRight) { Log.d(TAG, "Setting the Stream volume on Remote Media Player"); |