summaryrefslogtreecommitdiff
path: root/src/de/danoeh/antennapod/adapter
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/danoeh/antennapod/adapter')
-rw-r--r--src/de/danoeh/antennapod/adapter/ActionButtonUtils.java63
-rw-r--r--src/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java45
-rw-r--r--src/de/danoeh/antennapod/adapter/InternalFeedItemlistAdapter.java74
-rw-r--r--src/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java35
-rw-r--r--src/de/danoeh/antennapod/adapter/QueueListAdapter.java37
5 files changed, 157 insertions, 97 deletions
diff --git a/src/de/danoeh/antennapod/adapter/ActionButtonUtils.java b/src/de/danoeh/antennapod/adapter/ActionButtonUtils.java
new file mode 100644
index 000000000..78d62a8de
--- /dev/null
+++ b/src/de/danoeh/antennapod/adapter/ActionButtonUtils.java
@@ -0,0 +1,63 @@
+package de.danoeh.antennapod.adapter;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.view.View;
+import android.widget.ImageButton;
+import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.feed.FeedItem;
+import de.danoeh.antennapod.feed.FeedMedia;
+import de.danoeh.antennapod.storage.DownloadRequester;
+
+/**
+ * Utility methods for the action button that is displayed on the right hand side
+ * of a listitem.
+ */
+public class ActionButtonUtils {
+
+ private final int[] labels;
+ private final TypedArray drawables;
+ private final Context context;
+
+ public ActionButtonUtils(Context context) {
+ if (context == null) throw new IllegalArgumentException("context = null");
+ this.context = context;
+ drawables = context.obtainStyledAttributes(new int[]{
+ R.attr.av_play, R.attr.navigation_cancel, R.attr.av_download});
+ labels = new int[]{R.string.play_label, R.string.cancel_download_label, R.string.download_label};
+ }
+
+ /**
+ * Sets the displayed bitmap and content description of the given
+ * action button so that it matches the state of the FeedItem.
+ */
+ public void configureActionButton(ImageButton butSecondary, FeedItem item) {
+ if (butSecondary == null || item == null) throw new IllegalArgumentException("butSecondary or item was null");
+ final FeedMedia media = item.getMedia();
+ if (media != null) {
+ final boolean isDownloadingMedia = DownloadRequester.getInstance().isDownloadingFile(media);
+ if (!media.isDownloaded()) {
+ if (isDownloadingMedia) {
+ // item is being downloaded
+ butSecondary.setVisibility(View.VISIBLE);
+ butSecondary.setImageDrawable(drawables
+ .getDrawable(1));
+ butSecondary.setContentDescription(context.getString(labels[1]));
+ } else {
+ // item is not downloaded and not being downloaded
+ butSecondary.setVisibility(View.VISIBLE);
+ butSecondary.setImageDrawable(drawables.getDrawable(2));
+ butSecondary.setContentDescription(context.getString(labels[2]));
+ }
+ } else {
+ // item is not being downloaded
+ butSecondary.setVisibility(View.VISIBLE);
+ butSecondary
+ .setImageDrawable(drawables.getDrawable(0));
+ butSecondary.setContentDescription(context.getString(labels[0]));
+ }
+ } else {
+ butSecondary.setVisibility(View.INVISIBLE);
+ }
+ }
+}
diff --git a/src/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java b/src/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java
new file mode 100644
index 000000000..7c023d2c2
--- /dev/null
+++ b/src/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java
@@ -0,0 +1,45 @@
+package de.danoeh.antennapod.adapter;
+
+import android.content.Context;
+import android.widget.Toast;
+import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.dialog.DownloadRequestErrorDialogCreator;
+import de.danoeh.antennapod.feed.FeedItem;
+import de.danoeh.antennapod.feed.FeedMedia;
+import de.danoeh.antennapod.storage.DBTasks;
+import de.danoeh.antennapod.storage.DownloadRequestException;
+import de.danoeh.antennapod.storage.DownloadRequester;
+
+/**
+ * Default implementation of an ActionButtonCallback
+ */
+public class DefaultActionButtonCallback implements ActionButtonCallback {
+ private static final String TAG = "DefaultActionButtonCallback";
+
+ private final Context context;
+
+ public DefaultActionButtonCallback(Context context) {
+ if (context == null) throw new IllegalArgumentException("context = null");
+ this.context = context;
+ }
+
+ @Override
+ public void onActionButtonPressed(final FeedItem item) {
+ final FeedMedia media = item.getMedia();
+ boolean isDownloading = DownloadRequester.getInstance().isDownloadingFile(media);
+ if (!isDownloading && !media.isDownloaded()) {
+ try {
+ DBTasks.downloadFeedItems(context, item);
+ Toast.makeText(context, R.string.status_downloading_label, Toast.LENGTH_SHORT).show();
+ } catch (DownloadRequestException e) {
+ e.printStackTrace();
+ DownloadRequestErrorDialogCreator.newRequestErrorDialog(context, e.getMessage());
+ }
+ } else if (isDownloading) {
+ DownloadRequester.getInstance().cancelDownload(context, media);
+ Toast.makeText(context, R.string.download_cancelled_msg, Toast.LENGTH_SHORT).show();
+ } else { // media is downloaded
+ DBTasks.playMedia(context, media, true, true, false);
+ }
+ }
+}
diff --git a/src/de/danoeh/antennapod/adapter/InternalFeedItemlistAdapter.java b/src/de/danoeh/antennapod/adapter/InternalFeedItemlistAdapter.java
index 4681284f5..356d75d99 100644
--- a/src/de/danoeh/antennapod/adapter/InternalFeedItemlistAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/InternalFeedItemlistAdapter.java
@@ -12,6 +12,7 @@ import de.danoeh.antennapod.R;
import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.feed.FeedMedia;
import de.danoeh.antennapod.feed.MediaType;
+import de.danoeh.antennapod.service.playback.PlayerStatus;
import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.util.Converter;
import de.danoeh.antennapod.util.ThemeUtils;
@@ -22,6 +23,7 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
private ActionButtonCallback callback;
private boolean showFeedtitle;
private int selectedItemIndex;
+ private final ActionButtonUtils actionButtonUtils;
public static final int SELECTION_NONE = -1;
@@ -32,6 +34,7 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
this.callback = callback;
this.showFeedtitle = showFeedtitle;
this.selectedItemIndex = SELECTION_NONE;
+ this.actionButtonUtils = new ActionButtonUtils(context);
}
@Override
@@ -49,20 +52,12 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
holder.lenSize = (TextView) convertView
.findViewById(R.id.txtvLenSize);
holder.butAction = (ImageButton) convertView
- .findViewById(R.id.butAction);
+ .findViewById(R.id.butSecondaryAction);
holder.published = (TextView) convertView
.findViewById(R.id.txtvPublished);
holder.inPlaylist = (ImageView) convertView
.findViewById(R.id.imgvInPlaylist);
- holder.downloaded = (ImageView) convertView
- .findViewById(R.id.imgvDownloaded);
holder.type = (ImageView) convertView.findViewById(R.id.imgvType);
- holder.downloading = (ImageView) convertView
- .findViewById(R.id.imgvDownloading);
- if (showFeedtitle) {
- holder.feedtitle = (TextView) convertView
- .findViewById(R.id.txtvFeedname);
- }
holder.statusPlaying = (View) convertView
.findViewById(R.id.statusPlaying);
holder.statusUnread = (View) convertView
@@ -83,11 +78,13 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
convertView.setBackgroundResource(0);
}
- holder.title.setText(item.getTitle());
- if (showFeedtitle) {
- holder.feedtitle.setVisibility(View.VISIBLE);
- holder.feedtitle.setText(item.getFeed().getTitle());
- }
+ StringBuilder buffer = new StringBuilder(item.getTitle());
+ if (showFeedtitle) {
+ buffer.append("(");
+ buffer.append(item.getFeed().getTitle());
+ buffer.append(")");
+ }
+ holder.title.setText(buffer.toString());
FeedItem.State state = item.getState();
switch (state) {
@@ -104,12 +101,10 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
case NEW:
holder.statusPlaying.setVisibility(View.GONE);
holder.statusUnread.setVisibility(View.VISIBLE);
- holder.episodeProgress.setVisibility(View.GONE);
break;
default:
holder.statusPlaying.setVisibility(View.GONE);
holder.statusUnread.setVisibility(View.GONE);
- holder.episodeProgress.setVisibility(View.GONE);
break;
}
@@ -121,11 +116,10 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
FeedMedia media = item.getMedia();
if (media == null) {
- holder.downloaded.setVisibility(View.GONE);
- holder.downloading.setVisibility(View.GONE);
- holder.inPlaylist.setVisibility(View.GONE);
- holder.type.setVisibility(View.GONE);
- holder.lenSize.setVisibility(View.GONE);
+ holder.episodeProgress.setVisibility(View.GONE);
+ holder.inPlaylist.setVisibility(View.INVISIBLE);
+ holder.type.setVisibility(View.INVISIBLE);
+ holder.lenSize.setVisibility(View.INVISIBLE);
} else {
if (state == FeedItem.State.PLAYING
@@ -153,19 +147,16 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
if (((ItemAccess) itemAccess).isInQueue(item)) {
holder.inPlaylist.setVisibility(View.VISIBLE);
} else {
- holder.inPlaylist.setVisibility(View.GONE);
- }
- if (item.getMedia().isDownloaded()) {
- holder.downloaded.setVisibility(View.VISIBLE);
- } else {
- holder.downloaded.setVisibility(View.GONE);
+ holder.inPlaylist.setVisibility(View.INVISIBLE);
}
if (DownloadRequester.getInstance().isDownloadingFile(
item.getMedia())) {
- holder.downloading.setVisibility(View.VISIBLE);
- } else {
- holder.downloading.setVisibility(View.GONE);
+ holder.episodeProgress.setVisibility(View.VISIBLE);
+ holder.episodeProgress.setProgress(((ItemAccess) itemAccess).getItemDownloadProgressPercent(item));
+ } else if (!(state == FeedItem.State.IN_PROGRESS
+ || state == FeedItem.State.PLAYING)) {
+ holder.episodeProgress.setVisibility(View.GONE);
}
TypedArray typeDrawables = getContext().obtainStyledAttributes(
@@ -187,14 +178,10 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
}
}
+ actionButtonUtils.configureActionButton(holder.butAction, item);
holder.butAction.setFocusable(false);
- holder.butAction.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- callback.onActionButtonPressed(item);
- }
- });
+ holder.butAction.setTag(item);
+ holder.butAction.setOnClickListener(butActionListener);
} else {
convertView.setVisibility(View.GONE);
@@ -203,11 +190,16 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
}
+ private final OnClickListener butActionListener = new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ FeedItem item = (FeedItem) v.getTag();
+ callback.onActionButtonPressed(item);
+ }
+ };
+
static class Holder extends DefaultFeedItemlistAdapter.Holder {
- TextView feedtitle;
ImageView inPlaylist;
- ImageView downloaded;
- ImageView downloading;
ImageButton butAction;
View statusUnread;
View statusPlaying;
@@ -225,6 +217,8 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
public static interface ItemAccess extends DefaultFeedItemlistAdapter.ItemAccess {
public boolean isInQueue(FeedItem item);
+
+ int getItemDownloadProgressPercent(FeedItem item);
}
}
diff --git a/src/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java b/src/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java
index 4d4a2494e..d13314b0b 100644
--- a/src/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java
@@ -24,16 +24,15 @@ public class NewEpisodesListAdapter extends BaseAdapter {
private final Context context;
private final ItemAccess itemAccess;
- private final TypedArray drawables;
- private final int[] labels;
+ private final ActionButtonCallback actionButtonCallback;
+ private final ActionButtonUtils actionButtonUtils;
- public NewEpisodesListAdapter(Context context, ItemAccess itemAccess) {
+ public NewEpisodesListAdapter(Context context, ItemAccess itemAccess, ActionButtonCallback actionButtonCallback) {
super();
this.context = context;
this.itemAccess = itemAccess;
- drawables = context.obtainStyledAttributes(new int[]{
- R.attr.av_play, R.attr.navigation_cancel, R.attr.av_download});
- labels = new int[]{R.string.play_label, R.string.cancel_download_label, R.string.download_label};
+ this.actionButtonUtils = new ActionButtonUtils(context);
+ this.actionButtonCallback = actionButtonCallback;
}
@Override
@@ -156,35 +155,17 @@ public class NewEpisodesListAdapter extends BaseAdapter {
if (!media.isDownloaded()) {
if (isDownloadingMedia) {
// item is being downloaded
- holder.butSecondary.setVisibility(View.VISIBLE);
- holder.butSecondary.setImageDrawable(drawables
- .getDrawable(1));
- holder.butSecondary.setContentDescription(context.getString(labels[1]));
-
holder.downloadProgress.setProgress(itemAccess.getItemDownloadProgressPercent(item));
- } else {
- // item is not downloaded and not being downloaded
- holder.butSecondary.setVisibility(View.VISIBLE);
- holder.butSecondary.setImageDrawable(drawables.getDrawable(2));
- holder.butSecondary.setContentDescription(context.getString(labels[2]));
}
- } else {
- // item is not being downloaded
- holder.butSecondary.setVisibility(View.VISIBLE);
- holder.butSecondary
- .setImageDrawable(drawables.getDrawable(0));
- holder.butSecondary.setContentDescription(context.getString(labels[0]));
}
- } else {
- holder.butSecondary.setVisibility(View.INVISIBLE);
}
-
if (itemAccess.isInQueue(item)) {
holder.queueStatus.setVisibility(View.VISIBLE);
} else {
holder.queueStatus.setVisibility(View.INVISIBLE);
}
+ actionButtonUtils.configureActionButton(holder.butSecondary, item);
holder.butSecondary.setFocusable(false);
holder.butSecondary.setTag(item);
holder.butSecondary.setOnClickListener(secondaryActionListener);
@@ -204,7 +185,7 @@ public class NewEpisodesListAdapter extends BaseAdapter {
@Override
public void onClick(View v) {
FeedItem item = (FeedItem) v.getTag();
- itemAccess.onFeedItemSecondaryAction(item);
+ actionButtonCallback.onActionButtonPressed(item);
}
};
@@ -232,7 +213,5 @@ public class NewEpisodesListAdapter extends BaseAdapter {
int getItemDownloadProgressPercent(FeedItem item);
boolean isInQueue(FeedItem item);
-
- void onFeedItemSecondaryAction(FeedItem item);
}
}
diff --git a/src/de/danoeh/antennapod/adapter/QueueListAdapter.java b/src/de/danoeh/antennapod/adapter/QueueListAdapter.java
index ae53f6837..c671f4a5c 100644
--- a/src/de/danoeh/antennapod/adapter/QueueListAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/QueueListAdapter.java
@@ -1,7 +1,6 @@
package de.danoeh.antennapod.adapter;
import android.content.Context;
-import android.content.res.TypedArray;
import android.text.format.DateUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -22,16 +21,16 @@ public class QueueListAdapter extends BaseAdapter {
private final Context context;
private final ItemAccess itemAccess;
- private final TypedArray drawables;
- private final int[] labels;
+ private final ActionButtonCallback actionButtonCallback;
+ private final ActionButtonUtils actionButtonUtils;
- public QueueListAdapter(Context context, ItemAccess itemAccess) {
+ public QueueListAdapter(Context context, ItemAccess itemAccess, ActionButtonCallback actionButtonCallback) {
super();
this.context = context;
this.itemAccess = itemAccess;
- drawables = context.obtainStyledAttributes(new int[]{
- R.attr.av_play, R.attr.navigation_cancel, R.attr.av_download});
- labels = new int[]{R.string.play_label, R.string.cancel_download_label, R.string.download_label};
+ this.actionButtonUtils = new ActionButtonUtils(context);
+ this.actionButtonCallback = actionButtonCallback;
+
}
@Override
@@ -104,33 +103,15 @@ public class QueueListAdapter extends BaseAdapter {
holder.txtvDuration.setVisibility(View.VISIBLE);
holder.downloadProgress.setVisibility(View.GONE);
}
-
if (!media.isDownloaded()) {
if (isDownloadingMedia) {
// item is being downloaded
- holder.butSecondary.setVisibility(View.VISIBLE);
- holder.butSecondary.setImageDrawable(drawables
- .getDrawable(1));
- holder.butSecondary.setContentDescription(context.getString(labels[1]));
-
holder.downloadProgress.setProgress(itemAccess.getItemDownloadProgressPercent(item));
- } else {
- // item is not downloaded and not being downloaded
- holder.butSecondary.setVisibility(View.VISIBLE);
- holder.butSecondary.setImageDrawable(drawables.getDrawable(2));
- holder.butSecondary.setContentDescription(context.getString(labels[2]));
}
- } else {
- // item is not being downloaded
- holder.butSecondary.setVisibility(View.VISIBLE);
- holder.butSecondary
- .setImageDrawable(drawables.getDrawable(0));
- holder.butSecondary.setContentDescription(context.getString(labels[0]));
}
- } else {
- holder.butSecondary.setVisibility(View.INVISIBLE);
}
+ actionButtonUtils.configureActionButton(holder.butSecondary, item);
holder.butSecondary.setFocusable(false);
holder.butSecondary.setTag(item);
holder.butSecondary.setOnClickListener(secondaryActionListener);
@@ -149,7 +130,7 @@ public class QueueListAdapter extends BaseAdapter {
@Override
public void onClick(View v) {
FeedItem item = (FeedItem) v.getTag();
- itemAccess.onFeedItemSecondaryAction(item);
+ actionButtonCallback.onActionButtonPressed(item);
}
};
@@ -170,7 +151,5 @@ public class QueueListAdapter extends BaseAdapter {
FeedItem getItem(int position);
int getItemDownloadProgressPercent(FeedItem item);
-
- void onFeedItemSecondaryAction(FeedItem item);
}
}