Merge pull request #2352 from mfietz/bugfix/1183-update-images

Update feed and item images
This commit is contained in:
Martin Fietz 2017-06-05 16:32:07 +02:00 committed by GitHub
commit b3a879dd8f
12 changed files with 245 additions and 122 deletions

View File

@ -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) {

View File

@ -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

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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());
}
}

View File

@ -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);
}
}

View File

@ -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());
}
}

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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.

View File

@ -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.