Merge pull request #2352 from mfietz/bugfix/1183-update-images
Update feed and item images
This commit is contained in:
commit
b3a879dd8f
@ -218,58 +218,43 @@ public class DBReaderTest extends InstrumentationTestCase {
|
||||
}
|
||||
}
|
||||
|
||||
private List<FeedItem> saveUnreadItems(int numItems) {
|
||||
if (numItems <= 0) {
|
||||
throw new IllegalArgumentException("numItems<=0");
|
||||
}
|
||||
private List<FeedItem> saveNewItems(int numItems) {
|
||||
List<Feed> feeds = saveFeedlist(numItems, numItems, true);
|
||||
List<FeedItem> items = new ArrayList<>();
|
||||
for (Feed f : feeds) {
|
||||
items.addAll(f.getItems());
|
||||
}
|
||||
List<FeedItem> unread = new ArrayList<>();
|
||||
List<FeedItem> newItems = new ArrayList<>();
|
||||
Random random = new Random();
|
||||
|
||||
while (unread.size() < numItems) {
|
||||
while (newItems.size() < numItems) {
|
||||
int i = random.nextInt(numItems);
|
||||
if (!unread.contains(items.get(i))) {
|
||||
if (!newItems.contains(items.get(i))) {
|
||||
FeedItem item = items.get(i);
|
||||
item.setPlayed(false);
|
||||
unread.add(item);
|
||||
item.setNew();
|
||||
newItems.add(item);
|
||||
}
|
||||
}
|
||||
PodDBAdapter adapter = PodDBAdapter.getInstance();
|
||||
adapter.open();
|
||||
adapter.setFeedItemlist(unread);
|
||||
adapter.setFeedItemlist(newItems);
|
||||
adapter.close();
|
||||
return unread;
|
||||
}
|
||||
|
||||
public void testGetUnreadItemsList() {
|
||||
final int numItems = 10;
|
||||
|
||||
List<FeedItem> unread = saveUnreadItems(numItems);
|
||||
List<FeedItem> unreadSaved = DBReader.getUnreadItemsList();
|
||||
assertNotNull(unreadSaved);
|
||||
assertTrue(unread.size() == unreadSaved.size());
|
||||
for (FeedItem item : unreadSaved) {
|
||||
assertFalse(item.isPlayed());
|
||||
}
|
||||
return newItems;
|
||||
}
|
||||
|
||||
public void testGetNewItemIds() {
|
||||
final int numItems = 10;
|
||||
|
||||
List<FeedItem> unread = saveUnreadItems(numItems);
|
||||
long[] unreadIds = new long[unread.size()];
|
||||
for (int i = 0; i < unread.size(); i++) {
|
||||
unreadIds[i] = unread.get(i).getId();
|
||||
List<FeedItem> newItems = saveNewItems(numItems);
|
||||
long[] unreadIds = new long[newItems.size()];
|
||||
for (int i = 0; i < newItems.size(); i++) {
|
||||
unreadIds[i] = newItems.get(i).getId();
|
||||
}
|
||||
List<FeedItem> unreadSaved = DBReader.getUnreadItemsList();
|
||||
assertNotNull(unreadSaved);
|
||||
assertTrue(unread.size() == unreadSaved.size());
|
||||
for(int i=0; i < unreadSaved.size(); i++) {
|
||||
long savedId = unreadSaved.get(i).getId();
|
||||
List<FeedItem> newItemsSaved = DBReader.getNewItemsList();
|
||||
assertNotNull(newItemsSaved);
|
||||
assertTrue(newItems.size() == newItemsSaved.size());
|
||||
for(int i=0; i < newItemsSaved.size(); i++) {
|
||||
long savedId = newItemsSaved.get(i).getId();
|
||||
boolean found = false;
|
||||
for (long id : unreadIds) {
|
||||
if (id == savedId) {
|
||||
|
@ -228,7 +228,7 @@ public class FeedInfoActivity extends AppCompatActivity {
|
||||
cbxAutoDownload.setChecked(prefs.getAutoDownload());
|
||||
cbxAutoDownload.setOnCheckedChangeListener((compoundButton, checked) -> {
|
||||
feed.getPreferences().setAutoDownload(checked);
|
||||
feed.savePreferences(FeedInfoActivity.this);
|
||||
feed.savePreferences();
|
||||
updateAutoDownloadSettings();
|
||||
ApplyToEpisodesDialog dialog = new ApplyToEpisodesDialog(FeedInfoActivity.this,
|
||||
feed, checked);
|
||||
@ -237,7 +237,7 @@ public class FeedInfoActivity extends AppCompatActivity {
|
||||
cbxKeepUpdated.setChecked(prefs.getKeepUpdated());
|
||||
cbxKeepUpdated.setOnCheckedChangeListener((compoundButton, checked) -> {
|
||||
feed.getPreferences().setKeepUpdated(checked);
|
||||
feed.savePreferences(FeedInfoActivity.this);
|
||||
feed.savePreferences();
|
||||
});
|
||||
spnAutoDelete.setOnItemSelectedListener(new OnItemSelectedListener() {
|
||||
@Override
|
||||
|
@ -110,6 +110,8 @@ public class ItemlistFragment extends ListFragment {
|
||||
|
||||
private TextView txtvTitle;
|
||||
private IconTextView txtvFailure;
|
||||
private ImageView imgvBackground;
|
||||
private ImageView imgvCover;
|
||||
|
||||
private TextView txtvInformation;
|
||||
|
||||
@ -471,6 +473,7 @@ public class ItemlistFragment extends ListFragment {
|
||||
Log.e(TAG, "Unable to refresh header view");
|
||||
return;
|
||||
}
|
||||
loadFeedImage();
|
||||
if(feed.hasLastUpdateFailed()) {
|
||||
txtvFailure.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
@ -508,8 +511,8 @@ public class ItemlistFragment extends ListFragment {
|
||||
|
||||
txtvTitle = (TextView) header.findViewById(R.id.txtvTitle);
|
||||
TextView txtvAuthor = (TextView) header.findViewById(R.id.txtvAuthor);
|
||||
ImageView imgvBackground = (ImageView) header.findViewById(R.id.imgvBackground);
|
||||
ImageView imgvCover = (ImageView) header.findViewById(R.id.imgvCover);
|
||||
imgvBackground = (ImageView) header.findViewById(R.id.imgvBackground);
|
||||
imgvCover = (ImageView) header.findViewById(R.id.imgvCover);
|
||||
ImageButton butShowInfo = (ImageButton) header.findViewById(R.id.butShowInfo);
|
||||
txtvInformation = (TextView) header.findViewById(R.id.txtvInformation);
|
||||
txtvFailure = (IconTextView) header.findViewById(R.id.txtvFailure);
|
||||
@ -521,6 +524,20 @@ public class ItemlistFragment extends ListFragment {
|
||||
// https://github.com/bumptech/glide/issues/529
|
||||
imgvBackground.setColorFilter(new LightingColorFilter(0xff828282, 0x000000));
|
||||
|
||||
loadFeedImage();
|
||||
|
||||
butShowInfo.setOnClickListener(v -> {
|
||||
if (viewsCreated && itemsLoaded) {
|
||||
Intent startIntent = new Intent(getActivity(), FeedInfoActivity.class);
|
||||
startIntent.putExtra(FeedInfoActivity.EXTRA_FEED_ID,
|
||||
feed.getId());
|
||||
startActivity(startIntent);
|
||||
}
|
||||
});
|
||||
headerCreated = true;
|
||||
}
|
||||
|
||||
private void loadFeedImage() {
|
||||
Glide.with(getActivity())
|
||||
.load(feed.getImageLocation())
|
||||
.placeholder(R.color.image_readability_tint)
|
||||
@ -538,16 +555,6 @@ public class ItemlistFragment extends ListFragment {
|
||||
.fitCenter()
|
||||
.dontAnimate()
|
||||
.into(imgvCover);
|
||||
|
||||
butShowInfo.setOnClickListener(v -> {
|
||||
if (viewsCreated && itemsLoaded) {
|
||||
Intent startIntent = new Intent(getActivity(), FeedInfoActivity.class);
|
||||
startIntent.putExtra(FeedInfoActivity.EXTRA_FEED_ID,
|
||||
feed.getId());
|
||||
startActivity(startIntent);
|
||||
}
|
||||
});
|
||||
headerCreated = true;
|
||||
}
|
||||
|
||||
|
||||
|
@ -0,0 +1,9 @@
|
||||
package de.danoeh.antennapod.core.feed;
|
||||
|
||||
public class FeedImageMother {
|
||||
|
||||
public static FeedImage anyFeedImage() {
|
||||
return new FeedImage(0, "image", null, "http://example.com/picture", false);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package de.danoeh.antennapod.core.feed;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import static de.danoeh.antennapod.core.feed.FeedImageMother.anyFeedImage;
|
||||
import static de.danoeh.antennapod.core.feed.FeedMother.anyFeed;
|
||||
|
||||
class FeedItemMother {
|
||||
|
||||
static FeedItem anyFeedItemWithImage() {
|
||||
FeedItem item = new FeedItem(0, "Item", "Item", "url", new Date(), FeedItem.PLAYED, anyFeed());
|
||||
item.setImage(anyFeedImage());
|
||||
return item;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,65 @@
|
||||
package de.danoeh.antennapod.core.feed;
|
||||
|
||||
import android.test.AndroidTestCase;
|
||||
|
||||
import static de.danoeh.antennapod.core.feed.FeedItemMother.anyFeedItemWithImage;
|
||||
|
||||
public class FeedItemTest extends AndroidTestCase {
|
||||
|
||||
private FeedItem original;
|
||||
private FeedImage originalImage;
|
||||
private FeedItem changedFeedItem;
|
||||
|
||||
@Override
|
||||
protected void setUp() {
|
||||
original = anyFeedItemWithImage();
|
||||
originalImage = original.getImage();
|
||||
changedFeedItem = anyFeedItemWithImage();
|
||||
}
|
||||
|
||||
public void testUpdateFromOther_feedItemImageDownloadUrlChanged() throws Exception {
|
||||
setNewFeedItemImageDownloadUrl();
|
||||
|
||||
original.updateFromOther(changedFeedItem);
|
||||
|
||||
feedItemImageWasUpdated();
|
||||
}
|
||||
|
||||
public void testUpdateFromOther_feedItemImageRemoved() throws Exception {
|
||||
feedItemImageRemoved();
|
||||
|
||||
original.updateFromOther(changedFeedItem);
|
||||
|
||||
feedItemImageWasNotUpdated();
|
||||
}
|
||||
|
||||
public void testUpdateFromOther_feedItemImageAdded() throws Exception {
|
||||
feedItemHadNoImage();
|
||||
setNewFeedItemImageDownloadUrl();
|
||||
|
||||
original.updateFromOther(changedFeedItem);
|
||||
|
||||
feedItemImageWasUpdated();
|
||||
}
|
||||
|
||||
private void feedItemHadNoImage() {
|
||||
original.setImage(null);
|
||||
}
|
||||
|
||||
private void setNewFeedItemImageDownloadUrl() {
|
||||
changedFeedItem.getImage().setDownload_url("http://example.com/new_picture");
|
||||
}
|
||||
|
||||
private void feedItemImageRemoved() {
|
||||
changedFeedItem.setImage(null);
|
||||
}
|
||||
|
||||
private void feedItemImageWasUpdated() {
|
||||
assertEquals(original.getImage().getDownload_url(), changedFeedItem.getImage().getDownload_url());
|
||||
}
|
||||
|
||||
private void feedItemImageWasNotUpdated() {
|
||||
assertTrue(originalImage == original.getImage());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package de.danoeh.antennapod.core.feed;
|
||||
|
||||
import static de.danoeh.antennapod.core.feed.FeedImageMother.anyFeedImage;
|
||||
|
||||
public class FeedMother {
|
||||
|
||||
public static Feed anyFeed() {
|
||||
FeedImage image = anyFeedImage();
|
||||
return new Feed(0, null, "title", "http://example.com", "This is the description",
|
||||
"http://example.com/payment", "Daniel", "en", null, "http://example.com/feed", image,
|
||||
null, "http://example.com/feed", true);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,92 @@
|
||||
package de.danoeh.antennapod.core.feed;
|
||||
|
||||
import android.test.AndroidTestCase;
|
||||
|
||||
import static de.danoeh.antennapod.core.feed.FeedImageMother.anyFeedImage;
|
||||
import static de.danoeh.antennapod.core.feed.FeedMother.anyFeed;
|
||||
|
||||
public class FeedTest extends AndroidTestCase {
|
||||
|
||||
private Feed original;
|
||||
private FeedImage originalImage;
|
||||
private Feed changedFeed;
|
||||
|
||||
@Override
|
||||
protected void setUp() {
|
||||
original = anyFeed();
|
||||
originalImage = original.getImage();
|
||||
changedFeed = anyFeed();
|
||||
}
|
||||
|
||||
public void testCompareWithOther_feedImageDownloadUrlChanged() throws Exception {
|
||||
setNewFeedImageDownloadUrl();
|
||||
|
||||
feedHasChanged();
|
||||
}
|
||||
|
||||
public void testCompareWithOther_sameFeedImage() throws Exception {
|
||||
changedFeed.setImage(anyFeedImage());
|
||||
|
||||
feedHasNotChanged();
|
||||
}
|
||||
|
||||
public void testCompareWithOther_feedImageRemoved() throws Exception {
|
||||
feedImageRemoved();
|
||||
|
||||
feedHasNotChanged();
|
||||
}
|
||||
|
||||
public void testUpdateFromOther_feedImageDownloadUrlChanged() throws Exception {
|
||||
setNewFeedImageDownloadUrl();
|
||||
|
||||
original.updateFromOther(changedFeed);
|
||||
|
||||
feedImageWasUpdated();
|
||||
}
|
||||
|
||||
public void testUpdateFromOther_feedImageRemoved() throws Exception {
|
||||
feedImageRemoved();
|
||||
|
||||
original.updateFromOther(changedFeed);
|
||||
|
||||
feedImageWasNotUpdated();
|
||||
}
|
||||
|
||||
public void testUpdateFromOther_feedImageAdded() throws Exception {
|
||||
feedHadNoImage();
|
||||
setNewFeedImageDownloadUrl();
|
||||
|
||||
original.updateFromOther(changedFeed);
|
||||
|
||||
feedImageWasUpdated();
|
||||
}
|
||||
|
||||
private void feedHasNotChanged() {
|
||||
assertFalse(original.compareWithOther(changedFeed));
|
||||
}
|
||||
|
||||
private void feedHadNoImage() {
|
||||
original.setImage(null);
|
||||
}
|
||||
|
||||
private void setNewFeedImageDownloadUrl() {
|
||||
changedFeed.getImage().setDownload_url("http://example.com/new_picture");
|
||||
}
|
||||
|
||||
private void feedHasChanged() {
|
||||
assertTrue(original.compareWithOther(changedFeed));
|
||||
}
|
||||
|
||||
private void feedImageRemoved() {
|
||||
changedFeed.setImage(null);
|
||||
}
|
||||
|
||||
private void feedImageWasUpdated() {
|
||||
assertEquals(original.getImage().getDownload_url(), changedFeed.getImage().getDownload_url());
|
||||
}
|
||||
|
||||
private void feedImageWasNotUpdated() {
|
||||
assertTrue(originalImage == original.getImage());
|
||||
}
|
||||
|
||||
}
|
@ -1,6 +1,5 @@
|
||||
package de.danoeh.antennapod.core.feed;
|
||||
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.text.TextUtils;
|
||||
@ -21,9 +20,9 @@ import de.danoeh.antennapod.core.util.flattr.FlattrThing;
|
||||
* @author daniel
|
||||
*/
|
||||
public class Feed extends FeedFile implements FlattrThing, ImageResource {
|
||||
|
||||
public static final int FEEDFILETYPE_FEED = 0;
|
||||
public static final String TYPE_RSS2 = "rss";
|
||||
public static final String TYPE_RSS091 = "rss";
|
||||
public static final String TYPE_ATOM1 = "atom";
|
||||
|
||||
/* title as defined by the feed */
|
||||
@ -221,33 +220,6 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource {
|
||||
return feed;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns true if at least one item in the itemlist is unread.
|
||||
*
|
||||
*/
|
||||
public boolean hasNewItems() {
|
||||
for (FeedItem item : items) {
|
||||
if (item.isNew()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if at least one item in the itemlist is unread.
|
||||
*
|
||||
*/
|
||||
public boolean hasUnplayedItems() {
|
||||
for (FeedItem item : items) {
|
||||
if (!item.isNew() && !item.isPlayed()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of FeedItems.
|
||||
*
|
||||
@ -294,6 +266,9 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource {
|
||||
public void updateFromOther(Feed other) {
|
||||
// don't update feed's download_url, we do that manually if redirected
|
||||
// see AntennapodHttpClient
|
||||
if (other.image != null) {
|
||||
this.image = other.image;
|
||||
}
|
||||
if (other.feedTitle != null) {
|
||||
feedTitle = other.feedTitle;
|
||||
}
|
||||
@ -330,6 +305,9 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource {
|
||||
if (super.compareWithOther(other)) {
|
||||
return true;
|
||||
}
|
||||
if(other.image != null && !TextUtils.equals(image.download_url, other.image.download_url)) {
|
||||
return true;
|
||||
}
|
||||
if (!TextUtils.equals(feedTitle, other.feedTitle)) {
|
||||
return true;
|
||||
}
|
||||
@ -511,7 +489,7 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource {
|
||||
return preferences;
|
||||
}
|
||||
|
||||
public void savePreferences(Context context) {
|
||||
public void savePreferences() {
|
||||
DBWriter.setFeedPreferences(preferences);
|
||||
}
|
||||
|
||||
|
@ -177,6 +177,9 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, Flattr
|
||||
|
||||
public void updateFromOther(FeedItem other) {
|
||||
super.updateFromOther(other);
|
||||
if (other.image != null) {
|
||||
this.image = other.image;
|
||||
}
|
||||
if (other.title != null) {
|
||||
title = other.title;
|
||||
}
|
||||
|
@ -371,30 +371,6 @@ public final class DBReader {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a list of FeedItems whose 'read'-attribute is set to false.
|
||||
*
|
||||
* @return A list of FeedItems whose 'read'-attribute it set to false.
|
||||
*/
|
||||
public static List<FeedItem> getUnreadItemsList() {
|
||||
Log.d(TAG, "getUnreadItemsList() called");
|
||||
|
||||
PodDBAdapter adapter = PodDBAdapter.getInstance();
|
||||
adapter.open();
|
||||
Cursor cursor = null;
|
||||
try {
|
||||
cursor = adapter.getUnreadItemsCursor();
|
||||
List<FeedItem> items = extractItemlistFromCursor(adapter, cursor);
|
||||
loadAdditionalFeedItemListData(items);
|
||||
return items;
|
||||
} finally {
|
||||
if (cursor != null) {
|
||||
cursor.close();
|
||||
}
|
||||
adapter.close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a list of FeedItems that are considered new.
|
||||
* Excludes items from feeds that do not have keep updated enabled.
|
||||
|
@ -1249,15 +1249,6 @@ public class PodDBAdapter {
|
||||
return db.rawQuery(query, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a cursor which contains all feed items in the unread items list.
|
||||
* The returned cursor uses the FEEDITEM_SEL_FI_SMALL selection.
|
||||
*/
|
||||
public final Cursor getUnreadItemsCursor() {
|
||||
return db.query(TABLE_NAME_FEED_ITEMS, FEEDITEM_SEL_FI_SMALL, KEY_READ
|
||||
+ "<" + FeedItem.PLAYED, null, null, null, KEY_PUBDATE + " DESC");
|
||||
}
|
||||
|
||||
public void setFeedItems(int state) {
|
||||
setFeedItems(Integer.MIN_VALUE, state, 0);
|
||||
}
|
||||
@ -1282,19 +1273,6 @@ public class PodDBAdapter {
|
||||
db.execSQL(sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a cursor which contains all items of a feed that are considered new.
|
||||
* The returned cursor uses the FEEDITEM_SEL_FI_SMALL selection.
|
||||
*/
|
||||
public final Cursor getNewItemsIdsCursor(long feedId) {
|
||||
final String query = "SELECT " + KEY_ID
|
||||
+ " FROM " + TABLE_NAME_FEED_ITEMS
|
||||
+ " WHERE " + KEY_FEED + "=" + feedId
|
||||
+ " AND " + KEY_READ + "=" + FeedItem.NEW
|
||||
+ " ORDER BY " + KEY_PUBDATE + " DESC";
|
||||
return db.rawQuery(query, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a cursor which contains all feed items that are considered new.
|
||||
* Excludes those feeds that do not have 'Keep Updated' enabled.
|
||||
|
Loading…
x
Reference in New Issue
Block a user