diff options
9 files changed, 100 insertions, 57 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java index 47eab7d05..e5bb04391 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java @@ -41,7 +41,9 @@ public abstract class ItemActionButton { } final boolean isDownloadingMedia = DownloadRequester.getInstance().isDownloadingFile(media); - if (media.isDownloaded()) { + if (media.isCurrentlyPlaying()) { + return new PauseActionButton(item); + } else if (media.isDownloaded()) { return new PlayActionButton(item); } else if (isDownloadingMedia) { return new CancelDownloadActionButton(item); diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PauseActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PauseActionButton.java new file mode 100644 index 000000000..b839f7788 --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PauseActionButton.java @@ -0,0 +1,42 @@ +package de.danoeh.antennapod.adapter.actionbutton; + +import android.content.Context; +import androidx.annotation.AttrRes; +import androidx.annotation.StringRes; +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.util.IntentUtils; + +import static de.danoeh.antennapod.core.service.playback.PlaybackService.ACTION_PAUSE_PLAY_CURRENT_EPISODE; + +class PauseActionButton extends ItemActionButton { + + PauseActionButton(FeedItem item) { + super(item); + } + + @Override + @StringRes + public int getLabel() { + return R.string.pause_label; + } + + @Override + @AttrRes + public int getDrawable() { + return R.attr.av_pause; + } + + @Override + public void onClick(Context context) { + FeedMedia media = item.getMedia(); + if (media == null) { + return; + } + + if (media.isCurrentlyPlaying()) { + IntentUtils.sendLocalBroadcast(context, ACTION_PAUSE_PLAY_CURRENT_EPISODE); + } + } +} diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayActionButton.java index 0d314b5eb..3432f1deb 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayActionButton.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/PlayActionButton.java @@ -3,16 +3,11 @@ package de.danoeh.antennapod.adapter.actionbutton; import android.content.Context; import androidx.annotation.AttrRes; import androidx.annotation.StringRes; - import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; -import de.danoeh.antennapod.core.storage.DBTasks; -import de.danoeh.antennapod.core.util.IntentUtils; import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter; -import static de.danoeh.antennapod.core.service.playback.PlaybackService.ACTION_PAUSE_PLAY_CURRENT_EPISODE; - class PlayActionButton extends ItemActionButton { PlayActionButton(FeedItem item) { @@ -28,12 +23,7 @@ class PlayActionButton extends ItemActionButton { @Override @AttrRes public int getDrawable() { - FeedMedia media = item.getMedia(); - if (media != null && media.isCurrentlyPlaying()) { - return R.attr.av_pause; - } else { - return R.attr.av_play; - } + return R.attr.av_play; } @Override @@ -43,22 +33,10 @@ class PlayActionButton extends ItemActionButton { return; } - if (media.isPlaying()) { - togglePlayPause(context, media); - } else { - DBTasks.playMedia(context, media, false, true, false); - } - } - - private void togglePlayPause(Context context, FeedMedia media) { - if (media.isCurrentlyPlaying()) { - IntentUtils.sendLocalBroadcast(context, ACTION_PAUSE_PLAY_CURRENT_EPISODE); - } else { - new PlaybackServiceStarter(context, media) - .callEvenIfRunning(true) - .startWhenPrepared(true) - .shouldStream(false) - .start(); - } + new PlaybackServiceStarter(context, media) + .callEvenIfRunning(true) + .startWhenPrepared(true) + .shouldStream(false) + .start(); } } diff --git a/app/src/main/java/de/danoeh/antennapod/view/viewholder/EpisodeItemViewHolder.java b/app/src/main/java/de/danoeh/antennapod/view/viewholder/EpisodeItemViewHolder.java index 369574190..f9c02524e 100644 --- a/app/src/main/java/de/danoeh/antennapod/view/viewholder/EpisodeItemViewHolder.java +++ b/app/src/main/java/de/danoeh/antennapod/view/viewholder/EpisodeItemViewHolder.java @@ -119,6 +119,10 @@ public class EpisodeItemViewHolder extends FeedComponentViewHolder bind(item.getMedia()); } else { secondaryActionProgress.setPercentage(0, item); + isVideo.setVisibility(View.GONE); + progressBar.setVisibility(View.GONE); + duration.setVisibility(View.GONE); + position.setVisibility(View.GONE); } if (coverHolder.getVisibility() == View.VISIBLE) { @@ -133,6 +137,7 @@ public class EpisodeItemViewHolder extends FeedComponentViewHolder private void bind(FeedMedia media) { isVideo.setVisibility(media.getMediaType() == MediaType.VIDEO ? View.VISIBLE : View.GONE); + duration.setVisibility(media.getDuration() > 0 ? View.VISIBLE : View.GONE); duration.setText(Converter.getDurationStringLong(media.getDuration())); if (media.isCurrentlyPlaying()) { @@ -151,12 +156,10 @@ public class EpisodeItemViewHolder extends FeedComponentViewHolder secondaryActionProgress.setPercentage(0, item); // Animate X% -> 0% } - if (media.getDuration() > 0 - && (item.getState() == FeedItem.State.PLAYING || item.getState() == FeedItem.State.IN_PROGRESS)) { + if (item.getState() == FeedItem.State.PLAYING || item.getState() == FeedItem.State.IN_PROGRESS) { int progress = (int) (100.0 * media.getPosition() / media.getDuration()); progressBar.setProgress(progress); position.setText(Converter.getDurationStringLong(media.getPosition())); - duration.setText(Converter.getDurationStringLong(media.getDuration())); progressBar.setVisibility(View.VISIBLE); position.setVisibility(View.VISIBLE); } else { diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 1ca3a8088..ef7b9357f 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -51,7 +51,7 @@ android:icon="?attr/ic_questionmark" /> <Preference android:key="prefViewMailingList" - android:title="@string/view_mailing_list" + android:title="@string/visit_user_forum" android:icon="?attr/ic_chat" /> <Preference android:key="prefSendBugReport" diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java index 8f7e84561..19ef3d36f 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java @@ -39,6 +39,7 @@ import java.util.concurrent.TimeUnit; public class ExoPlayerWrapper implements IPlayer { private static final String TAG = "ExoPlayerWrapper"; + public static final int ERROR_CODE_OFFSET = 1000; private final Context mContext; private final Disposable bufferingUpdateDisposable; private SimpleExoPlayer mExoPlayer; @@ -109,7 +110,7 @@ public class ExoPlayerWrapper implements IPlayer { @Override public void onPlayerError(ExoPlaybackException error) { if (audioErrorListener != null) { - audioErrorListener.onError(null, 0, 0); + audioErrorListener.onError(null, error.type + ERROR_CODE_OFFSET, 0); } } 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 bf59b0ffd..0ec325e85 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 @@ -643,7 +643,18 @@ public class PlaybackService extends MediaBrowserServiceCompat { private void startPlayingFromPreferences() { Playable playable = Playable.PlayableUtils.createInstanceFromPreferences(getApplicationContext()); if (playable != null) { - mediaPlayer.playMediaObject(playable, false, true, true); + if (PlaybackPreferences.getCurrentEpisodeIsStream() && !NetworkUtils.isStreamingAllowed()) { + displayStreamingNotAllowedNotification( + new PlaybackServiceStarter(this, playable) + .prepareImmediately(true) + .startWhenPrepared(true) + .shouldStream(true) + .getIntent()); + PlaybackPreferences.writeNoMediaPlaying(); + stateManager.stopService(); + return; + } + mediaPlayer.playMediaObject(playable, PlaybackPreferences.getCurrentEpisodeIsStream(), true, true); stateManager.validStartCommandWasReceived(); PlaybackService.this.updateMediaSessionMetadata(playable); } else { diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/MediaPlayerError.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/MediaPlayerError.java index 32d37a67e..8ca8bbf6c 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/MediaPlayerError.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/MediaPlayerError.java @@ -2,30 +2,35 @@ package de.danoeh.antennapod.core.util.playback; import android.content.Context; import android.media.MediaPlayer; - +import com.google.android.exoplayer2.ExoPlaybackException; import de.danoeh.antennapod.core.R; +import de.danoeh.antennapod.core.service.playback.ExoPlayerWrapper; /** Utility class for MediaPlayer errors. */ public class MediaPlayerError { - private MediaPlayerError(){} + private MediaPlayerError(){} - /** Get a human-readable string for a specific error code. */ - public static String getErrorString(Context context, int code) { - int resId; - switch(code) { - case MediaPlayer.MEDIA_ERROR_SERVER_DIED: - resId = R.string.playback_error_server_died; - break; - case MediaPlayer.MEDIA_ERROR_UNSUPPORTED: - resId = R.string.playback_error_unsupported; - break; - case MediaPlayer.MEDIA_ERROR_TIMED_OUT: - resId = R.string.playback_error_timeout; - break; - default: - resId = R.string.playback_error_unknown; - break; - } - return context.getString(resId) + " (" + code + ")"; - } + /** Get a human-readable string for a specific error code. */ + public static String getErrorString(Context context, int code) { + int resId; + switch (code) { + case MediaPlayer.MEDIA_ERROR_SERVER_DIED: + resId = R.string.playback_error_server_died; + break; + case MediaPlayer.MEDIA_ERROR_UNSUPPORTED: // fall-through + case ExoPlayerWrapper.ERROR_CODE_OFFSET + ExoPlaybackException.TYPE_RENDERER: + resId = R.string.playback_error_unsupported; + break; + case MediaPlayer.MEDIA_ERROR_TIMED_OUT: + resId = R.string.playback_error_timeout; + break; + case ExoPlayerWrapper.ERROR_CODE_OFFSET + ExoPlaybackException.TYPE_SOURCE: + resId = R.string.playback_error_source; + break; + default: + resId = R.string.playback_error_unknown; + break; + } + return context.getString(resId) + " (" + code + ")"; + } } diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index a97ce1339..1be8029d7 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -283,6 +283,7 @@ <string name="playback_error_server_died">Server died</string> <string name="playback_error_unsupported">Unsupported media type</string> <string name="playback_error_timeout">Operation timed out</string> + <string name="playback_error_source">Unable to access media file</string> <string name="playback_error_unknown">Unknown Error</string> <string name="no_media_playing_label">No media playing</string> <string name="position_default_label" translate="false">00:00:00</string> @@ -486,7 +487,7 @@ <string name="pref_smart_mark_as_played_disabled">Disabled</string> <string name="pref_image_cache_size_title">Image Cache Size</string> <string name="pref_image_cache_size_sum">Size of the disk cache for images.</string> - <string name="view_mailing_list">View mailing list</string> + <string name="visit_user_forum">Visit user forum</string> <string name="bug_report_title">Report bug</string> <string name="open_bug_tracker">Open bug tracker</string> <string name="export_logs">Export logs</string> |