diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java index 4d66fd486..9206cebea 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java @@ -26,171 +26,139 @@ import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DownloadRequestException; import de.danoeh.antennapod.core.storage.DownloadRequester; +import de.danoeh.antennapod.core.util.ThemeUtils; +import de.danoeh.antennapod.view.viewholder.DownloadItemViewHolder; +import de.danoeh.antennapod.view.viewholder.FeedViewHolder; -/** Displays a list of DownloadStatus entries. */ +/** + * Displays a list of DownloadStatus entries. + */ public class DownloadLogAdapter extends BaseAdapter { + private static final String TAG = "DownloadLogAdapter"; - private static final String TAG = "DownloadLogAdapter"; - - private final Context context; - + private final Context context; private final ItemAccess itemAccess; - public DownloadLogAdapter(Context context, ItemAccess itemAccess) { - super(); + public DownloadLogAdapter(Context context, ItemAccess itemAccess) { + super(); this.itemAccess = itemAccess; - this.context = context; - } + this.context = context; + } - @Override - public View getView(int position, View convertView, ViewGroup parent) { - Holder holder; - DownloadStatus status = getItem(position); - if (convertView == null) { - holder = new Holder(); - LayoutInflater inflater = (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - convertView = inflater.inflate(R.layout.downloadlog_item, parent, false); - holder.icon = convertView.findViewById(R.id.txtvIcon); - holder.retry = convertView.findViewById(R.id.btnRetry); - holder.date = convertView.findViewById(R.id.txtvDate); - holder.title = convertView.findViewById(R.id.txtvTitle); - if(Build.VERSION.SDK_INT >= 23) { - holder.title.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL); - } - holder.type = convertView.findViewById(R.id.txtvType); - holder.reason = convertView.findViewById(R.id.txtvReason); - convertView.setTag(holder); - } else { - holder = (Holder) convertView.getTag(); - } - if (status.getFeedfileType() == Feed.FEEDFILETYPE_FEED) { - holder.type.setText(R.string.download_type_feed); - } else if (status.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) { - holder.type.setText(R.string.download_type_media); - } - if (status.getTitle() != null) { - holder.title.setText(status.getTitle()); - } else { - holder.title.setText(R.string.download_log_title_unknown); - } - holder.date.setText(DateUtils.getRelativeTimeSpanString( - status.getCompletionDate().getTime(), - System.currentTimeMillis(), 0, 0)); - if (status.isSuccessful()) { - holder.icon.setTextColor(ContextCompat.getColor(convertView.getContext(), - R.color.download_success_green)); - holder.icon.setText("{fa-check-circle}"); - holder.retry.setVisibility(View.GONE); - holder.reason.setVisibility(View.GONE); - } else { - holder.icon.setTextColor(ContextCompat.getColor(convertView.getContext(), - R.color.download_failed_red)); - holder.icon.setText("{fa-times-circle}"); - String reasonText = status.getReason().getErrorString(context); - if (status.getReasonDetailed() != null) { - reasonText += ": " + status.getReasonDetailed(); - } - holder.reason.setText(reasonText); - holder.reason.setVisibility(View.VISIBLE); - if(!newerWasSuccessful(position, status.getFeedfileType(), status.getFeedfileId())) { - holder.retry.setVisibility(View.VISIBLE); - holder.retry.setOnClickListener(clickListener); - ButtonHolder btnHolder; - if(holder.retry.getTag() != null) { - btnHolder = (ButtonHolder) holder.retry.getTag(); - } else { - btnHolder = new ButtonHolder(); - } - btnHolder.typeId = status.getFeedfileType(); - btnHolder.id = status.getFeedfileId(); - holder.retry.setTag(btnHolder); - } else { - holder.retry.setVisibility(View.GONE); - holder.retry.setOnClickListener(null); - holder.retry.setTag(null); - } - } + @Override + public View getView(int position, View convertView, ViewGroup parent) { + DownloadItemViewHolder holder; + if (convertView == null) { + holder = new DownloadItemViewHolder(context, parent); + } else { + holder = (DownloadItemViewHolder) convertView.getTag(); + } - return convertView; - } + DownloadStatus status = getItem(position); + if (status.getFeedfileType() == Feed.FEEDFILETYPE_FEED) { + holder.type.setText(R.string.download_type_feed); + } else if (status.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) { + holder.type.setText(R.string.download_type_media); + } - private final View.OnClickListener clickListener = new View.OnClickListener() { - @Override - public void onClick(View v) { - ButtonHolder holder = (ButtonHolder) v.getTag(); - if(holder.typeId == Feed.FEEDFILETYPE_FEED) { - Feed feed = DBReader.getFeed(holder.id); - if (feed != null) { - try { - DBTasks.forceRefreshFeed(context, feed); - } catch (DownloadRequestException e) { - e.printStackTrace(); - } - } else { - Log.wtf(TAG, "Could not find feed for feed id: " + holder.id); - } - } else if(holder.typeId == FeedMedia.FEEDFILETYPE_FEEDMEDIA) { - FeedMedia media = DBReader.getFeedMedia(holder.id); - if (media != null) { - try { - DownloadRequester.getInstance().downloadMedia(context, media.getItem()); - Toast.makeText(context, R.string.status_downloading_label, Toast.LENGTH_SHORT).show(); - } catch (DownloadRequestException e) { - e.printStackTrace(); - DownloadRequestErrorDialogCreator.newRequestErrorDialog(context, e.getMessage()); - } - } else { - Log.wtf(TAG, "Could not find media for id: " + holder.id); - } - } else { - Log.wtf(TAG, "Unexpected type id: " + holder.typeId); - } - v.setVisibility(View.GONE); - } - }; + if (status.getTitle() != null) { + holder.title.setText(status.getTitle()); + } else { + holder.title.setText(R.string.download_log_title_unknown); + } + holder.date.setText(DateUtils.getRelativeTimeSpanString(status.getCompletionDate().getTime(), + System.currentTimeMillis(), 0, 0)); - private boolean newerWasSuccessful(int position, int feedTypeId, long id) { - for (int i = 0; i < position; i++) { - DownloadStatus status = getItem(i); - if (status.getFeedfileType() == feedTypeId && status.getFeedfileId() == id && - status.isSuccessful()) return true; - } - return false; - } + if (status.isSuccessful()) { + holder.icon.setTextColor(ContextCompat.getColor(context, R.color.download_success_green)); + holder.icon.setText("{fa-check-circle}"); + holder.secondaryActionButton.setVisibility(View.INVISIBLE); + holder.reason.setVisibility(View.GONE); + } else { + holder.icon.setTextColor(ContextCompat.getColor(context, R.color.download_failed_red)); + holder.icon.setText("{fa-times-circle}"); + String reasonText = status.getReason().getErrorString(context); + if (status.getReasonDetailed() != null) { + reasonText += ": " + status.getReasonDetailed(); + } + holder.reason.setText(reasonText); + holder.reason.setVisibility(View.VISIBLE); - static class Holder { - IconTextView icon; - IconButton retry; - TextView title; - TextView type; - TextView date; - TextView reason; - } + if (newerWasSuccessful(position, status.getFeedfileType(), status.getFeedfileId())) { + holder.secondaryActionButton.setVisibility(View.INVISIBLE); + holder.secondaryActionButton.setOnClickListener(null); + holder.secondaryActionButton.setTag(null); + } else { + holder.secondaryActionIcon.setImageResource( + ThemeUtils.getDrawableFromAttr(context, R.attr.navigation_refresh)); + holder.secondaryActionButton.setVisibility(View.VISIBLE); - static class ButtonHolder { - int typeId; - long id; - } + if (status.getFeedfileType() == Feed.FEEDFILETYPE_FEED) { + holder.secondaryActionButton.setOnClickListener(v -> { + holder.secondaryActionButton.setVisibility(View.INVISIBLE); + Feed feed = DBReader.getFeed(status.getFeedfileId()); + if (feed == null) { + Log.e(TAG, "Could not find feed for feed id: " + status.getFeedfileId()); + return; + } + try { + DBTasks.forceRefreshFeed(context, feed); + } catch (DownloadRequestException e) { + e.printStackTrace(); + } + }); + } else if (status.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) { + holder.secondaryActionButton.setOnClickListener(v -> { + holder.secondaryActionButton.setVisibility(View.INVISIBLE); + FeedMedia media = DBReader.getFeedMedia(status.getFeedfileId()); + if (media == null) { + Log.e(TAG, "Could not find feed media for feed id: " + status.getFeedfileId()); + return; + } + try { + DownloadRequester.getInstance().downloadMedia(context, media.getItem()); + Toast.makeText(context, R.string.status_downloading_label, Toast.LENGTH_SHORT).show(); + } catch (DownloadRequestException e) { + e.printStackTrace(); + DownloadRequestErrorDialogCreator.newRequestErrorDialog(context, e.getMessage()); + } + }); + } + } + } - @Override - public int getCount() { + return holder.itemView; + } + + private boolean newerWasSuccessful(int position, int feedTypeId, long id) { + for (int i = 0; i < position; i++) { + DownloadStatus status = getItem(i); + if (status.getFeedfileType() == feedTypeId && status.getFeedfileId() == id && status.isSuccessful()) { + return true; + } + } + return false; + } + + @Override + public int getCount() { return itemAccess.getCount(); - } + } - @Override - public DownloadStatus getItem(int position) { + @Override + public DownloadStatus getItem(int position) { return itemAccess.getItem(position); - } + } - @Override - public long getItemId(int position) { - return position; - } + @Override + public long getItemId(int position) { + return position; + } public interface ItemAccess { - int getCount(); - DownloadStatus getItem(int position); + int getCount(); + + DownloadStatus getItem(int position); } } diff --git a/app/src/main/java/de/danoeh/antennapod/view/viewholder/DownloadItemViewHolder.java b/app/src/main/java/de/danoeh/antennapod/view/viewholder/DownloadItemViewHolder.java new file mode 100644 index 000000000..d48db196f --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/view/viewholder/DownloadItemViewHolder.java @@ -0,0 +1,41 @@ +package de.danoeh.antennapod.view.viewholder; + +import android.content.Context; +import android.os.Build; +import android.text.Layout; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import androidx.recyclerview.widget.RecyclerView; +import com.joanzapata.iconify.widget.IconTextView; +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.view.CircularProgressBar; + +public class DownloadItemViewHolder extends RecyclerView.ViewHolder { + public final View secondaryActionButton; + public final ImageView secondaryActionIcon; + public final CircularProgressBar secondaryActionProgress; + public final IconTextView icon; + public final TextView title; + public final TextView type; + public final TextView date; + public final TextView reason; + + public DownloadItemViewHolder(Context context, ViewGroup parent) { + super(LayoutInflater.from(context).inflate(R.layout.downloadlog_item, parent, false)); + date = itemView.findViewById(R.id.txtvDate); + type = itemView.findViewById(R.id.txtvType); + icon = itemView.findViewById(R.id.txtvIcon); + reason = itemView.findViewById(R.id.txtvReason); + secondaryActionProgress = itemView.findViewById(R.id.secondaryActionProgress); + secondaryActionButton = itemView.findViewById(R.id.secondaryActionButton); + secondaryActionIcon = itemView.findViewById(R.id.secondaryActionIcon); + title = itemView.findViewById(R.id.txtvTitle); + if (Build.VERSION.SDK_INT >= 23) { + title.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL); + } + itemView.setTag(this); + } +} diff --git a/app/src/main/res/layout/downloadlog_item.xml b/app/src/main/res/layout/downloadlog_item.xml index 505102ea4..c8cbf15f6 100644 --- a/app/src/main/res/layout/downloadlog_item.xml +++ b/app/src/main/res/layout/downloadlog_item.xml @@ -1,97 +1,90 @@ - + + android:id="@+id/txtvIcon" + android:layout_width="40dp" + android:layout_height="40dp" + android:layout_marginBottom="@dimen/listitem_threeline_verticalpadding" + android:layout_marginTop="@dimen/listitem_threeline_verticalpadding" + android:layout_marginLeft="@dimen/listitem_threeline_textleftpadding" + android:layout_marginStart="@dimen/listitem_threeline_textleftpadding" + android:textSize="40dp" + android:gravity="center" + tools:text="X"/> - + - + - + + + - + + - + - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/core/src/main/res/values/colors.xml b/core/src/main/res/values/colors.xml index fea7da4a4..b162038cf 100644 --- a/core/src/main/res/values/colors.xml +++ b/core/src/main/res/values/colors.xml @@ -7,8 +7,8 @@ #000000 #33B5E5 #0099CC - #669900 - #CC0000 + #248800 + #B00020 #E033B5E5 #2C2C2C #FFFFFF