Fix fetching of bookmarks (#2905)

* Fix fetching of bookmarks

* With more robust tests
This commit is contained in:
Vivek Maskara 2019-04-21 17:06:31 +05:30 committed by Ashish Kumar
parent a003e9706f
commit af9d991a15
7 changed files with 143 additions and 28 deletions

View file

@ -9,8 +9,8 @@ public class Bookmark {
private String mediaName;
private String mediaCreator;
public Bookmark(String mediaName, String mediaCreator) {
this.contentUri = BookmarkPicturesContentProvider.uriForName(mediaName);
public Bookmark(String mediaName, String mediaCreator, Uri contentUri) {
this.contentUri = contentUri;
this.mediaName = mediaName == null ? "" : mediaName;
this.mediaCreator = mediaCreator == null ? "" : mediaCreator;
}

View file

@ -1,5 +1,7 @@
package fr.free.nrw.commons.bookmarks.pictures;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
@ -9,6 +11,10 @@ import javax.inject.Singleton;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.bookmarks.Bookmark;
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.Single;
import io.reactivex.functions.Function;
@Singleton
public class BookmarkPicturesController {
@ -30,22 +36,21 @@ public class BookmarkPicturesController {
* Loads the Media objects from the raw data stored in DB and the API.
* @return a list of bookmarked Media object
*/
List<Media> loadBookmarkedPictures() {
Single<List<Media>> loadBookmarkedPictures() {
List<Bookmark> bookmarks = bookmarkDao.getAllBookmarks();
currentBookmarks = bookmarks;
ArrayList<Media> medias = new ArrayList<>();
for (Bookmark bookmark : bookmarks) {
List<Media> tmpMedias = okHttpJsonApiClient
.getMediaList("search", bookmark.getMediaName())
.blockingGet();
for (Media m : tmpMedias) {
if (m.getCreator().trim().equals(bookmark.getMediaCreator().trim())) {
medias.add(m);
break;
}
}
}
return medias;
return Observable.fromIterable(bookmarks)
.flatMap((Function<Bookmark, ObservableSource<Media>>) this::getMediaFromBookmark)
.filter(media -> media != null && !StringUtils.isBlank(media.getFilename()))
.toList();
}
private Observable<Media> getMediaFromBookmark(Bookmark bookmark) {
Media dummyMedia = new Media("");
return okHttpJsonApiClient.getMedia(bookmark.getMediaName(), false)
.map(media -> media == null ? dummyMedia : media)
.onErrorReturn(throwable -> dummyMedia)
.toObservable();
}
/**
@ -54,10 +59,7 @@ public class BookmarkPicturesController {
*/
boolean needRefreshBookmarkedPictures() {
List<Bookmark> bookmarks = bookmarkDao.getAllBookmarks();
if (bookmarks.size() == currentBookmarks.size()) {
return false;
}
return true;
return bookmarks.size() != currentBookmarks.size();
}
/**

View file

@ -149,9 +149,11 @@ public class BookmarkPicturesDao {
@NonNull
Bookmark fromCursor(Cursor cursor) {
String fileName = cursor.getString(cursor.getColumnIndex(Table.COLUMN_MEDIA_NAME));
return new Bookmark(
cursor.getString(cursor.getColumnIndex(Table.COLUMN_MEDIA_NAME)),
cursor.getString(cursor.getColumnIndex(Table.COLUMN_CREATOR))
fileName,
cursor.getString(cursor.getColumnIndex(Table.COLUMN_CREATOR)),
BookmarkPicturesContentProvider.uriForName(fileName)
);
}

View file

@ -2,8 +2,6 @@ package fr.free.nrw.commons.bookmarks.pictures;
import android.annotation.SuppressLint;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -19,6 +17,8 @@ import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import butterknife.BindView;
import butterknife.ButterKnife;
import dagger.android.support.DaggerFragment;
@ -28,7 +28,6 @@ import fr.free.nrw.commons.bookmarks.BookmarksActivity;
import fr.free.nrw.commons.category.GridViewAdapter;
import fr.free.nrw.commons.utils.NetworkUtils;
import fr.free.nrw.commons.utils.ViewUtil;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.schedulers.Schedulers;
@ -121,7 +120,7 @@ public class BookmarkPicturesFragment extends DaggerFragment {
progressBar.setVisibility(VISIBLE);
statusTextView.setVisibility(GONE);
compositeDisposable.add(Observable.fromCallable(() -> controller.loadBookmarkedPictures())
compositeDisposable.add(controller.loadBookmarkedPictures()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.timeout(TIMEOUT_SECONDS, TimeUnit.SECONDS)

View file

@ -30,6 +30,7 @@ import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.auth.SessionManager;
import fr.free.nrw.commons.bookmarks.Bookmark;
import fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesContentProvider;
import fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesDao;
import fr.free.nrw.commons.category.CategoryDetailsActivity;
import fr.free.nrw.commons.category.CategoryImagesActivity;
@ -262,7 +263,8 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple
// Initialize bookmark object
bookmark = new Bookmark(
m.getFilename(),
m.getCreator()
m.getCreator(),
BookmarkPicturesContentProvider.uriForName(m.getFilename())
);
updateBookmarkState(menu.findItem(R.id.menu_bookmark_current_image));