summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvolhol <volhol@users.noreply.github.com>2015-03-31 01:33:04 +0200
committervolhol <volhol@users.noreply.github.com>2015-03-31 01:33:04 +0200
commit71db0368c45ff6cb7b669982b68fdfefd8606352 (patch)
tree901f51e05aa6b20db7ee45c644ab35da1d1ec791
parentaf7b947368ce4c23cba3000bb32fcb6d8430f8b4 (diff)
downloadAntennaPod-71db0368c45ff6cb7b669982b68fdfefd8606352.zip
Direct play from the the lists
Pause/play buttons work; position in media item not always updated yet
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonUtils.java4
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java1
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/QueueListAdapter.java1
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java3
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java3
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java3
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java5
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java9
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/PlaybackPreferences.java17
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java61
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<Integer> 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
@@ -101,6 +101,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.
*/
public static final int EXTRA_CODE_AUDIO = 1;
@@ -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;
}