Improved spacing in FeedItemlist and Downloads list
- Removed InternalFeedItemlistAdapter
This commit is contained in:
parent
bb9683b86a
commit
640b36912a
@ -16,20 +16,28 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginLeft="8dp"
|
android:layout_marginLeft="8dp"
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
android:textStyle="bold"/>
|
android:textSize="@dimen/text_size_small"
|
||||||
|
android:lines="1"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:textColor="?android:attr/textColorPrimary"/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/txtvMessage"
|
android:id="@+id/txtvMessage"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="8dp"/>
|
android:layout_margin="8dp"
|
||||||
|
android:textColor="?android:attr/textColorSecondary"
|
||||||
|
android:textSize="@dimen/text_size_micro"
|
||||||
|
android:lines="1"
|
||||||
|
android:ellipsize="end"/>
|
||||||
|
|
||||||
<ProgressBar
|
<ProgressBar
|
||||||
android:id="@+id/progProgress"
|
android:id="@+id/progProgress"
|
||||||
style="?android:attr/progressBarStyleHorizontal"
|
style="?android:attr/progressBarStyleHorizontal"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="16dp"
|
android:layout_height="16dp"
|
||||||
android:layout_margin="8dp"/>
|
android:layout_marginLeft="8dp"
|
||||||
|
android:layout_marginRight="8dp"/>
|
||||||
|
|
||||||
<RelativeLayout
|
<RelativeLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@ -40,12 +48,20 @@
|
|||||||
android:id="@+id/txtvDownloaded"
|
android:id="@+id/txtvDownloaded"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="@dimen/text_size_small"
|
||||||
|
android:lines="1"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:textColor="?android:attr/textColorPrimary"
|
||||||
android:layout_alignParentLeft="true"/>
|
android:layout_alignParentLeft="true"/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/txtvPercent"
|
android:id="@+id/txtvPercent"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="@dimen/text_size_small"
|
||||||
|
android:lines="1"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:textColor="?android:attr/textColorPrimary"
|
||||||
android:layout_alignParentRight="true"/>
|
android:layout_alignParentRight="true"/>
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
|
||||||
|
@ -27,13 +27,9 @@
|
|||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_below="@id/txtvPublished"
|
android:layout_below="@id/txtvPublished"
|
||||||
android:layout_marginBottom="4dp"
|
android:layout_marginBottom="8dp"
|
||||||
android:layout_marginRight="4dp"
|
android:layout_marginRight="4dp"
|
||||||
android:layout_marginTop="4dp"
|
style="@style/AntennaPod.TextView.ListItemPrimaryTitle"/>
|
||||||
android:ellipsize="end"
|
|
||||||
android:lines="2"
|
|
||||||
android:textColor="?android:attr/textColorPrimary"
|
|
||||||
android:textSize="@dimen/text_size_medium"/>
|
|
||||||
|
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
|
@ -43,10 +43,7 @@
|
|||||||
android:layout_marginTop="2dp"
|
android:layout_marginTop="2dp"
|
||||||
android:layout_toRightOf="@id/imgvImage"
|
android:layout_toRightOf="@id/imgvImage"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_alignParentRight="true"
|
||||||
android:ellipsize="end"
|
style="@style/AntennaPod.TextView.ListItemPrimaryTitle"/>
|
||||||
android:lines="2"
|
|
||||||
android:textColor="?android:attr/textColorPrimary"
|
|
||||||
android:textSize="@dimen/text_size_small"/>
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
|
@ -125,4 +125,11 @@
|
|||||||
<item name="android:textStyle">italic</item>
|
<item name="android:textStyle">italic</item>
|
||||||
<item name="android:textColor">?android:attr/textColorPrimary</item>
|
<item name="android:textColor">?android:attr/textColorPrimary</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="AntennaPod.TextView.ListItemPrimaryTitle" parent="@android:style/TextAppearance.Small">
|
||||||
|
<item name="android:textSize">15sp</item>
|
||||||
|
<item name="android:textColor">?android:attr/textColorPrimary</item>
|
||||||
|
<item name="android:lines">2</item>
|
||||||
|
<item name="android:ellipsize">end</item>
|
||||||
|
</style>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -1,129 +0,0 @@
|
|||||||
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;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.Adapter;
|
|
||||||
import android.widget.BaseAdapter;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import de.danoeh.antennapod.R;
|
|
||||||
import de.danoeh.antennapod.feed.FeedItem;
|
|
||||||
import de.danoeh.antennapod.feed.MediaType;
|
|
||||||
import de.danoeh.antennapod.util.Converter;
|
|
||||||
|
|
||||||
public class DefaultFeedItemlistAdapter extends BaseAdapter {
|
|
||||||
|
|
||||||
ItemAccess itemAccess;
|
|
||||||
private Context context;
|
|
||||||
|
|
||||||
public DefaultFeedItemlistAdapter(Context context, ItemAccess itemAccess) {
|
|
||||||
super();
|
|
||||||
this.context = context;
|
|
||||||
if (itemAccess == null) {
|
|
||||||
throw new IllegalArgumentException("itemAccess must not be null");
|
|
||||||
}
|
|
||||||
this.itemAccess = itemAccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getCount() {
|
|
||||||
return itemAccess.getCount();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getItemId(int position) {
|
|
||||||
return position;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public FeedItem getItem(int position) {
|
|
||||||
return itemAccess.getItem(position);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View getView(int position, View convertView, ViewGroup parent) {
|
|
||||||
Holder holder;
|
|
||||||
final FeedItem item = getItem(position);
|
|
||||||
|
|
||||||
if (convertView == null) {
|
|
||||||
holder = new Holder();
|
|
||||||
LayoutInflater inflater = (LayoutInflater) context
|
|
||||||
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
|
||||||
convertView = inflater.inflate(R.layout.default_feeditemlist_item, null);
|
|
||||||
holder.title = (TextView) convertView
|
|
||||||
.findViewById(R.id.txtvItemname);
|
|
||||||
holder.lenSize = (TextView) convertView
|
|
||||||
.findViewById(R.id.txtvLenSize);
|
|
||||||
|
|
||||||
holder.published = (TextView) convertView
|
|
||||||
.findViewById(R.id.txtvPublished);
|
|
||||||
holder.type = (ImageView) convertView.findViewById(R.id.imgvType);
|
|
||||||
convertView.setTag(holder);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
holder = (Holder) convertView.getTag();
|
|
||||||
}
|
|
||||||
if (!(getItemViewType(position) == Adapter.IGNORE_ITEM_VIEW_TYPE)) {
|
|
||||||
convertView.setVisibility(View.VISIBLE);
|
|
||||||
holder.title.setText(item.getTitle());
|
|
||||||
holder.published.setText(convertView.getResources().getString(
|
|
||||||
R.string.published_prefix)
|
|
||||||
+ DateUtils.getRelativeTimeSpanString(
|
|
||||||
item.getPubDate().getTime(),
|
|
||||||
System.currentTimeMillis(), 0, 0));
|
|
||||||
if (item.getMedia() == null) {
|
|
||||||
holder.type.setVisibility(View.GONE);
|
|
||||||
holder.lenSize.setVisibility(View.GONE);
|
|
||||||
} else {
|
|
||||||
holder.lenSize.setVisibility(View.VISIBLE);
|
|
||||||
holder.lenSize.setText(convertView.getResources().getString(
|
|
||||||
R.string.size_prefix)
|
|
||||||
+ Converter.byteToString(item.getMedia().getSize()));
|
|
||||||
|
|
||||||
TypedArray typeDrawables = context
|
|
||||||
.obtainStyledAttributes(new int[] { R.attr.type_audio,
|
|
||||||
R.attr.type_video });
|
|
||||||
MediaType mediaType = item.getMedia().getMediaType();
|
|
||||||
if (mediaType == MediaType.AUDIO) {
|
|
||||||
holder.type.setImageDrawable(typeDrawables.getDrawable(0));
|
|
||||||
holder.type.setContentDescription(context.getString(R.string.media_type_audio_label));
|
|
||||||
holder.type.setVisibility(View.VISIBLE);
|
|
||||||
} else if (mediaType == MediaType.VIDEO) {
|
|
||||||
holder.type.setImageDrawable(typeDrawables.getDrawable(1));
|
|
||||||
holder.type.setContentDescription(context.getString(R.string.media_type_video_label));
|
|
||||||
holder.type.setVisibility(View.VISIBLE);
|
|
||||||
} else {
|
|
||||||
holder.type.setImageBitmap(null);
|
|
||||||
holder.type.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
convertView.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
return convertView;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static class Holder {
|
|
||||||
TextView title;
|
|
||||||
TextView published;
|
|
||||||
TextView lenSize;
|
|
||||||
ImageView type;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static interface ItemAccess {
|
|
||||||
int getCount();
|
|
||||||
|
|
||||||
FeedItem getItem(int position);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Context getContext() {
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
}
|
|
243
src/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java
Normal file
243
src/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java
Normal file
@ -0,0 +1,243 @@
|
|||||||
|
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;
|
||||||
|
import android.view.View.OnClickListener;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.*;
|
||||||
|
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.storage.DownloadRequester;
|
||||||
|
import de.danoeh.antennapod.util.Converter;
|
||||||
|
import de.danoeh.antennapod.util.ThemeUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List adapter for items of feeds that the user has already subscribed to.
|
||||||
|
*/
|
||||||
|
public class FeedItemlistAdapter extends BaseAdapter {
|
||||||
|
|
||||||
|
private ActionButtonCallback callback;
|
||||||
|
private final ItemAccess itemAccess;
|
||||||
|
private final Context context;
|
||||||
|
private boolean showFeedtitle;
|
||||||
|
private int selectedItemIndex;
|
||||||
|
private final ActionButtonUtils actionButtonUtils;
|
||||||
|
|
||||||
|
public static final int SELECTION_NONE = -1;
|
||||||
|
|
||||||
|
public FeedItemlistAdapter(Context context,
|
||||||
|
ItemAccess itemAccess,
|
||||||
|
ActionButtonCallback callback, boolean showFeedtitle) {
|
||||||
|
super();
|
||||||
|
this.callback = callback;
|
||||||
|
this.context = context;
|
||||||
|
this.itemAccess = itemAccess;
|
||||||
|
this.showFeedtitle = showFeedtitle;
|
||||||
|
this.selectedItemIndex = SELECTION_NONE;
|
||||||
|
this.actionButtonUtils = new ActionButtonUtils(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getCount() {
|
||||||
|
return itemAccess.getCount();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getItemId(int position) {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FeedItem getItem(int position) {
|
||||||
|
return itemAccess.getItem(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View getView(final int position, View convertView, ViewGroup parent) {
|
||||||
|
Holder holder;
|
||||||
|
final FeedItem item = getItem(position);
|
||||||
|
|
||||||
|
if (convertView == null) {
|
||||||
|
holder = new Holder();
|
||||||
|
LayoutInflater inflater = (LayoutInflater) context
|
||||||
|
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||||
|
convertView = inflater.inflate(R.layout.feeditemlist_item, null);
|
||||||
|
holder.title = (TextView) convertView
|
||||||
|
.findViewById(R.id.txtvItemname);
|
||||||
|
holder.lenSize = (TextView) convertView
|
||||||
|
.findViewById(R.id.txtvLenSize);
|
||||||
|
holder.butAction = (ImageButton) convertView
|
||||||
|
.findViewById(R.id.butSecondaryAction);
|
||||||
|
holder.published = (TextView) convertView
|
||||||
|
.findViewById(R.id.txtvPublished);
|
||||||
|
holder.inPlaylist = (ImageView) convertView
|
||||||
|
.findViewById(R.id.imgvInPlaylist);
|
||||||
|
holder.type = (ImageView) convertView.findViewById(R.id.imgvType);
|
||||||
|
holder.statusUnread = (View) convertView
|
||||||
|
.findViewById(R.id.statusUnread);
|
||||||
|
holder.episodeProgress = (ProgressBar) convertView
|
||||||
|
.findViewById(R.id.pbar_episode_progress);
|
||||||
|
|
||||||
|
convertView.setTag(holder);
|
||||||
|
} else {
|
||||||
|
holder = (Holder) convertView.getTag();
|
||||||
|
}
|
||||||
|
if (!(getItemViewType(position) == Adapter.IGNORE_ITEM_VIEW_TYPE)) {
|
||||||
|
convertView.setVisibility(View.VISIBLE);
|
||||||
|
if (position == selectedItemIndex) {
|
||||||
|
convertView.setBackgroundColor(convertView.getResources()
|
||||||
|
.getColor(ThemeUtils.getSelectionBackgroundColor()));
|
||||||
|
} else {
|
||||||
|
convertView.setBackgroundResource(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
|
case PLAYING:
|
||||||
|
holder.statusUnread.setVisibility(View.GONE);
|
||||||
|
holder.episodeProgress.setVisibility(View.VISIBLE);
|
||||||
|
break;
|
||||||
|
case IN_PROGRESS:
|
||||||
|
holder.statusUnread.setVisibility(View.GONE);
|
||||||
|
holder.episodeProgress.setVisibility(View.VISIBLE);
|
||||||
|
break;
|
||||||
|
case NEW:
|
||||||
|
holder.statusUnread.setVisibility(View.VISIBLE);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
holder.statusUnread.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
holder.published.setText(DateUtils.formatDateTime(context, item.getPubDate().getTime(), DateUtils.FORMAT_SHOW_DATE));
|
||||||
|
|
||||||
|
|
||||||
|
FeedMedia media = item.getMedia();
|
||||||
|
if (media == null) {
|
||||||
|
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
|
||||||
|
|| state == FeedItem.State.IN_PROGRESS) {
|
||||||
|
if (media.getDuration() > 0) {
|
||||||
|
holder.episodeProgress
|
||||||
|
.setProgress((int) (((double) media
|
||||||
|
.getPosition()) / media.getDuration() * 100));
|
||||||
|
holder.lenSize.setText(Converter
|
||||||
|
.getDurationStringLong(media.getDuration()
|
||||||
|
- media.getPosition()));
|
||||||
|
}
|
||||||
|
} else if (!media.isDownloaded()) {
|
||||||
|
holder.lenSize.setText(context.getString(
|
||||||
|
R.string.size_prefix)
|
||||||
|
+ Converter.byteToString(media.getSize()));
|
||||||
|
} else {
|
||||||
|
holder.lenSize.setText(context.getString(
|
||||||
|
R.string.length_prefix)
|
||||||
|
+ Converter.getDurationStringLong(media
|
||||||
|
.getDuration()));
|
||||||
|
}
|
||||||
|
|
||||||
|
holder.lenSize.setVisibility(View.VISIBLE);
|
||||||
|
if (((ItemAccess) itemAccess).isInQueue(item)) {
|
||||||
|
holder.inPlaylist.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
holder.inPlaylist.setVisibility(View.INVISIBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DownloadRequester.getInstance().isDownloadingFile(
|
||||||
|
item.getMedia())) {
|
||||||
|
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 = context.obtainStyledAttributes(
|
||||||
|
new int[]{R.attr.type_audio, R.attr.type_video});
|
||||||
|
final int[] labels = new int[]{R.string.media_type_audio_label, R.string.media_type_video_label};
|
||||||
|
|
||||||
|
MediaType mediaType = item.getMedia().getMediaType();
|
||||||
|
if (mediaType == MediaType.AUDIO) {
|
||||||
|
holder.type.setImageDrawable(typeDrawables.getDrawable(0));
|
||||||
|
holder.type.setContentDescription(context.getString(labels[0]));
|
||||||
|
holder.type.setVisibility(View.VISIBLE);
|
||||||
|
} else if (mediaType == MediaType.VIDEO) {
|
||||||
|
holder.type.setImageDrawable(typeDrawables.getDrawable(1));
|
||||||
|
holder.type.setContentDescription(context.getString(labels[1]));
|
||||||
|
holder.type.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
holder.type.setImageBitmap(null);
|
||||||
|
holder.type.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
actionButtonUtils.configureActionButton(holder.butAction, item);
|
||||||
|
holder.butAction.setFocusable(false);
|
||||||
|
holder.butAction.setTag(item);
|
||||||
|
holder.butAction.setOnClickListener(butActionListener);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
convertView.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
return convertView;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private final OnClickListener butActionListener = new OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
FeedItem item = (FeedItem) v.getTag();
|
||||||
|
callback.onActionButtonPressed(item);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static class Holder {
|
||||||
|
TextView title;
|
||||||
|
TextView published;
|
||||||
|
TextView lenSize;
|
||||||
|
ImageView type;
|
||||||
|
ImageView inPlaylist;
|
||||||
|
ImageButton butAction;
|
||||||
|
View statusUnread;
|
||||||
|
ProgressBar episodeProgress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSelectedItemIndex() {
|
||||||
|
return selectedItemIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSelectedItemIndex(int selectedItemIndex) {
|
||||||
|
this.selectedItemIndex = selectedItemIndex;
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static interface ItemAccess {
|
||||||
|
public boolean isInQueue(FeedItem item);
|
||||||
|
|
||||||
|
int getItemDownloadProgressPercent(FeedItem item);
|
||||||
|
|
||||||
|
int getCount();
|
||||||
|
|
||||||
|
FeedItem getItem(int position);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,217 +0,0 @@
|
|||||||
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;
|
|
||||||
import android.view.View.OnClickListener;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.*;
|
|
||||||
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;
|
|
||||||
|
|
||||||
/** List adapter for items of feeds that the user has already subscribed to. */
|
|
||||||
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;
|
|
||||||
|
|
||||||
public InternalFeedItemlistAdapter(Context context,
|
|
||||||
ItemAccess itemAccess,
|
|
||||||
ActionButtonCallback callback, boolean showFeedtitle) {
|
|
||||||
super(context, itemAccess);
|
|
||||||
this.callback = callback;
|
|
||||||
this.showFeedtitle = showFeedtitle;
|
|
||||||
this.selectedItemIndex = SELECTION_NONE;
|
|
||||||
this.actionButtonUtils = new ActionButtonUtils(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View getView(final int position, View convertView, ViewGroup parent) {
|
|
||||||
Holder holder;
|
|
||||||
final FeedItem item = getItem(position);
|
|
||||||
|
|
||||||
if (convertView == null) {
|
|
||||||
holder = new Holder();
|
|
||||||
LayoutInflater inflater = (LayoutInflater) getContext()
|
|
||||||
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
|
||||||
convertView = inflater.inflate(R.layout.feeditemlist_item, null);
|
|
||||||
holder.title = (TextView) convertView
|
|
||||||
.findViewById(R.id.txtvItemname);
|
|
||||||
holder.lenSize = (TextView) convertView
|
|
||||||
.findViewById(R.id.txtvLenSize);
|
|
||||||
holder.butAction = (ImageButton) convertView
|
|
||||||
.findViewById(R.id.butSecondaryAction);
|
|
||||||
holder.published = (TextView) convertView
|
|
||||||
.findViewById(R.id.txtvPublished);
|
|
||||||
holder.inPlaylist = (ImageView) convertView
|
|
||||||
.findViewById(R.id.imgvInPlaylist);
|
|
||||||
holder.type = (ImageView) convertView.findViewById(R.id.imgvType);
|
|
||||||
holder.statusUnread = (View) convertView
|
|
||||||
.findViewById(R.id.statusUnread);
|
|
||||||
holder.episodeProgress = (ProgressBar) convertView
|
|
||||||
.findViewById(R.id.pbar_episode_progress);
|
|
||||||
|
|
||||||
convertView.setTag(holder);
|
|
||||||
} else {
|
|
||||||
holder = (Holder) convertView.getTag();
|
|
||||||
}
|
|
||||||
if (!(getItemViewType(position) == Adapter.IGNORE_ITEM_VIEW_TYPE)) {
|
|
||||||
convertView.setVisibility(View.VISIBLE);
|
|
||||||
if (position == selectedItemIndex) {
|
|
||||||
convertView.setBackgroundColor(convertView.getResources()
|
|
||||||
.getColor(ThemeUtils.getSelectionBackgroundColor()));
|
|
||||||
} else {
|
|
||||||
convertView.setBackgroundResource(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
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) {
|
|
||||||
case PLAYING:
|
|
||||||
holder.statusUnread.setVisibility(View.GONE);
|
|
||||||
holder.episodeProgress.setVisibility(View.VISIBLE);
|
|
||||||
break;
|
|
||||||
case IN_PROGRESS:
|
|
||||||
holder.statusUnread.setVisibility(View.GONE);
|
|
||||||
holder.episodeProgress.setVisibility(View.VISIBLE);
|
|
||||||
break;
|
|
||||||
case NEW:
|
|
||||||
holder.statusUnread.setVisibility(View.VISIBLE);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
holder.statusUnread.setVisibility(View.GONE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
holder.published.setText(convertView.getResources().getString(
|
|
||||||
R.string.published_prefix)
|
|
||||||
+ DateUtils.getRelativeTimeSpanString(
|
|
||||||
item.getPubDate().getTime(),
|
|
||||||
System.currentTimeMillis(), 0, 0));
|
|
||||||
|
|
||||||
FeedMedia media = item.getMedia();
|
|
||||||
if (media == null) {
|
|
||||||
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
|
|
||||||
|| state == FeedItem.State.IN_PROGRESS) {
|
|
||||||
if (media.getDuration() > 0) {
|
|
||||||
holder.episodeProgress
|
|
||||||
.setProgress((int) (((double) media
|
|
||||||
.getPosition()) / media.getDuration() * 100));
|
|
||||||
holder.lenSize.setText(Converter
|
|
||||||
.getDurationStringLong(media.getDuration()
|
|
||||||
- media.getPosition()));
|
|
||||||
}
|
|
||||||
} else if (!media.isDownloaded()) {
|
|
||||||
holder.lenSize.setText(getContext().getString(
|
|
||||||
R.string.size_prefix)
|
|
||||||
+ Converter.byteToString(media.getSize()));
|
|
||||||
} else {
|
|
||||||
holder.lenSize.setText(getContext().getString(
|
|
||||||
R.string.length_prefix)
|
|
||||||
+ Converter.getDurationStringLong(media
|
|
||||||
.getDuration()));
|
|
||||||
}
|
|
||||||
|
|
||||||
holder.lenSize.setVisibility(View.VISIBLE);
|
|
||||||
if (((ItemAccess) itemAccess).isInQueue(item)) {
|
|
||||||
holder.inPlaylist.setVisibility(View.VISIBLE);
|
|
||||||
} else {
|
|
||||||
holder.inPlaylist.setVisibility(View.INVISIBLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DownloadRequester.getInstance().isDownloadingFile(
|
|
||||||
item.getMedia())) {
|
|
||||||
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(
|
|
||||||
new int[] { R.attr.type_audio, R.attr.type_video });
|
|
||||||
final int[] labels = new int[] {R.string.media_type_audio_label, R.string.media_type_video_label};
|
|
||||||
|
|
||||||
MediaType mediaType = item.getMedia().getMediaType();
|
|
||||||
if (mediaType == MediaType.AUDIO) {
|
|
||||||
holder.type.setImageDrawable(typeDrawables.getDrawable(0));
|
|
||||||
holder.type.setContentDescription(getContext().getString(labels[0]));
|
|
||||||
holder.type.setVisibility(View.VISIBLE);
|
|
||||||
} else if (mediaType == MediaType.VIDEO) {
|
|
||||||
holder.type.setImageDrawable(typeDrawables.getDrawable(1));
|
|
||||||
holder.type.setContentDescription(getContext().getString(labels[1]));
|
|
||||||
holder.type.setVisibility(View.VISIBLE);
|
|
||||||
} else {
|
|
||||||
holder.type.setImageBitmap(null);
|
|
||||||
holder.type.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
actionButtonUtils.configureActionButton(holder.butAction, item);
|
|
||||||
holder.butAction.setFocusable(false);
|
|
||||||
holder.butAction.setTag(item);
|
|
||||||
holder.butAction.setOnClickListener(butActionListener);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
convertView.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
return convertView;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
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 {
|
|
||||||
ImageView inPlaylist;
|
|
||||||
ImageButton butAction;
|
|
||||||
View statusUnread;
|
|
||||||
ProgressBar episodeProgress;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getSelectedItemIndex() {
|
|
||||||
return selectedItemIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSelectedItemIndex(int selectedItemIndex) {
|
|
||||||
this.selectedItemIndex = selectedItemIndex;
|
|
||||||
notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static interface ItemAccess extends DefaultFeedItemlistAdapter.ItemAccess {
|
|
||||||
public boolean isInQueue(FeedItem item);
|
|
||||||
|
|
||||||
int getItemDownloadProgressPercent(FeedItem item);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -11,7 +11,6 @@ import android.os.Handler;
|
|||||||
import android.support.v4.app.ListFragment;
|
import android.support.v4.app.ListFragment;
|
||||||
import android.support.v7.app.ActionBarActivity;
|
import android.support.v7.app.ActionBarActivity;
|
||||||
import android.support.v7.widget.SearchView;
|
import android.support.v7.widget.SearchView;
|
||||||
import android.text.util.Linkify;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.*;
|
import android.view.*;
|
||||||
import android.widget.ImageButton;
|
import android.widget.ImageButton;
|
||||||
@ -23,7 +22,7 @@ import de.danoeh.antennapod.R;
|
|||||||
import de.danoeh.antennapod.activity.FeedInfoActivity;
|
import de.danoeh.antennapod.activity.FeedInfoActivity;
|
||||||
import de.danoeh.antennapod.activity.MainActivity;
|
import de.danoeh.antennapod.activity.MainActivity;
|
||||||
import de.danoeh.antennapod.adapter.DefaultActionButtonCallback;
|
import de.danoeh.antennapod.adapter.DefaultActionButtonCallback;
|
||||||
import de.danoeh.antennapod.adapter.InternalFeedItemlistAdapter;
|
import de.danoeh.antennapod.adapter.FeedItemlistAdapter;
|
||||||
import de.danoeh.antennapod.asynctask.DownloadObserver;
|
import de.danoeh.antennapod.asynctask.DownloadObserver;
|
||||||
import de.danoeh.antennapod.asynctask.FeedRemover;
|
import de.danoeh.antennapod.asynctask.FeedRemover;
|
||||||
import de.danoeh.antennapod.asynctask.ImageLoader;
|
import de.danoeh.antennapod.asynctask.ImageLoader;
|
||||||
@ -60,7 +59,7 @@ public class ItemlistFragment extends ListFragment {
|
|||||||
public static final String EXTRA_SELECTED_FEEDITEM = "extra.de.danoeh.antennapod.activity.selected_feeditem";
|
public static final String EXTRA_SELECTED_FEEDITEM = "extra.de.danoeh.antennapod.activity.selected_feeditem";
|
||||||
public static final String ARGUMENT_FEED_ID = "argument.de.danoeh.antennapod.feed_id";
|
public static final String ARGUMENT_FEED_ID = "argument.de.danoeh.antennapod.feed_id";
|
||||||
|
|
||||||
protected InternalFeedItemlistAdapter adapter;
|
protected FeedItemlistAdapter adapter;
|
||||||
|
|
||||||
private long feedID;
|
private long feedID;
|
||||||
private Feed feed;
|
private Feed feed;
|
||||||
@ -282,7 +281,7 @@ public class ItemlistFragment extends ListFragment {
|
|||||||
if (adapter == null) {
|
if (adapter == null) {
|
||||||
getListView().setAdapter(null);
|
getListView().setAdapter(null);
|
||||||
setupHeaderView();
|
setupHeaderView();
|
||||||
adapter = new InternalFeedItemlistAdapter(getActivity(), itemAccess, new DefaultActionButtonCallback(getActivity()), false);
|
adapter = new FeedItemlistAdapter(getActivity(), itemAccess, new DefaultActionButtonCallback(getActivity()), false);
|
||||||
setListAdapter(adapter);
|
setListAdapter(adapter);
|
||||||
downloadObserver = new DownloadObserver(getActivity(), new Handler(), downloadObserverCallback);
|
downloadObserver = new DownloadObserver(getActivity(), new Handler(), downloadObserverCallback);
|
||||||
downloadObserver.onResume();
|
downloadObserver.onResume();
|
||||||
@ -363,7 +362,7 @@ public class ItemlistFragment extends ListFragment {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private InternalFeedItemlistAdapter.ItemAccess itemAccess = new InternalFeedItemlistAdapter.ItemAccess() {
|
private FeedItemlistAdapter.ItemAccess itemAccess = new FeedItemlistAdapter.ItemAccess() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FeedItem getItem(int position) {
|
public FeedItem getItem(int position) {
|
||||||
|
@ -15,7 +15,7 @@ import android.view.View;
|
|||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
import de.danoeh.antennapod.R;
|
import de.danoeh.antennapod.R;
|
||||||
import de.danoeh.antennapod.adapter.DefaultActionButtonCallback;
|
import de.danoeh.antennapod.adapter.DefaultActionButtonCallback;
|
||||||
import de.danoeh.antennapod.adapter.InternalFeedItemlistAdapter;
|
import de.danoeh.antennapod.adapter.FeedItemlistAdapter;
|
||||||
import de.danoeh.antennapod.asynctask.DownloadObserver;
|
import de.danoeh.antennapod.asynctask.DownloadObserver;
|
||||||
import de.danoeh.antennapod.dialog.FeedItemDialog;
|
import de.danoeh.antennapod.dialog.FeedItemDialog;
|
||||||
import de.danoeh.antennapod.feed.EventDistributor;
|
import de.danoeh.antennapod.feed.EventDistributor;
|
||||||
@ -34,7 +34,7 @@ public class PlaybackHistoryFragment extends ListFragment {
|
|||||||
|
|
||||||
private List<FeedItem> playbackHistory;
|
private List<FeedItem> playbackHistory;
|
||||||
private QueueAccess queue;
|
private QueueAccess queue;
|
||||||
private InternalFeedItemlistAdapter adapter;
|
private FeedItemlistAdapter adapter;
|
||||||
|
|
||||||
private boolean itemsLoaded = false;
|
private boolean itemsLoaded = false;
|
||||||
private boolean viewsCreated = false;
|
private boolean viewsCreated = false;
|
||||||
@ -170,7 +170,7 @@ public class PlaybackHistoryFragment extends ListFragment {
|
|||||||
|
|
||||||
private void onFragmentLoaded() {
|
private void onFragmentLoaded() {
|
||||||
if (adapter == null) {
|
if (adapter == null) {
|
||||||
adapter = new InternalFeedItemlistAdapter(getActivity(), itemAccess, new DefaultActionButtonCallback(activity.get()), true);
|
adapter = new FeedItemlistAdapter(getActivity(), itemAccess, new DefaultActionButtonCallback(activity.get()), true);
|
||||||
setListAdapter(adapter);
|
setListAdapter(adapter);
|
||||||
downloadObserver = new DownloadObserver(activity.get(), new Handler(), downloadObserverCallback);
|
downloadObserver = new DownloadObserver(activity.get(), new Handler(), downloadObserverCallback);
|
||||||
downloadObserver.onResume();
|
downloadObserver.onResume();
|
||||||
@ -205,7 +205,7 @@ public class PlaybackHistoryFragment extends ListFragment {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private InternalFeedItemlistAdapter.ItemAccess itemAccess = new InternalFeedItemlistAdapter.ItemAccess() {
|
private FeedItemlistAdapter.ItemAccess itemAccess = new FeedItemlistAdapter.ItemAccess() {
|
||||||
@Override
|
@Override
|
||||||
public boolean isInQueue(FeedItem item) {
|
public boolean isInQueue(FeedItem item) {
|
||||||
return (queue != null) ? queue.contains(item.getId()) : false;
|
return (queue != null) ? queue.contains(item.getId()) : false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user