diff options
Diffstat (limited to 'src/de/danoeh/antennapod/adapter')
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); } } |