Skip to content

Commit 0090f24

Browse files
authored
Merge branch 'backend-overhaul' into master
2 parents 9bccbfe + 386d087 commit 0090f24

File tree

76 files changed

+1816
-3472
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+1816
-3472
lines changed

app/build.gradle

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
plugins {
22
id 'com.github.triplet.play' version '2.2.1' apply false
33
}
4-
54
apply from: '../gitutils.gradle'
65
apply plugin: 'com.android.application'
76
apply plugin: 'kotlin-android'
@@ -31,8 +30,8 @@ dependencies {
3130
implementation 'com.jakewharton.rxbinding2:rxbinding-design:2.1.1'
3231
implementation 'com.facebook.fresco:fresco:1.13.0'
3332
implementation 'com.drewnoakes:metadata-extractor:2.11.0'
34-
implementation 'com.dmitrybrant:wikimedia-android-data-client:0.0.18'
3533
implementation 'org.apache.commons:commons-lang3:3.8.1'
34+
implementation 'com.dmitrybrant:wikimedia-android-data-client:0.0.25'
3635

3736
// UI
3837
implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar'
@@ -195,6 +194,7 @@ android {
195194
buildConfigField "String", "IMAGE_URL_BASE", "\"https://upload.wikimedia.org/wikipedia/commons\""
196195
buildConfigField "String", "HOME_URL", "\"https://commons.wikimedia.org/wiki/\""
197196
buildConfigField "String", "COMMONS_URL", "\"https://commons.wikimedia.org\""
197+
buildConfigField "String", "WIKIDATA_URL", "\"https://wikidata.org\""
198198
buildConfigField "String", "MOBILE_HOME_URL", "\"https://commons.m.wikimedia.org/wiki/\""
199199
buildConfigField "String", "SIGNUP_LANDING_URL", "\"https://commons.m.wikimedia.org/w/index.php?title=Special:CreateAccount&returnto=Main+Page&returntoquery=welcome%3Dyes\""
200200
buildConfigField "String", "SIGNUP_SUCCESS_REDIRECTION_URL", "\"https://commons.m.wikimedia.org/w/index.php?title=Main_Page&welcome=yes\""
@@ -226,6 +226,7 @@ android {
226226
buildConfigField "String", "IMAGE_URL_BASE", "\"https://upload.beta.wmflabs.org/wikipedia/commons\""
227227
buildConfigField "String", "HOME_URL", "\"https://commons.wikimedia.beta.wmflabs.org/wiki/\""
228228
buildConfigField "String", "COMMONS_URL", "\"https://commons.wikimedia.beta.wmflabs.org\""
229+
buildConfigField "String", "WIKIDATA_URL", "\"https://wikidata.org\""
229230
buildConfigField "String", "MOBILE_HOME_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/wiki/\""
230231
buildConfigField "String", "SIGNUP_LANDING_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/w/index.php?title=Special:CreateAccount&returnto=Main+Page&returntoquery=welcome%3Dyes\""
231232
buildConfigField "String", "SIGNUP_SUCCESS_REDIRECTION_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/w/index.php?title=Main_Page&welcome=yes\""

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,8 @@
152152
</service>
153153
<service
154154
android:name=".contributions.ContributionsSyncService"
155-
android:exported="true">
155+
android:exported="true"
156+
android:process=":sync">
156157
<intent-filter>
157158
<action android:name="android.content.SyncAdapter" />
158159
</intent-filter>
@@ -161,17 +162,6 @@
161162
android:name="android.content.SyncAdapter"
162163
android:resource="@xml/contributions_sync_adapter" />
163164
</service>
164-
<service
165-
android:name=".modifications.ModificationsSyncService"
166-
android:exported="true">
167-
<intent-filter>
168-
<action android:name="android.content.SyncAdapter" />
169-
</intent-filter>
170-
171-
<meta-data
172-
android:name="android.content.SyncAdapter"
173-
android:resource="@xml/modifications_sync_adapter" />
174-
</service>
175165

176166
<service
177167
android:name="org.acra.sender.SenderService"
@@ -193,12 +183,7 @@
193183
android:exported="false"
194184
android:label="@string/provider_contributions"
195185
android:syncable="true" />
196-
<provider
197-
android:name=".modifications.ModificationsContentProvider"
198-
android:authorities="${applicationId}.modifications.contentprovider"
199-
android:exported="false"
200-
android:label="@string/provider_modifications"
201-
android:syncable="true" />
186+
202187
<provider
203188
android:name=".category.CategoryContentProvider"
204189
android:authorities="${applicationId}.categories.contentprovider"

app/src/main/java/fr/free/nrw/commons/CommonsAppAdapter.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,16 @@ public String getPassword() {
6161

6262
@Override
6363
public void updateAccount(@NonNull LoginResult result) {
64-
// TODO: sessionManager.updateAccount(result);
64+
sessionManager.updateAccount(result);
6565
}
6666

6767
@Override
6868
public SharedPreferenceCookieManager getCookies() {
6969
if (!preferences.contains(COOKIE_STORE_NAME)) {
7070
return null;
7171
}
72-
return GsonUnmarshaller.unmarshal(SharedPreferenceCookieManager.class, preferences.getString(COOKIE_STORE_NAME, null));
72+
return GsonUnmarshaller.unmarshal(SharedPreferenceCookieManager.class,
73+
preferences.getString(COOKIE_STORE_NAME, null));
7374
}
7475

7576
@Override

app/src/main/java/fr/free/nrw/commons/CommonsApplication.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import android.os.Process;
1111
import android.util.Log;
1212

13+
import androidx.annotation.NonNull;
14+
1315
import com.facebook.drawee.backends.pipeline.Fresco;
1416
import com.facebook.imagepipeline.core.ImagePipelineConfig;
1517
import com.squareup.leakcanary.LeakCanary;
@@ -28,7 +30,6 @@
2830
import javax.inject.Inject;
2931
import javax.inject.Named;
3032

31-
import androidx.annotation.NonNull;
3233
import fr.free.nrw.commons.auth.SessionManager;
3334
import fr.free.nrw.commons.bookmarks.locations.BookmarkLocationsDao;
3435
import fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesDao;
@@ -41,7 +42,6 @@
4142
import fr.free.nrw.commons.kvstore.JsonKvStore;
4243
import fr.free.nrw.commons.logging.FileLoggingTree;
4344
import fr.free.nrw.commons.logging.LogUtils;
44-
import fr.free.nrw.commons.modifications.ModifierSequenceDao;
4545
import fr.free.nrw.commons.upload.FileUtils;
4646
import fr.free.nrw.commons.utils.ConfigUtils;
4747
import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -265,7 +265,6 @@ private void updateAllDatabases() {
265265
dbOpenHelper.getReadableDatabase().close();
266266
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
267267

268-
ModifierSequenceDao.Table.onDelete(db);
269268
CategoryDao.Table.onDelete(db);
270269
ContributionDao.Table.onDelete(db);
271270
BookmarkPicturesDao.Table.onDelete(db);

app/src/main/java/fr/free/nrw/commons/Media.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
import android.os.Parcel;
55
import android.os.Parcelable;
66

7+
import androidx.annotation.NonNull;
8+
import androidx.annotation.Nullable;
9+
710
import org.apache.commons.lang3.StringUtils;
811
import org.wikipedia.dataclient.mwapi.MwQueryPage;
912
import org.wikipedia.gallery.ExtMetadata;
@@ -20,14 +23,13 @@
2023
import java.util.Locale;
2124
import java.util.Map;
2225

23-
import androidx.annotation.NonNull;
24-
import androidx.annotation.Nullable;
2526
import fr.free.nrw.commons.location.LatLng;
2627
import fr.free.nrw.commons.utils.CommonsDateUtil;
2728
import fr.free.nrw.commons.utils.MediaDataExtractorUtil;
2829

2930
public class Media implements Parcelable {
3031

32+
public static final Media EMPTY = new Media("");
3133
public static Creator<Media> CREATOR = new Creator<Media>() {
3234
@Override
3335
public Media createFromParcel(Parcel parcel) {
@@ -156,9 +158,9 @@ public static Media from(MwQueryPage page) {
156158
page.title(),
157159
"",
158160
0,
159-
safeParseDate(metadata.dateTimeOriginal().value()),
160-
safeParseDate(metadata.dateTime().value()),
161-
StringUtil.fromHtml(metadata.artist().value()).toString()
161+
safeParseDate(metadata.dateTime()),
162+
safeParseDate(metadata.dateTime()),
163+
StringUtil.fromHtml(metadata.artist()).toString()
162164
);
163165

164166
if (!StringUtils.isBlank(imageInfo.getThumbUrl())) {
@@ -170,17 +172,17 @@ public static Media from(MwQueryPage page) {
170172
language = "default";
171173
}
172174

173-
media.setDescriptions(Collections.singletonMap(language, metadata.imageDescription().value()));
174-
media.setCategories(MediaDataExtractorUtil.extractCategoriesFromList(metadata.categories().value()));
175-
String latitude = metadata.gpsLatitude().value();
176-
String longitude = metadata.gpsLongitude().value();
175+
media.setDescriptions(Collections.singletonMap(language, metadata.imageDescription()));
176+
media.setCategories(MediaDataExtractorUtil.extractCategoriesFromList(metadata.getCategories()));
177+
String latitude = metadata.getGpsLatitude();
178+
String longitude = metadata.getGpsLongitude();
177179

178180
if (!StringUtils.isBlank(latitude) && !StringUtils.isBlank(longitude)) {
179181
LatLng latLng = new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude), 0);
180182
media.setCoordinates(latLng);
181183
}
182184

183-
media.setLicenseInformation(metadata.licenseShortName().value(), metadata.licenseUrl().value());
185+
media.setLicenseInformation(metadata.licenseShortName(), metadata.licenseUrl());
184186
return media;
185187
}
186188

app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package fr.free.nrw.commons;
22

3+
import androidx.core.text.HtmlCompat;
4+
35
import javax.inject.Inject;
46
import javax.inject.Singleton;
57

6-
import androidx.core.text.HtmlCompat;
8+
import fr.free.nrw.commons.media.MediaClient;
79
import fr.free.nrw.commons.mwapi.MediaWikiApi;
810
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
911
import io.reactivex.Single;
@@ -19,12 +21,15 @@
1921
public class MediaDataExtractor {
2022
private final MediaWikiApi mediaWikiApi;
2123
private final OkHttpJsonApiClient okHttpJsonApiClient;
24+
private final MediaClient mediaClient;
2225

2326
@Inject
2427
public MediaDataExtractor(MediaWikiApi mwApi,
25-
OkHttpJsonApiClient okHttpJsonApiClient) {
28+
OkHttpJsonApiClient okHttpJsonApiClient,
29+
MediaClient mediaClient) {
2630
this.okHttpJsonApiClient = okHttpJsonApiClient;
2731
this.mediaWikiApi = mwApi;
32+
this.mediaClient = mediaClient;
2833
}
2934

3035
/**
@@ -35,7 +40,7 @@ public MediaDataExtractor(MediaWikiApi mwApi,
3540
*/
3641
public Single<Media> fetchMediaDetails(String filename) {
3742
Single<Media> mediaSingle = getMediaFromFileName(filename);
38-
Single<Boolean> pageExistsSingle = mediaWikiApi.pageExists("Commons:Deletion_requests/" + filename);
43+
Single<Boolean> pageExistsSingle = mediaClient.checkPageExistsUsingTitle("Commons:Deletion_requests/" + filename);
3944
Single<String> discussionSingle = getDiscussion(filename);
4045
return Single.zip(mediaSingle, pageExistsSingle, discussionSingle, (media, deletionStatus, discussion) -> {
4146
media.setDiscussion(discussion);
@@ -52,7 +57,7 @@ public Single<Media> fetchMediaDetails(String filename) {
5257
* @return return data rich Media object
5358
*/
5459
public Single<Media> getMediaFromFileName(String filename) {
55-
return okHttpJsonApiClient.getMedia(filename, false);
60+
return mediaClient.getMedia(filename);
5661
}
5762

5863
/**
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package fr.free.nrw.commons.actions;
2+
3+
import org.wikipedia.csrf.CsrfTokenClient;
4+
import org.wikipedia.dataclient.Service;
5+
6+
import io.reactivex.Observable;
7+
import timber.log.Timber;
8+
9+
public class PageEditClient {
10+
11+
private final CsrfTokenClient csrfTokenClient;
12+
private final PageEditInterface pageEditInterface;
13+
private final Service service;
14+
15+
public PageEditClient(CsrfTokenClient csrfTokenClient,
16+
PageEditInterface pageEditInterface,
17+
Service service) {
18+
this.csrfTokenClient = csrfTokenClient;
19+
this.pageEditInterface = pageEditInterface;
20+
this.service = service;
21+
}
22+
23+
public Observable<Boolean> edit(String pageTitle, String text, String summary) {
24+
try {
25+
return pageEditInterface.postEdit(pageTitle, summary, text, csrfTokenClient.getTokenBlocking())
26+
.map(editResponse -> editResponse.edit().editSucceeded());
27+
} catch (Throwable throwable) {
28+
return Observable.just(false);
29+
}
30+
}
31+
32+
public Observable<Boolean> appendEdit(String pageTitle, String appendText, String summary) {
33+
try {
34+
return pageEditInterface.postAppendEdit(pageTitle, summary, appendText, csrfTokenClient.getTokenBlocking())
35+
.map(editResponse -> editResponse.edit().editSucceeded());
36+
} catch (Throwable throwable) {
37+
return Observable.just(false);
38+
}
39+
}
40+
41+
public Observable<Boolean> prependEdit(String pageTitle, String prependText, String summary) {
42+
try {
43+
return pageEditInterface.postPrependEdit(pageTitle, summary, prependText, csrfTokenClient.getTokenBlocking())
44+
.map(editResponse -> editResponse.edit().editSucceeded());
45+
} catch (Throwable throwable) {
46+
return Observable.just(false);
47+
}
48+
}
49+
50+
public Observable<Integer> addEditTag(long revisionId, String tagName, String reason) {
51+
try {
52+
return service.addEditTag(String.valueOf(revisionId), tagName, reason, csrfTokenClient.getTokenBlocking())
53+
.map(mwPostResponse -> mwPostResponse.getSuccessVal());
54+
} catch (Throwable throwable) {
55+
return Observable.just(-1);
56+
}
57+
}
58+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package fr.free.nrw.commons.actions;
2+
3+
import androidx.annotation.NonNull;
4+
5+
import org.wikipedia.edit.Edit;
6+
7+
import io.reactivex.Observable;
8+
import retrofit2.http.Field;
9+
import retrofit2.http.FormUrlEncoded;
10+
import retrofit2.http.Headers;
11+
import retrofit2.http.POST;
12+
13+
import static org.wikipedia.dataclient.Service.MW_API_PREFIX;
14+
15+
public interface PageEditInterface {
16+
17+
@FormUrlEncoded
18+
@Headers("Cache-Control: no-cache")
19+
@POST(MW_API_PREFIX + "action=edit")
20+
@NonNull
21+
Observable<Edit> postEdit(@NonNull @Field("title") String title,
22+
@NonNull @Field("summary") String summary,
23+
@NonNull @Field("text") String text,
24+
@NonNull @Field("token") String token);
25+
26+
@FormUrlEncoded
27+
@Headers("Cache-Control: no-cache")
28+
@POST(MW_API_PREFIX + "action=edit")
29+
@NonNull Observable<Edit> postAppendEdit(@NonNull @Field("title") String title,
30+
@NonNull @Field("summary") String summary,
31+
@NonNull @Field("appendtext") String text,
32+
@NonNull @Field("token") String token);
33+
34+
@FormUrlEncoded
35+
@Headers("Cache-Control: no-cache")
36+
@POST(MW_API_PREFIX + "action=edit")
37+
@NonNull Observable<Edit> postPrependEdit(@NonNull @Field("title") String title,
38+
@NonNull @Field("summary") String summary,
39+
@NonNull @Field("prependtext") String text,
40+
@NonNull @Field("token") String token);
41+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package fr.free.nrw.commons.actions;
2+
3+
import org.wikipedia.csrf.CsrfTokenClient;
4+
import org.wikipedia.dataclient.Service;
5+
6+
import javax.inject.Inject;
7+
import javax.inject.Named;
8+
import javax.inject.Singleton;
9+
10+
import fr.free.nrw.commons.CommonsApplication;
11+
import io.reactivex.Observable;
12+
13+
@Singleton
14+
public class ThanksClient {
15+
16+
private final CsrfTokenClient csrfTokenClient;
17+
private final Service service;
18+
19+
@Inject
20+
public ThanksClient(@Named("commons-csrf") CsrfTokenClient csrfTokenClient,
21+
@Named("commons-service") Service service) {
22+
this.csrfTokenClient = csrfTokenClient;
23+
this.service = service;
24+
}
25+
26+
public Observable<Boolean> thank(long revisionId) {
27+
try {
28+
return service.thank(String.valueOf(revisionId), null,
29+
csrfTokenClient.getTokenBlocking(),
30+
CommonsApplication.getInstance().getUserAgent())
31+
.map(mwQueryResponse -> mwQueryResponse.getSuccessVal() == 1);
32+
} catch (Throwable throwable) {
33+
return Observable.just(false);
34+
}
35+
}
36+
}

0 commit comments

Comments
 (0)