Skip to content

Commit 73bb0c5

Browse files
maskaravivekmisaochan
authored andcommitted
Show wikidata edits done through the app (commons-app#2431)
* Show wikidata edits done through the app * Minor changes based on code review
1 parent aee8839 commit 73bb0c5

File tree

8 files changed

+138
-18
lines changed

8 files changed

+138
-18
lines changed

app/src/main/java/fr/free/nrw/commons/achievements/AchievementsActivity.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import android.accounts.Account;
44
import android.annotation.SuppressLint;
55
import android.content.Context;
6-
import android.content.DialogInterface;
76
import android.content.Intent;
87
import android.graphics.Bitmap;
98
import android.graphics.drawable.BitmapDrawable;
@@ -27,8 +26,6 @@
2726

2827
import com.dinuscxj.progressbar.CircleProgressBar;
2928

30-
import org.w3c.dom.Text;
31-
3229
import java.io.File;
3330
import java.io.FileOutputStream;
3431
import java.io.IOException;
@@ -42,11 +39,10 @@
4239
import fr.free.nrw.commons.R;
4340
import fr.free.nrw.commons.Utils;
4441
import fr.free.nrw.commons.auth.SessionManager;
45-
import fr.free.nrw.commons.mwapi.MediaWikiApi;
4642
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
4743
import fr.free.nrw.commons.theme.NavigationBaseActivity;
44+
import fr.free.nrw.commons.utils.StringUtils;
4845
import fr.free.nrw.commons.utils.ViewUtil;
49-
import io.reactivex.Single;
5046
import io.reactivex.android.schedulers.AndroidSchedulers;
5147
import io.reactivex.disposables.CompositeDisposable;
5248
import io.reactivex.schedulers.Schedulers;
@@ -98,6 +94,10 @@ public class AchievementsActivity extends NavigationBaseActivity {
9894
TextView imageRevertedText;
9995
@BindView(R.id.images_upload_text_param)
10096
TextView imageUploadedText;
97+
@BindView(R.id.wikidata_edits)
98+
TextView wikidataEditsText;
99+
100+
101101
@Inject
102102
SessionManager sessionManager;
103103
@Inject
@@ -138,6 +138,7 @@ protected void onCreate(Bundle savedInstanceState) {
138138

139139
hideLayouts();
140140
setAchievements();
141+
setWikidataEditCount();
141142
initDrawer();
142143
}
143144

@@ -229,6 +230,18 @@ private void setAchievements() {
229230
}
230231
}
231232

233+
@SuppressLint("CheckResult")
234+
private void setWikidataEditCount() {
235+
String userName = sessionManager.getUserName();
236+
if (StringUtils.isNullOrWhiteSpace(userName)) {
237+
return;
238+
}
239+
okHttpJsonApiClient.getWikidataEdits(userName)
240+
.subscribeOn(Schedulers.io())
241+
.observeOn(AndroidSchedulers.mainThread())
242+
.subscribe(edits -> wikidataEditsText.setText(String.valueOf(edits)));
243+
}
244+
232245
private void showSnackBarWithRetry() {
233246
progressBar.setVisibility(View.GONE);
234247
ViewUtil.showDismissibleSnackBar(findViewById(android.R.id.content),

app/src/main/java/fr/free/nrw/commons/di/NetworkingModule.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ public class NetworkingModule {
3434
private static final String WIKIDATA_SPARQL_QUERY_URL = "https://query.wikidata.org/sparql";
3535
private final String WIKIMEDIA_CAMPAIGNS_BASE_URL =
3636
"https://raw.githubusercontent.com/commons-app/campaigns/master/campaigns.json";
37-
private static final String TOOLS_FORGE_URL = "https://tools.wmflabs.org/";
37+
private static final String TOOLS_FORGE_URL = "https://tools.wmflabs.org/urbanecmbot/commonsmisc";
38+
39+
private static final String TEST_TOOLS_FORGE_URL = "https://tools.wmflabs.org/commons-android-app/tool-commons-android-app";
3840

3941
public static final long OK_HTTP_CACHE_SIZE = 10 * 1024 * 1024;
4042

app/src/main/java/fr/free/nrw/commons/mwapi/OkHttpJsonApiClient.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import fr.free.nrw.commons.nearby.model.NearbyResultItem;
2727
import fr.free.nrw.commons.upload.FileUtils;
2828
import fr.free.nrw.commons.utils.DateUtils;
29+
import fr.free.nrw.commons.wikidata.model.GetWikidataEditCountResponse;
2930
import io.reactivex.Observable;
3031
import io.reactivex.Single;
3132
import okhttp3.HttpUrl;
@@ -63,7 +64,7 @@ public OkHttpJsonApiClient(OkHttpClient okHttpClient,
6364
public Single<Integer> getUploadCount(String userName) {
6465
HttpUrl.Builder urlBuilder = wikiMediaToolforgeUrl.newBuilder();
6566
urlBuilder
66-
.addPathSegments("urbanecmbot/commonsmisc/uploadsbyuser.py")
67+
.addPathSegments("/uploadsbyuser.py")
6768
.addQueryParameter("user", userName);
6869
Request request = new Request.Builder()
6970
.url(urlBuilder.build())
@@ -72,12 +73,38 @@ public Single<Integer> getUploadCount(String userName) {
7273
return Single.fromCallable(() -> {
7374
Response response = okHttpClient.newCall(request).execute();
7475
if (response != null && response.isSuccessful()) {
76+
7577
return Integer.parseInt(response.body().string().trim());
7678
}
7779
return 0;
7880
});
7981
}
8082

83+
@NonNull
84+
public Single<Integer> getWikidataEdits(String userName) {
85+
HttpUrl.Builder urlBuilder = wikiMediaToolforgeUrl.newBuilder();
86+
urlBuilder
87+
.addPathSegments("/wikidataedits.py")
88+
.addQueryParameter("user", userName);
89+
Request request = new Request.Builder()
90+
.url(urlBuilder.build())
91+
.build();
92+
93+
return Single.fromCallable(() -> {
94+
Response response = okHttpClient.newCall(request).execute();
95+
if (response != null &&
96+
response.isSuccessful() && response.body() != null) {
97+
String json = response.body().string();
98+
if (json == null) {
99+
return 0;
100+
}
101+
GetWikidataEditCountResponse countResponse = gson.fromJson(json, GetWikidataEditCountResponse.class);
102+
return countResponse.getWikidataEditCount();
103+
}
104+
return 0;
105+
});
106+
}
107+
81108
/**
82109
* This takes userName as input, which is then used to fetch the feedback/achievements
83110
* statistics using OkHttp and JavaRx. This function return JSONObject
@@ -87,7 +114,7 @@ public Single<Integer> getUploadCount(String userName) {
87114
*/
88115
public Single<FeedbackResponse> getAchievements(String userName) {
89116
final String fetchAchievementUrlTemplate =
90-
wikiMediaToolforgeUrl + "urbanecmbot/commonsmisc/feedback.py";
117+
wikiMediaToolforgeUrl + "/feedback.py";
91118
return Single.fromCallable(() -> {
92119
String url = String.format(
93120
Locale.ENGLISH,
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package fr.free.nrw.commons.wikidata.model;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
5+
public class GetWikidataEditCountResponse {
6+
@SerializedName("edits")
7+
private final int wikidataEditCount;
8+
9+
public GetWikidataEditCountResponse(int wikidataEditCount) {
10+
this.wikidataEditCount = wikidataEditCount;
11+
}
12+
13+
public int getWikidataEditCount() {
14+
return wikidataEditCount;
15+
}
16+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:width="24dp"
4+
android:height="24dp"
5+
android:viewportWidth="24.0"
6+
android:viewportHeight="24.0">
7+
<path
8+
android:fillColor="@color/primaryColor"
9+
android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z"/>
10+
</vector>

app/src/main/res/layout/activity_achievements.xml

Lines changed: 59 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools"
45
android:id="@+id/drawer_layout"
56
android:layout_width="match_parent"
67
android:layout_height="match_parent">
@@ -254,6 +255,7 @@
254255
<ImageView
255256
android:layout_width="@dimen/overflow_icon_dimen"
256257
android:layout_height="@dimen/overflow_icon_dimen"
258+
android:layout_centerVertical="true"
257259
android:id="@+id/featured_image_icon"
258260
app:srcCompat="@drawable/featured" />
259261

@@ -264,6 +266,7 @@
264266
android:layout_toRightOf="@+id/featured_image_icon"
265267
android:layout_marginTop="@dimen/activity_margin_horizontal"
266268
android:layout_marginStart="@dimen/activity_margin_horizontal"
269+
android:layout_centerVertical="true"
267270
android:layout_marginLeft="@dimen/activity_margin_horizontal"
268271
android:text="@string/statistics_featured" />
269272

@@ -272,28 +275,31 @@
272275
android:layout_height="wrap_content"
273276
style="?android:textAppearanceMedium"
274277
android:layout_alignParentRight="true"
275-
android:layout_marginEnd="44dp"
276278
android:layout_marginTop="@dimen/activity_margin_horizontal"
277279
android:layout_marginStart="@dimen/activity_margin_horizontal"
278-
android:text="2"
280+
android:layout_centerVertical="true"
281+
tools:text="2"
279282
android:id="@+id/image_featured"
280283
android:layout_marginLeft="@dimen/activity_margin_horizontal"
281-
android:layout_marginRight="44dp" />
284+
android:layout_marginEnd="24dp"
285+
android:layout_marginRight="24dp" />
282286

283287
</RelativeLayout>
284288

285289
<RelativeLayout
286290
android:layout_width="match_parent"
287291
android:layout_height="wrap_content"
288292
android:layout_marginLeft="@dimen/activity_margin_horizontal"
289-
android:layout_marginEnd="@dimen/activity_margin_horizontal"
290293
android:layout_marginRight="@dimen/activity_margin_horizontal"
291-
android:layout_marginStart="@dimen/activity_margin_horizontal">
294+
android:layout_marginStart="@dimen/activity_margin_horizontal"
295+
android:layout_marginTop="@dimen/activity_margin_horizontal"
296+
android:layout_marginEnd="@dimen/activity_margin_horizontal">
292297

293298
<ImageView
294299
android:layout_width="@dimen/overflow_icon_dimen"
295300
android:layout_height="@dimen/overflow_icon_dimen"
296301
app:srcCompat="@drawable/ic_thanks"
302+
android:layout_centerVertical="true"
297303
android:id="@+id/thanks_image_icon"
298304
android:scaleType="centerCrop" />
299305

@@ -304,6 +310,7 @@
304310
android:layout_marginTop="@dimen/activity_margin_horizontal"
305311
android:layout_toRightOf="@+id/thanks_image_icon"
306312
android:layout_marginStart="@dimen/activity_margin_horizontal"
313+
android:layout_centerVertical="true"
307314
android:layout_marginLeft="@dimen/activity_margin_horizontal"
308315
android:text="@string/statistics_thanks" />
309316

@@ -312,13 +319,57 @@
312319
android:layout_height="wrap_content"
313320
style="?android:textAppearanceMedium"
314321
android:layout_alignParentRight="true"
315-
android:layout_marginEnd="44dp"
316322
android:layout_marginTop="@dimen/activity_margin_horizontal"
317323
android:layout_marginStart="@dimen/activity_margin_horizontal"
318324
android:layout_marginLeft="@dimen/activity_margin_horizontal"
319-
android:text="2"
325+
android:layout_centerVertical="true"
326+
tools:text="2"
320327
android:id="@+id/thanks_received"
321-
android:layout_marginRight="44dp" />
328+
android:layout_marginEnd="24dp"
329+
android:layout_marginRight="24dp" />
330+
331+
</RelativeLayout>
332+
333+
<RelativeLayout
334+
android:layout_width="match_parent"
335+
android:layout_height="wrap_content"
336+
android:layout_marginLeft="@dimen/activity_margin_horizontal"
337+
android:layout_marginRight="@dimen/activity_margin_horizontal"
338+
android:layout_marginEnd="@dimen/activity_margin_horizontal"
339+
android:layout_marginStart="@dimen/activity_margin_horizontal"
340+
android:layout_marginTop="@dimen/activity_margin_horizontal">
341+
342+
<ImageView
343+
android:layout_width="@dimen/overflow_icon_dimen"
344+
android:layout_height="@dimen/overflow_icon_dimen"
345+
android:id="@+id/wikidata_edits_icon"
346+
android:layout_centerVertical="true"
347+
app:srcCompat="@drawable/edit_ascent_color" />
348+
349+
<TextView
350+
android:layout_width="wrap_content"
351+
android:layout_height="wrap_content"
352+
style="?android:textAppearanceMedium"
353+
android:layout_toRightOf="@+id/wikidata_edits_icon"
354+
android:layout_marginTop="@dimen/activity_margin_horizontal"
355+
android:layout_marginStart="@dimen/activity_margin_horizontal"
356+
android:layout_marginLeft="@dimen/activity_margin_horizontal"
357+
android:layout_centerVertical="true"
358+
android:text="@string/statistics_wikidata_edits" />
359+
360+
<TextView
361+
android:layout_width="wrap_content"
362+
android:layout_height="wrap_content"
363+
style="?android:textAppearanceMedium"
364+
android:layout_alignParentRight="true"
365+
android:layout_marginLeft="@dimen/activity_margin_horizontal"
366+
android:layout_marginEnd="24dp"
367+
android:layout_marginTop="@dimen/activity_margin_horizontal"
368+
android:layout_marginStart="@dimen/activity_margin_horizontal"
369+
android:layout_centerVertical="true"
370+
tools:text="2"
371+
android:id="@+id/wikidata_edits"
372+
android:layout_marginRight="24dp" />
322373

323374
</RelativeLayout>
324375
</LinearLayout>

app/src/main/res/values/dimens.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
<dimen name="bottom_peak_height">240dp</dimen>
33

44
<!-- Standard margin / padding for the containing activity -->
5-
<dimen name="activity_margin_horizontal">16dp</dimen>
6-
<dimen name="activity_margin_vertical">16dp</dimen>
5+
<dimen name="activity_margin_horizontal">8dp</dimen>
6+
<dimen name="activity_margin_vertical">8dp</dimen>
77
<dimen name="achievements_activity_margin_vertical">8dp</dimen>
88

99
<!-- Standard margins / padding -->

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,7 @@
357357
<string name="statistics">STATISTICS</string>
358358
<string name="statistics_thanks">Thanks Received</string>
359359
<string name="statistics_featured">Featured Images</string>
360+
<string name="statistics_wikidata_edits">Images via \"Nearby Places\"</string>
360361
<string name="level">LEVEL</string>
361362
<string name="images_uploaded">Images Uploaded</string>
362363
<string name="image_reverts">Images Not Reverted</string>

0 commit comments

Comments
 (0)