diff --git a/res/layout/feeditemlist_item.xml b/res/layout/feeditemlist_item.xml index 725891071..1378540da 100644 --- a/res/layout/feeditemlist_item.xml +++ b/res/layout/feeditemlist_item.xml @@ -1,102 +1,103 @@ - + android:paddingLeft="4dp" > - + android:background="@color/status_unread" + android:visibility="invisible" /> - + android:layout_weight="1" + android:paddingLeft="4dp" > - + - + - + - + - + - - + + - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/res/layout/feedlist_item.xml b/res/layout/feedlist_item.xml index 4677cae84..87f18f64e 100644 --- a/res/layout/feedlist_item.xml +++ b/res/layout/feedlist_item.xml @@ -3,7 +3,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="4dp" - android:paddingRight="16dp" + android:paddingRight="8dp" android:paddingTop="4dp" > - + android:orientation="vertical" > + + + + + + + + + + + + + + + diff --git a/res/values/colors.xml b/res/values/colors.xml index e7463852f..e87f90420 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -23,5 +23,7 @@ #DDDDDD #669900 #CC0000 + #99CC00 + #FFBB33 \ No newline at end of file diff --git a/src/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java b/src/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java index 050d7b493..5a1da7ef5 100644 --- a/src/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java +++ b/src/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java @@ -14,7 +14,6 @@ import android.widget.Adapter; import android.widget.ArrayAdapter; import android.widget.ImageButton; import android.widget.ImageView; -import android.widget.RelativeLayout; import android.widget.TextView; import de.danoeh.antennapod.PodcastApp; import de.danoeh.antennapod.R; @@ -68,12 +67,12 @@ public class FeedItemlistAdapter extends ArrayAdapter { holder.type = (ImageView) convertView.findViewById(R.id.imgvType); holder.downloading = (ImageView) convertView .findViewById(R.id.imgvDownloading); - holder.encInfo = (RelativeLayout) convertView - .findViewById(R.id.enc_info); if (showFeedtitle) { holder.feedtitle = (TextView) convertView .findViewById(R.id.txtvFeedname); } + holder.statusLabel = (View) convertView + .findViewById(R.id.vStatusLabel); convertView.setTag(holder); } else { @@ -93,22 +92,34 @@ public class FeedItemlistAdapter extends ArrayAdapter { holder.feedtitle.setVisibility(View.VISIBLE); holder.feedtitle.setText(item.getFeed().getTitle()); } - if (!item.isRead()) { + + if (item.isInProgress()) { holder.title.setTypeface(Typeface.DEFAULT_BOLD); + holder.statusLabel.setBackgroundColor(convertView.getResources().getColor(R.color.status_progress)); + holder.statusLabel.setVisibility(View.VISIBLE); + } else if (!item.isRead()) { + holder.title.setTypeface(Typeface.DEFAULT_BOLD); + holder.statusLabel.setBackgroundColor(convertView.getResources().getColor(R.color.status_unread)); + holder.statusLabel.setVisibility(View.VISIBLE); } else { holder.title.setTypeface(Typeface.DEFAULT); + holder.statusLabel.setVisibility(View.INVISIBLE); } holder.published.setText(convertView.getResources().getString( R.string.published_prefix) + DateUtils.formatSameDayTime(item.getPubDate().getTime(), - System.currentTimeMillis(), DateFormat.SHORT, + System.currentTimeMillis(), DateFormat.MEDIUM, DateFormat.SHORT)); if (item.getMedia() == null) { - holder.encInfo.setVisibility(View.GONE); + 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); } else { - holder.encInfo.setVisibility(View.VISIBLE); + holder.lenSize.setVisibility(View.VISIBLE); if (FeedManager.getInstance().isInQueue(item)) { holder.inPlaylist.setVisibility(View.VISIBLE); } else { @@ -139,10 +150,13 @@ public class FeedItemlistAdapter extends ArrayAdapter { MediaType mediaType = item.getMedia().getMediaType(); if (mediaType == MediaType.AUDIO) { holder.type.setImageResource(R.drawable.type_audio); + holder.type.setVisibility(View.VISIBLE); } else if (mediaType == MediaType.VIDEO) { holder.type.setImageResource(R.drawable.type_video); + holder.type.setVisibility(View.VISIBLE); } else { holder.type.setImageBitmap(null); + holder.type.setVisibility(View.GONE); } } @@ -165,7 +179,7 @@ public class FeedItemlistAdapter extends ArrayAdapter { ImageView type; ImageView downloading; ImageButton butAction; - RelativeLayout encInfo; + View statusLabel; } public int getSelectedItemIndex() { diff --git a/src/de/danoeh/antennapod/adapter/FeedlistAdapter.java b/src/de/danoeh/antennapod/adapter/FeedlistAdapter.java index 93aa2443e..2a5c449b1 100644 --- a/src/de/danoeh/antennapod/adapter/FeedlistAdapter.java +++ b/src/de/danoeh/antennapod/adapter/FeedlistAdapter.java @@ -47,6 +47,12 @@ public class FeedlistAdapter extends ArrayAdapter { holder.newEpisodes = (TextView) convertView .findViewById(R.id.txtvNewEps); + holder.inProgressEpisodes = (TextView) convertView + .findViewById(R.id.txtvProgressEps); + holder.newEpisodesLabel = (View) convertView + .findViewById(R.id.lNewStatusLabel); + holder.inProgressEpisodesLabel = (View) convertView + .findViewById(R.id.lProgressStatusLabel); holder.image = (ImageView) convertView .findViewById(R.id.imgvFeedimage); holder.lastUpdate = (TextView) convertView @@ -74,18 +80,30 @@ public class FeedlistAdapter extends ArrayAdapter { R.string.last_update_prefix) + DateUtils.formatSameDayTime(feed.getLastUpdate() .getTime(), System.currentTimeMillis(), - DateFormat.SHORT, DateFormat.SHORT)); + DateFormat.MEDIUM, DateFormat.SHORT)); } holder.numberOfEpisodes.setText(feed.getNumOfItems() + convertView.getResources() .getString(R.string.episodes_suffix)); + int newItems = feed.getNumOfNewItems(); + int inProgressItems = feed.getNumOfStartedItems(); + if (newItems > 0) { holder.newEpisodes.setText(Integer.toString(newItems)); - holder.newEpisodes.setVisibility(View.VISIBLE); + holder.newEpisodesLabel.setVisibility(View.VISIBLE); } else { - holder.newEpisodes.setVisibility(View.INVISIBLE); + holder.newEpisodesLabel.setVisibility(View.INVISIBLE); } + + if (inProgressItems > 0) { + holder.inProgressEpisodes + .setText(Integer.toString(inProgressItems)); + holder.inProgressEpisodesLabel.setVisibility(View.VISIBLE); + } else { + holder.inProgressEpisodesLabel.setVisibility(View.INVISIBLE); + } + holder.image.setTag(feed.getImage()); imageLoader.loadThumbnailBitmap( @@ -102,7 +120,10 @@ public class FeedlistAdapter extends ArrayAdapter { TextView lastUpdate; TextView numberOfEpisodes; TextView newEpisodes; + TextView inProgressEpisodes; ImageView image; + View newEpisodesLabel; + View inProgressEpisodesLabel; } public int getSelectedItemIndex() { diff --git a/src/de/danoeh/antennapod/feed/Feed.java b/src/de/danoeh/antennapod/feed/Feed.java index 55256ea31..8ca82be62 100644 --- a/src/de/danoeh/antennapod/feed/Feed.java +++ b/src/de/danoeh/antennapod/feed/Feed.java @@ -83,6 +83,21 @@ public class Feed extends FeedFile { return count; } + /** + * Returns the number of FeedItems where the media started to play but + * wasn't finished yet. + * */ + public int getNumOfStartedItems() { + int count = 0; + + for (FeedItem item : items) { + if (item.isInProgress()) { + count++; + } + } + return count; + } + /** * Returns true if at least one item in the itemlist is unread.If the * 'display only episodes' - preference is set to true, this method will diff --git a/src/de/danoeh/antennapod/feed/FeedItem.java b/src/de/danoeh/antennapod/feed/FeedItem.java index 6227298df..7ce58d081 100644 --- a/src/de/danoeh/antennapod/feed/FeedItem.java +++ b/src/de/danoeh/antennapod/feed/FeedItem.java @@ -147,7 +147,18 @@ public class FeedItem extends FeedComponent { } public boolean isRead() { - return read; + return read || isInProgress(); + } + + public void setRead(boolean read) { + this.read = read; + if (media != null) { + media.setPosition(0); + } + } + + public boolean isInProgress() { + return (media != null && media.isInProgress()); } public String getContentEncoded() { @@ -186,6 +197,10 @@ public class FeedItem extends FeedComponent { this.itemIdentifier = itemIdentifier; } + public boolean hasMedia() { + return media != null; + } + public boolean isPlaying() { if (media != null) { if (PodcastApp.getCurrentlyPlayingMediaId() == media.getId()) { @@ -202,5 +217,4 @@ public class FeedItem extends FeedComponent { public void setCachedContentEncoded(String c) { cachedContentEncoded = new SoftReference(c); } - } diff --git a/src/de/danoeh/antennapod/feed/FeedManager.java b/src/de/danoeh/antennapod/feed/FeedManager.java index 7f4a1c5aa..0666261d4 100644 --- a/src/de/danoeh/antennapod/feed/FeedManager.java +++ b/src/de/danoeh/antennapod/feed/FeedManager.java @@ -379,8 +379,13 @@ public class FeedManager { if (AppConfig.DEBUG) Log.d(TAG, "Setting item with title " + item.getTitle() + " as read/unread"); - item.read = read; + + item.setRead(read); + setFeedItem(context, item); + if (item.hasMedia()) + setFeedMedia(context, item.getMedia()); + contentChanger.post(new Runnable() { @Override @@ -416,7 +421,7 @@ public class FeedManager { if (AppConfig.DEBUG) Log.d(TAG, "marking all items as read"); for (FeedItem item : unreadItems) { - item.read = true; + item.setRead(true); } final ArrayList unreadItemsCopy = new ArrayList( unreadItems); @@ -430,6 +435,8 @@ public class FeedManager { adapter.open(); for (FeedItem item : unreadItemsCopy) { setFeedItem(item, adapter); + if (item.hasMedia()) + setFeedMedia(context, item.getMedia()); } adapter.close(); } diff --git a/src/de/danoeh/antennapod/feed/FeedMedia.java b/src/de/danoeh/antennapod/feed/FeedMedia.java index 55e1f9bf3..357a642a6 100644 --- a/src/de/danoeh/antennapod/feed/FeedMedia.java +++ b/src/de/danoeh/antennapod/feed/FeedMedia.java @@ -118,4 +118,8 @@ public class FeedMedia extends FeedFile { this.playbackCompletionDate = playbackCompletionDate; } + public boolean isInProgress() { + return (this.position > 0); + } + } diff --git a/src/de/danoeh/antennapod/service/PlaybackService.java b/src/de/danoeh/antennapod/service/PlaybackService.java index 0bf7ab075..bb8f95798 100644 --- a/src/de/danoeh/antennapod/service/PlaybackService.java +++ b/src/de/danoeh/antennapod/service/PlaybackService.java @@ -688,7 +688,6 @@ public class PlaybackService extends Service { .getDefaultSharedPreferences(getApplicationContext()); // Save state cancelPositionSaver(); - media.setPosition(0); media.setPlaybackCompletionDate(new Date()); manager.markItemRead(PlaybackService.this, media.getItem(), true); FeedItem nextItem = manager diff --git a/src/de/danoeh/antennapod/util/menuhandler/FeedItemMenuHandler.java b/src/de/danoeh/antennapod/util/menuhandler/FeedItemMenuHandler.java index 91f199ce0..d6bc79ade 100644 --- a/src/de/danoeh/antennapod/util/menuhandler/FeedItemMenuHandler.java +++ b/src/de/danoeh/antennapod/util/menuhandler/FeedItemMenuHandler.java @@ -50,8 +50,8 @@ public class FeedItemMenuHandler { selectedItem.getLink() != null); menu.findItem(R.id.mark_unread_item).setVisible( - selectedItem.isRead() && AppConfig.DEBUG); - menu.findItem(R.id.mark_read_item).setVisible(!selectedItem.isRead()); + selectedItem.isRead() || selectedItem.isInProgress()); + menu.findItem(R.id.mark_read_item).setVisible(!selectedItem.isRead() || selectedItem.isInProgress()); if (selectedItem.getLink() != null) { menu.findItem(R.id.visit_website_item).setVisible(true);