Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
3d1f495
With media client APIs migrated to retrofit (#2998)
maskaravivek Jun 20, 2019
33e9c75
Merge branch 'master' into backend-overhaul
maskaravivek Jun 24, 2019
52284b8
Categories related client API's migrated to retrofit (#3053)
ilgazer Jul 5, 2019
b1a3c14
With media client APIs migrated to retrofit (#2998)
maskaravivek Jun 20, 2019
75e48e5
Categories related client API's migrated to retrofit (#3053)
ilgazer Jul 5, 2019
7565861
OkHttpJsonApi#getMediaList migrated to retrofit (#3054)
ilgazer Jul 6, 2019
7ad9d8f
getSubCategoryList and getParentCategoryList migrated to retrofit (#3…
ilgazer Jul 6, 2019
2464f7f
Migrated OkHttpJsonApiClient#getMedia and getPictureOfTheDay to Media…
ilgazer Jul 6, 2019
de7293f
Removed obsolete functions and added tests
ilgazer Jul 6, 2019
8f39e5f
Merge branch 'refs/heads/commons-app/backend-overhaul' into _backend-…
ilgazer Jul 6, 2019
df283d8
Fixed merge errors
ilgazer Jul 6, 2019
781448d
With media client APIs migrated to retrofit (#2998)
maskaravivek Jun 20, 2019
57865b0
Categories related client API's migrated to retrofit (#3053)
ilgazer Jul 5, 2019
a41aabf
OkHttpJsonApi#getMediaList migrated to retrofit (#3054)
ilgazer Jul 6, 2019
2a20720
getSubCategoryList and getParentCategoryList migrated to retrofit (#3…
ilgazer Jul 6, 2019
1faad66
Consume login client from data client library (#2894)
maskaravivek Jul 7, 2019
da1b28d
Merge branch 'backend-overhaul' into _backend-overhaul-retrofit-getMedia
ilgazer Jul 9, 2019
1533040
Merge branch 'backend-overhaul' into _backend-overhaul-retrofit-getMedia
maskaravivek Jul 15, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/src/main/java/fr/free/nrw/commons/Media.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

public class Media implements Parcelable {

public static final Media EMPTY = new Media("");
public static Creator<Media> CREATOR = new Creator<Media>() {
@Override
public Media createFromParcel(Parcel parcel) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public Single<Media> fetchMediaDetails(String filename) {
* @return return data rich Media object
*/
public Single<Media> getMediaFromFileName(String filename) {
return okHttpJsonApiClient.getMedia(filename, false);
return mediaClient.getMedia(filename);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import fr.free.nrw.commons.mwapi.MediaWikiApi;
import io.reactivex.Completable;
import io.reactivex.Observable;
import timber.log.Timber;

/**
* Manage the current logged in user session.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.bookmarks.Bookmark;
import fr.free.nrw.commons.media.MediaClient;
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
Expand All @@ -19,15 +20,14 @@
@Singleton
public class BookmarkPicturesController {

private final OkHttpJsonApiClient okHttpJsonApiClient;
private final MediaClient mediaClient;
private final BookmarkPicturesDao bookmarkDao;

private List<Bookmark> currentBookmarks;

@Inject
public BookmarkPicturesController(OkHttpJsonApiClient okHttpJsonApiClient,
BookmarkPicturesDao bookmarkDao) {
this.okHttpJsonApiClient = okHttpJsonApiClient;
public BookmarkPicturesController(MediaClient mediaClient, BookmarkPicturesDao bookmarkDao) {
this.mediaClient = mediaClient;
this.bookmarkDao = bookmarkDao;
currentBookmarks = new ArrayList<>();
}
Expand All @@ -47,7 +47,7 @@ Single<List<Media>> loadBookmarkedPictures() {

private Observable<Media> getMediaFromBookmark(Bookmark bookmark) {
Media dummyMedia = new Media("");
return okHttpJsonApiClient.getMedia(bookmark.getMediaName(), false)
return mediaClient.getMedia(bookmark.getMediaName())
.map(media -> media == null ? dummyMedia : media)
.onErrorReturn(throwable -> dummyMedia)
.toObservable();
Expand Down
57 changes: 57 additions & 0 deletions app/src/main/java/fr/free/nrw/commons/media/MediaClient.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
package fr.free.nrw.commons.media;


import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import org.wikipedia.dataclient.mwapi.MwQueryPage;
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
import org.wikipedia.dataclient.mwapi.MwQueryResult;

import java.util.Date;
import org.wikipedia.dataclient.mwapi.MwQueryResponse;

import java.util.ArrayList;
Expand All @@ -13,6 +21,13 @@
import javax.inject.Singleton;

import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.utils.CommonsDateUtil;
import io.reactivex.Observable;
import io.reactivex.Single;
import okhttp3.HttpUrl;
import okhttp3.Request;
import okhttp3.Response;
import timber.log.Timber;
import io.reactivex.Observable;
import io.reactivex.Single;

Expand Down Expand Up @@ -103,5 +118,47 @@ private Single<List<Media>> responseToMediaList(Observable<MwQueryResponse> resp
.map(Media::from)
.collect(ArrayList<Media>::new, List::add);
}

/**
* Fetches Media object from the imageInfo API
*
* @param titles the tiles to be searched for. Can be filename or template name
* @return
*/
public Single<Media> getMedia(String titles) {
return mediaInterface.getMedia(titles)
.flatMap(mwQueryResponse -> {
if (null == mwQueryResponse
|| null == mwQueryResponse.query()
|| null == mwQueryResponse.query().firstPage()) {
return Observable.empty();
}
return Observable.just(mwQueryResponse.query().firstPage());
})
.map(Media::from)
.single(Media.EMPTY);
}

/**
* The method returns the picture of the day
*
* @return Media object corresponding to the picture of the day
*/
@NonNull
public Single<Media> getPictureOfTheDay() {
String date = CommonsDateUtil.getIso8601DateFormatShort().format(new Date());
Timber.d("Current date is %s", date);
String template = "Template:Potd/" + date;
return mediaInterface.getMediaWithGenerator(template)
.flatMap(mwQueryResponse -> {
if (null == mwQueryResponse
|| null == mwQueryResponse.query()
|| null == mwQueryResponse.query().firstPage()) {
return Observable.empty();
}
return Observable.just(mwQueryResponse.query().firstPage());
})
.map(Media::from)
.single(Media.EMPTY);
}
}
25 changes: 24 additions & 1 deletion app/src/main/java/fr/free/nrw/commons/media/MediaInterface.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ public interface MediaInterface {
@GET("w/api.php?action=query&format=json&formatversion=2&list=allimages")
Observable<MwQueryResponse> checkFileExistsUsingSha(@Query("aisha1") String aisha1);


/**
* This method retrieves a list of Media objects filtered using image generator query
*
Expand Down Expand Up @@ -63,4 +62,28 @@ public interface MediaInterface {
"|Artist|LicenseShortName|LicenseUrl")
Observable<MwQueryResponse> getMediaListFromSearch(@Query("gsrsearch") String keyword, @Query("gsrlimit") int itemLimit, @QueryMap Map<String, String> continuation);

/**
* Fetches Media object from the imageInfo API
*
* @param title the tiles to be searched for. Can be filename or template name
* @return
*/
@GET("w/api.php?action=query&format=json&formatversion=2" +
"&prop=imageinfo&iiprop=url|extmetadata&iiurlwidth=640" +
"&iiextmetadatafilter=DateTime|Categories|GPSLatitude|GPSLongitude|ImageDescription|DateTimeOriginal" +
"|Artist|LicenseShortName|LicenseUrl")
Observable<MwQueryResponse> getMedia(@Query("titles") String title);

/**
* Fetches Media object from the imageInfo API
* Passes an image generator parameter
*
* @param title the tiles to be searched for. Can be filename or template name
* @return
*/
@GET("w/api.php?action=query&format=json&formatversion=2&generator=images" +
"&prop=imageinfo&iiprop=url|extmetadata&iiurlwidth=640" +
"&iiextmetadatafilter=DateTime|Categories|GPSLatitude|GPSLongitude|ImageDescription|DateTimeOriginal" +
"|Artist|LicenseShortName|LicenseUrl")
Observable<MwQueryResponse> getMediaWithGenerator(@Query("titles") String title);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.gson.Gson;

import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
Expand All @@ -24,6 +25,10 @@

import fr.free.nrw.commons.BuildConfig;
import fr.free.nrw.commons.CommonsApplication;

import fr.free.nrw.commons.BuildConfig;
import fr.free.nrw.commons.CommonsApplication;

import io.reactivex.Single;
import timber.log.Timber;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -228,58 +228,6 @@ public Single<CampaignResponseDTO> getCampaigns() {
});
}

/**
* The method returns the picture of the day
*
* @return Media object corresponding to the picture of the day
*/
@Nullable
public Single<Media> getPictureOfTheDay() {
String date = CommonsDateUtil.getIso8601DateFormatShort().format(new Date());
Timber.d("Current date is %s", date);
String template = "Template:Potd/" + date;
return getMedia(template, true);
}

/**
* Fetches Media object from the imageInfo API
*
* @param titles the tiles to be searched for. Can be filename or template name
* @param useGenerator specifies if a image generator parameter needs to be passed or not
* @return
*/
public Single<Media> getMedia(String titles, boolean useGenerator) {
HttpUrl.Builder urlBuilder = HttpUrl
.parse(commonsBaseUrl)
.newBuilder()
.addQueryParameter("action", "query")
.addQueryParameter("format", "json")
.addQueryParameter("formatversion", "2")
.addQueryParameter("titles", titles);

if (useGenerator) {
urlBuilder.addQueryParameter("generator", "images");
}

Request request = new Request.Builder()
.url(appendMediaProperties(urlBuilder).build())
.build();

return Single.fromCallable(() -> {
Response response = okHttpClient.newCall(request).execute();
if (response.body() != null && response.isSuccessful()) {
String json = response.body().string();
MwQueryResponse mwQueryPage = gson.fromJson(json, MwQueryResponse.class);
if (mwQueryPage.success() && mwQueryPage.query().firstPage() != null) {
return Media.from(mwQueryPage.query().firstPage());
}
}
return null;
});
}



/**
* Whenever imageInfo is fetched, these common properties can be specified for the API call
* https://www.mediawiki.org/wiki/API:Imageinfo
Expand Down
16 changes: 7 additions & 9 deletions app/src/main/java/fr/free/nrw/commons/review/ReviewHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,26 +25,21 @@ public class ReviewHelper {

private static final String[] imageExtensions = new String[]{".jpg", ".jpeg", ".png"};

private final OkHttpJsonApiClient okHttpJsonApiClient;
private final MediaWikiApi mediaWikiApi;
private final MediaClient mediaClient;
private final ReviewInterface reviewInterface;

@Inject
public ReviewHelper(OkHttpJsonApiClient okHttpJsonApiClient,
MediaWikiApi mediaWikiApi,
MediaClient mediaClient, ReviewInterface reviewInterface) {
this.okHttpJsonApiClient = okHttpJsonApiClient;
this.mediaWikiApi = mediaWikiApi;
public ReviewHelper(MediaClient mediaClient, ReviewInterface reviewInterface) {
this.mediaClient = mediaClient;
this.reviewInterface = reviewInterface;
}

/**
* Fetches recent changes from MediaWiki API
* Fetches recent changes from MediaWiki AP
* Calls the API to get 10 changes in the last 1 hour
* Earlier we were getting changes for the last 30 days but as the API returns just 10 results
* its best to fetch for just last 1 hour.
*
* @return
*/
private Observable<RecentChange> getRecentChanges() {
Expand Down Expand Up @@ -84,6 +79,7 @@ public Single<Media> getRandomMedia() {
/**
* Returns a proper Media object if the file is not already nominated for deletion
* Else it returns an empty Media object
*
* @param recentChange
* @return
*/
Expand All @@ -94,13 +90,14 @@ private Single<Media> getRandomMediaFromRecentChange(RecentChange recentChange)
if (isDeleted) {
return Single.just(new Media(""));
}
return okHttpJsonApiClient.getMedia(recentChange.getTitle(), false);
return mediaClient.getMedia(recentChange.getTitle());
});

}

/**
* Gets the first revision of the file from filename
*
* @param filename
* @return
*/
Expand All @@ -113,6 +110,7 @@ Observable<MwQueryPage.Revision> getFirstRevisionOfFile(String filename) {
* Checks if the change is reviewable or not.
* - checks the type and revisionId of the change
* - checks supported image extensions
*
* @param recentChange
* @return
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.contributions.MainActivity;
import fr.free.nrw.commons.di.ApplicationlessInjection;
import fr.free.nrw.commons.media.MediaClient;
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
Expand All @@ -42,7 +43,7 @@ public class PicOfDayAppWidget extends AppWidgetProvider {

private CompositeDisposable compositeDisposable = new CompositeDisposable();

@Inject OkHttpJsonApiClient okHttpJsonApiClient;
@Inject MediaClient mediaClient;

void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.pic_of_day_app_widget);
Expand All @@ -67,7 +68,7 @@ private void loadPictureOfTheDay(Context context,
RemoteViews views,
AppWidgetManager appWidgetManager,
int appWidgetId) {
compositeDisposable.add(okHttpJsonApiClient.getPictureOfTheDay()
compositeDisposable.add(mediaClient.getPictureOfTheDay()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,13 @@ class MediaDataExtractorTest {
internal var mwApi: MediaWikiApi? = null

@Mock
internal var okHttpJsonApiClient: OkHttpJsonApiClient? = null
internal var mediaClient: MediaClient? = null

@Mock
internal var mediaClient: MediaClient? = null

@Mock
internal var mediaClient: MediaClient? = null

@Mock
internal var mediaClient: MediaClient? = null
Expand All @@ -46,7 +52,7 @@ class MediaDataExtractorTest {
*/
@Test
fun fetchMediaDetails() {
`when`(okHttpJsonApiClient?.getMedia(ArgumentMatchers.anyString(), ArgumentMatchers.anyBoolean()))
`when`(mediaClient?.getMedia(ArgumentMatchers.anyString()))
.thenReturn(Single.just(mock(Media::class.java)))

`when`(mediaClient?.checkPageExistsUsingTitle(ArgumentMatchers.anyString()))
Expand Down
Loading