From 71db0368c45ff6cb7b669982b68fdfefd8606352 Mon Sep 17 00:00:00 2001 From: volhol Date: Tue, 31 Mar 2015 01:33:04 +0200 Subject: Direct play from the the lists Pause/play buttons work; position in media item not always updated yet --- .../antennapod/adapter/ActionButtonUtils.java | 4 +- .../adapter/DefaultActionButtonCallback.java | 10 +++- .../antennapod/adapter/FeedItemlistAdapter.java | 2 - .../antennapod/adapter/NewEpisodesListAdapter.java | 1 - .../antennapod/adapter/QueueListAdapter.java | 1 - .../antennapod/fragment/ItemlistFragment.java | 3 ++ .../antennapod/fragment/NewEpisodesFragment.java | 3 ++ .../fragment/PlaybackHistoryFragment.java | 3 ++ .../danoeh/antennapod/fragment/QueueFragment.java | 3 ++ .../antennapod/core/feed/EventDistributor.java | 5 ++ .../de/danoeh/antennapod/core/feed/FeedMedia.java | 9 ++++ .../core/preferences/PlaybackPreferences.java | 17 ++++++ .../core/service/playback/PlaybackService.java | 61 ++++++++++++++++++++++ 13 files changed, 115 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonUtils.java b/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonUtils.java index 18b31d580..8d3e73429 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonUtils.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonUtils.java @@ -27,7 +27,7 @@ public class ActionButtonUtils { this.context = context; drawables = context.obtainStyledAttributes(new int[]{ - R.attr.av_play, R.attr.navigation_cancel, R.attr.av_download, R.attr.borderless_button, R.attr.navigation_accept}); + R.attr.av_play, R.attr.navigation_cancel, R.attr.av_download, R.attr.av_pause, R.attr.navigation_accept}); labels = new int[]{R.string.play_label, R.string.cancel_download_label, R.string.download_label, R.string.mark_read_label}; } @@ -57,7 +57,7 @@ public class ActionButtonUtils { } else { // item is not being downloaded butSecondary.setVisibility(View.VISIBLE); - if (media.isPlaying()) { + if (media.isCurrentlyPlaying()) { butSecondary.setImageDrawable(drawables.getDrawable(3)); } else { butSecondary diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java index ac39b818d..bae109cf9 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java @@ -1,6 +1,7 @@ package de.danoeh.antennapod.adapter; import android.content.Context; +import android.content.Intent; import android.widget.Toast; import org.apache.commons.lang3.Validate; @@ -9,6 +10,7 @@ import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.dialog.DownloadRequestErrorDialogCreator; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DownloadRequestException; @@ -46,7 +48,13 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { DownloadRequester.getInstance().cancelDownload(context, media); Toast.makeText(context, R.string.download_cancelled_msg, Toast.LENGTH_SHORT).show(); } else { // media is downloaded - if (item.getState() != FeedItem.State.PLAYING) { + if (item.hasMedia() && item.getMedia().isCurrentlyPlaying()) { + context.sendBroadcast(new Intent(PlaybackService.ACTION_PAUSE_PLAY_CURRENT_EPISODE)); + } + else if (item.hasMedia() && item.getMedia().isPlaying()) { + context.sendBroadcast(new Intent(PlaybackService.ACTION_RESUME_PLAY_CURRENT_EPISODE)); + } + else { DBTasks.playMedia(context, media, false, true, false); } } diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java index ba0eb4c29..d56bfc587 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java @@ -188,8 +188,6 @@ public class FeedItemlistAdapter extends BaseAdapter { public void onClick(View v) { FeedItem item = (FeedItem) v.getTag(); callback.onActionButtonPressed(item); - EventDistributor.getInstance().sendPlaybackHistoryUpdateBroadcast(); - EventDistributor.getInstance().sendUnreadItemsUpdateBroadcast(); } }; diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java index 10b1f8e79..7a05b9370 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java @@ -148,7 +148,6 @@ public class NewEpisodesListAdapter extends BaseAdapter { public void onClick(View v) { FeedItem item = (FeedItem) v.getTag(); actionButtonCallback.onActionButtonPressed(item); - EventDistributor.getInstance().sendUnreadItemsUpdateBroadcast(); } }; diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/QueueListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/QueueListAdapter.java index 34757149a..a256dc129 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/QueueListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/QueueListAdapter.java @@ -138,7 +138,6 @@ public class QueueListAdapter extends BaseAdapter { public void onClick(View v) { FeedItem item = (FeedItem) v.getTag(); actionButtonCallback.onActionButtonPressed(item); - EventDistributor.getInstance().sendQueueUpdateBroadcast(); } }; diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java index 5312beeeb..ff68d267d 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java @@ -296,6 +296,9 @@ public class ItemlistFragment extends ListFragment { updateProgressBarVisibility(); } } + if ((arg & EventDistributor.PLAYER_STATUS_UPDATE) != 0) { + adapter.notifyDataSetChanged(); + } } }; diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java index 24991144e..39b72f2e2 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java @@ -340,6 +340,9 @@ public class NewEpisodesFragment extends Fragment { getActivity().supportInvalidateOptionsMenu(); } } + if ((arg & EventDistributor.PLAYER_STATUS_UPDATE) != 0) { + listAdapter.notifyDataSetChanged(); + } } }; diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java index f6d2d5d07..96f9742a0 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java @@ -171,6 +171,9 @@ public class PlaybackHistoryFragment extends ListFragment { startItemLoader(); getActivity().supportInvalidateOptionsMenu(); } + if ((arg & EventDistributor.PLAYER_STATUS_UPDATE) != 0) { + adapter.notifyDataSetChanged(); + } } }; diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index da33c6ea3..b48b52514 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -477,6 +477,9 @@ public class QueueFragment extends Fragment { getActivity().supportInvalidateOptionsMenu(); } } + if ((arg & EventDistributor.PLAYER_STATUS_UPDATE) != 0) { + listAdapter.notifyDataSetChanged(); + } } }; diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java b/core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java index f8815dcf0..5a2cfa40e 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java @@ -31,6 +31,7 @@ public class EventDistributor extends Observable { public static final int PLAYBACK_HISTORY_UPDATE = 16; public static final int DOWNLOAD_QUEUED = 32; public static final int DOWNLOAD_HANDLED = 64; + public static final int PLAYER_STATUS_UPDATE = 128; private Handler handler; private AbstractQueue events; @@ -124,6 +125,10 @@ public class EventDistributor extends Observable { addEvent(DOWNLOAD_HANDLED); } + public void sendPlayerStatusUpdateBroadcast() { + addEvent(PLAYER_STATUS_UPDATE); + } + public static abstract class EventListener implements Observer { @Override diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java index 2434ee0cf..993578a7f 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java @@ -127,6 +127,15 @@ public class FeedMedia extends FeedFile implements Playable { && PlaybackPreferences.getCurrentlyPlayingFeedMediaId() == id; } + /** + * Reads playback preferences to determine whether this FeedMedia object is + * currently being played and the player status is playing. + */ + public boolean isCurrentlyPlaying() { + return isPlaying() && PlaybackPreferences.getPlayerStatusIsPlaying(); + } + + @Override public int getTypeAsInt() { return FEEDFILETYPE_FEEDMEDIA; diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/PlaybackPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/PlaybackPreferences.java index d88543f73..774a629ae 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/preferences/PlaybackPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/PlaybackPreferences.java @@ -8,6 +8,7 @@ import android.util.Log; import org.apache.commons.lang3.Validate; import de.danoeh.antennapod.core.BuildConfig; +import de.danoeh.antennapod.core.feed.EventDistributor; /** * Provides access to preferences set by the playback service. A private @@ -43,6 +44,9 @@ public class PlaybackPreferences implements /** True if last played media was a video. */ public static final String PREF_CURRENT_EPISODE_IS_VIDEO = "de.danoeh.antennapod.preferences.lastIsVideo"; + /** True if player status is playing. */ + public static final String PREF_PLAYER_STATUS_IS_PLAYING = "de.danoeh.antennapod.preferences.playerStatusIsPlaying"; + /** Value of PREF_CURRENTLY_PLAYING_MEDIA if no media is playing. */ public static final long NO_MEDIA_PLAYING = -1; @@ -51,6 +55,7 @@ public class PlaybackPreferences implements private long currentlyPlayingMedia; private boolean currentEpisodeIsStream; private boolean currentEpisodeIsVideo; + private boolean playerStatusIsPlaying; private static PlaybackPreferences instance; private Context context; @@ -87,6 +92,7 @@ public class PlaybackPreferences implements NO_MEDIA_PLAYING); currentEpisodeIsStream = sp.getBoolean(PREF_CURRENT_EPISODE_IS_STREAM, true); currentEpisodeIsVideo = sp.getBoolean(PREF_CURRENT_EPISODE_IS_VIDEO, false); + playerStatusIsPlaying = sp.getBoolean(PREF_PLAYER_STATUS_IS_PLAYING, false); } @Override @@ -109,6 +115,11 @@ public class PlaybackPreferences implements currentlyPlayingFeedMediaId = sp.getLong( PREF_CURRENTLY_PLAYING_FEEDMEDIA_ID, NO_MEDIA_PLAYING); } + else if (key.equals(PREF_PLAYER_STATUS_IS_PLAYING)) { + playerStatusIsPlaying = sp.getBoolean( + PREF_PLAYER_STATUS_IS_PLAYING, false); + EventDistributor.getInstance().sendPlayerStatusUpdateBroadcast(); + } } private static void instanceAvailable() { @@ -143,4 +154,10 @@ public class PlaybackPreferences implements return instance.currentEpisodeIsVideo; } + public static boolean getPlayerStatusIsPlaying() { + instanceAvailable(); + return instance.playerStatusIsPlaying; + } + + } 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 aabbcc185..a1aa176ae 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 @@ -100,6 +100,18 @@ public class PlaybackService extends Service { */ public static final String ACTION_SKIP_CURRENT_EPISODE = "action.de.danoeh.antennapod.core.service.skipCurrentEpisode"; + /** + * If the PlaybackService receives this action, it will pause playback. + */ + public static final String ACTION_PAUSE_PLAY_CURRENT_EPISODE = "action.de.danoeh.antennapod.core.service.pausePlayCurrentEpisode"; + + + /** + * If the PlaybackService receives this action, it will resume playback. + */ + public static final String ACTION_RESUME_PLAY_CURRENT_EPISODE = "action.de.danoeh.antennapod.core.service.resumePlayCurrentEpisode"; + + /** * Used in NOTIFICATION_TYPE_RELOAD. */ @@ -216,6 +228,10 @@ public class PlaybackService extends Service { AudioManager.ACTION_AUDIO_BECOMING_NOISY)); registerReceiver(skipCurrentEpisodeReceiver, new IntentFilter( ACTION_SKIP_CURRENT_EPISODE)); + registerReceiver(pausePlayCurrentEpisodeReceiver, new IntentFilter( + ACTION_PAUSE_PLAY_CURRENT_EPISODE)); + registerReceiver(pauseResumeCurrentEpisodeReceiver, new IntentFilter( + ACTION_RESUME_PLAY_CURRENT_EPISODE)); remoteControlClient = setupRemoteControlClient(); taskManager = new PlaybackServiceTaskManager(this, taskManagerCallback); mediaPlayer = new PlaybackServiceMediaPlayer(this, mediaPlayerCallback); @@ -427,6 +443,7 @@ public class PlaybackService extends Service { // remove notifcation on pause stopForeground(true); } + writePlayerStatusPlaybackPreferences(); break; @@ -443,9 +460,11 @@ public class PlaybackService extends Service { taskManager.startPositionSaver(); taskManager.startWidgetUpdater(); + writePlayerStatusPlaybackPreferences(); setupNotification(newInfo); started = true; break; + case ERROR: writePlaybackPreferencesNoMediaPlaying(); break; @@ -634,6 +653,8 @@ public class PlaybackService extends Service { editor.putLong( PlaybackPreferences.PREF_CURRENTLY_PLAYING_FEEDMEDIA_ID, PlaybackPreferences.NO_MEDIA_PLAYING); + editor.putBoolean( + PlaybackPreferences.PREF_PLAYER_STATUS_IS_PLAYING, false); editor.commit(); } @@ -647,6 +668,7 @@ public class PlaybackService extends Service { PlaybackServiceMediaPlayer.PSMPInfo info = mediaPlayer.getPSMPInfo(); MediaType mediaType = mediaPlayer.getCurrentMediaType(); boolean stream = mediaPlayer.isStreaming(); + boolean isPlaying = (info.playerStatus == PlayerStatus.PLAYING); if (info.playable != null) { editor.putLong(PlaybackPreferences.PREF_CURRENTLY_PLAYING_MEDIA, @@ -683,6 +705,23 @@ public class PlaybackService extends Service { PlaybackPreferences.PREF_CURRENTLY_PLAYING_FEEDMEDIA_ID, PlaybackPreferences.NO_MEDIA_PLAYING); } + editor.putBoolean( + PlaybackPreferences.PREF_PLAYER_STATUS_IS_PLAYING, isPlaying); + + editor.commit(); + } + + private void writePlayerStatusPlaybackPreferences() { + if (BuildConfig.DEBUG) + Log.d(TAG, "Writing player status playback preferences"); + + SharedPreferences.Editor editor = PreferenceManager + .getDefaultSharedPreferences(getApplicationContext()).edit(); + PlaybackServiceMediaPlayer.PSMPInfo info = mediaPlayer.getPSMPInfo(); + boolean isPlaying = (info.playerStatus == PlayerStatus.PLAYING); + + editor.putBoolean( + PlaybackPreferences.PREF_PLAYER_STATUS_IS_PLAYING, isPlaying); editor.commit(); } @@ -1101,6 +1140,28 @@ public class PlaybackService extends Service { } }; + private BroadcastReceiver pauseResumeCurrentEpisodeReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (StringUtils.equals(intent.getAction(), ACTION_RESUME_PLAY_CURRENT_EPISODE)) { + if (BuildConfig.DEBUG) + Log.d(TAG, "Received RESUME_PLAY_CURRENT_EPISODE intent"); + mediaPlayer.resume(); + } + } + }; + + private BroadcastReceiver pausePlayCurrentEpisodeReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (StringUtils.equals(intent.getAction(), ACTION_PAUSE_PLAY_CURRENT_EPISODE)) { + if (BuildConfig.DEBUG) + Log.d(TAG, "Received PAUSE_PLAY_CURRENT_EPISODE intent"); + mediaPlayer.pause(false, false); + } + } + }; + public static MediaType getCurrentMediaType() { return currentMediaType; } -- cgit v1.2.3