Skip to content

Commit 6eb01b8

Browse files
maskaravivekmisaochan
authored andcommitted
[WIP] Refactor feedback and quiz to reduce possibility of NPE (#1881)
* Refactor feedback and quiz to reduce possibility of NPE * Handle throwables in quiz checker * Minor refactoring
1 parent 54caad2 commit 6eb01b8

File tree

10 files changed

+182
-171
lines changed

10 files changed

+182
-171
lines changed

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

+17-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package fr.free.nrw.commons.achievements;
22

3-
import android.util.Log;
4-
53
/**
64
* represnts Achievements class ans stores all the parameters
75
*/
@@ -44,6 +42,23 @@ public Achievements(int uniqueUsedImages,
4442
this.revertCount = revertCount;
4543
}
4644

45+
/**
46+
* Get Achievements object from FeedbackResponse
47+
*
48+
* @param response
49+
* @return
50+
*/
51+
public static Achievements from(FeedbackResponse response) {
52+
return new Achievements(response.getUniqueUsedImages(),
53+
response.getArticlesUsingImages(),
54+
response.getThanksReceived(),
55+
response.getImagesEditedBySomeoneElse(),
56+
response.getFeaturedImages().getQualityImages()
57+
+ response.getFeaturedImages().getFeaturedPicturesOnWikimediaCommons(),
58+
0,
59+
response.getDeletedUploads());
60+
}
61+
4762
/**
4863
* Builder class for Achievements class
4964
*/

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

+16-82
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,9 @@
22

33
import android.accounts.Account;
44
import android.annotation.SuppressLint;
5-
import android.annotation.TargetApi;
65
import android.content.Context;
7-
import android.content.DialogInterface;
86
import android.content.Intent;
97
import android.graphics.Bitmap;
10-
import android.graphics.BitmapFactory;
11-
import android.graphics.Canvas;
12-
import android.graphics.Color;
13-
import android.graphics.Paint;
14-
import android.graphics.Rect;
158
import android.graphics.drawable.BitmapDrawable;
169
import android.graphics.drawable.Drawable;
1710
import android.net.Uri;
@@ -20,7 +13,6 @@
2013
import android.support.v7.app.AlertDialog;
2114
import android.support.v7.widget.Toolbar;
2215
import android.util.DisplayMetrics;
23-
import android.util.Log;
2416
import android.view.ContextThemeWrapper;
2517
import android.view.LayoutInflater;
2618
import android.view.Menu;
@@ -34,13 +26,10 @@
3426

3527
import com.dinuscxj.progressbar.CircleProgressBar;
3628

37-
import org.json.JSONException;
38-
import org.json.JSONObject;
39-
4029
import java.io.File;
4130
import java.io.FileOutputStream;
4231
import java.io.IOException;
43-
import java.util.Optional;
32+
import java.util.Objects;
4433

4534
import javax.inject.Inject;
4635

@@ -141,7 +130,6 @@ protected void onCreate(Bundle savedInstanceState) {
141130
hideLayouts();
142131
setAchievements();
143132
setUploadCount();
144-
setRevertCount();
145133
initDrawer();
146134
}
147135

@@ -201,61 +189,37 @@ void shareScreen(Bitmap bitmap) {
201189
* which then calls parseJson when results are fetched
202190
*/
203191
private void setAchievements() {
204-
if(checkAccount()) {
205-
compositeDisposable.add(mediaWikiApi
206-
.getAchievements(sessionManager.getCurrentAccount().name)
207-
.subscribeOn(Schedulers.io())
208-
.observeOn(AndroidSchedulers.mainThread())
209-
.subscribe(
210-
jsonObject -> parseJson(jsonObject),
211-
t -> Timber.e(t, "Fetching achievements statisticss failed")
212-
));
213-
}
214-
}
215192

216-
/**
217-
* To call the API to get reverts count in form of JSONObject
218-
*
219-
*/
220-
221-
private void setRevertCount(){
222193
if(checkAccount()) {
223194
compositeDisposable.add(mediaWikiApi
224-
.getRevertRespObjectSingle(sessionManager.getCurrentAccount().name)
195+
.getAchievements(Objects.requireNonNull(sessionManager.getCurrentAccount()).name)
225196
.subscribeOn(Schedulers.io())
226197
.observeOn(AndroidSchedulers.mainThread())
227198
.subscribe(
228-
object -> parseJsonRevertCount(object),
229-
t -> Timber.e(t, "Fetching revert count failed")
199+
response -> {
200+
if (response != null) {
201+
achievements = Achievements.from(response);
202+
isRevertFetched = true;
203+
isStatisticsFetched = true;
204+
}
205+
hideProgressBar();
206+
},
207+
t -> Timber.e(t, "Fetching achievements statisticss failed")
230208
));
231209
}
232210
}
233211

234-
/**
235-
* used to set number of deleted images
236-
* @param object
237-
*/
238-
private void parseJsonRevertCount(JSONObject object){
239-
try {
240-
achievements.setRevertCount(object.getInt("deletedUploads"));
241-
} catch (JSONException e) {
242-
Timber.d( e, e.getMessage());
243-
}
244-
isRevertFetched = true;
245-
hideProgressBar();
246-
}
247-
248212
/**
249213
* used to the count of images uploaded by user
250214
*/
251215
private void setUploadCount() {
252216
if(checkAccount()) {
253217
compositeDisposable.add(mediaWikiApi
254-
.getUploadCount(sessionManager.getCurrentAccount().name)
218+
.getUploadCount(Objects.requireNonNull(sessionManager.getCurrentAccount()).name)
255219
.subscribeOn(Schedulers.io())
256220
.observeOn(AndroidSchedulers.mainThread())
257221
.subscribe(
258-
uploadCount -> setAchievementsUploadCount(uploadCount),
222+
this::setAchievementsUploadCount,
259223
t -> Timber.e(t, "Fetching upload count failed")
260224
));
261225
}
@@ -293,33 +257,12 @@ private void setImageRevertPercentage(int notRevertPercentage){
293257
imagesRevertLimitText.setText(getResources().getString(R.string.achievements_revert_limit_message)+ levelInfo.getMinNonRevertPercentage() + "%");
294258
}
295259

296-
/**
297-
* used to parse the JSONObject containing results
298-
* @param object
299-
*/
300-
private void parseJson(JSONObject object) {
301-
try {
302-
achievements.setUniqueUsedImages(object.getInt("uniqueUsedImages"));
303-
achievements.setArticlesUsingImages(object.getInt("articlesUsingImages"));
304-
achievements.setThanksReceived(object.getInt("thanksReceived"));
305-
achievements.setImagesEditedBySomeoneElse(object.getInt("imagesEditedBySomeoneElse"));
306-
JSONObject featuredImages = object.getJSONObject("featuredImages");
307-
achievements.setFeaturedImages
308-
(featuredImages.getInt("Quality_images") +
309-
featuredImages.getInt("Featured_pictures_on_Wikimedia_Commons"));
310-
} catch (JSONException e) {
311-
e.printStackTrace();
312-
}
313-
isStatisticsFetched = true;
314-
hideProgressBar();
315-
}
316-
317260
/**
318261
* Used the inflate the fetched statistics of the images uploaded by user
319262
* and assign badge and level
320263
* @param achievements
321264
*/
322-
private void inflateAchievements(Achievements achievements ){
265+
private void inflateAchievements(Achievements achievements) {
323266
thanksReceived.setText(Integer.toString(achievements.getThanksReceived()));
324267
imagesUsedByWikiProgessbar.setProgress
325268
(100*achievements.getUniqueUsedImages()/levelInfo.getMaxUniqueImages() );
@@ -393,17 +336,8 @@ public void showAlert(Bitmap screenshot){
393336
TextView shareMessage = (TextView) view.findViewById(R.id.alert_text);
394337
shareMessage.setText(R.string.achievements_share_message);
395338
alertadd.setView(view);
396-
alertadd.setPositiveButton("Proceed", new DialogInterface.OnClickListener() {
397-
public void onClick(DialogInterface dialog, int which) {
398-
shareScreen(screenshot);
399-
}
400-
});
401-
alertadd.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
402-
@Override
403-
public void onClick(DialogInterface dialog, int which) {
404-
dialog.cancel();
405-
}
406-
});
339+
alertadd.setPositiveButton("Proceed", (dialog, which) -> shareScreen(screenshot));
340+
alertadd.setNegativeButton("Cancel", (dialog, which) -> dialog.cancel());
407341
alertadd.show();
408342
}
409343

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package fr.free.nrw.commons.achievements;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
5+
public class FeaturedImages {
6+
7+
@SerializedName("Quality_images")
8+
private final int qualityImages;
9+
10+
@SerializedName("Featured_pictures_on_Wikimedia_Commons")
11+
private final int featuredPicturesOnWikimediaCommons;
12+
13+
public FeaturedImages(int qualityImages, int featuredPicturesOnWikimediaCommons) {
14+
this.qualityImages = qualityImages;
15+
this.featuredPicturesOnWikimediaCommons = featuredPicturesOnWikimediaCommons;
16+
}
17+
18+
public int getQualityImages() {
19+
return qualityImages;
20+
}
21+
22+
public int getFeaturedPicturesOnWikimediaCommons() {
23+
return featuredPicturesOnWikimediaCommons;
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package fr.free.nrw.commons.achievements;
2+
3+
public class FeedbackResponse {
4+
5+
private final String status;
6+
private final int uniqueUsedImages;
7+
private final int articlesUsingImages;
8+
private final int deletedUploads;
9+
private final FeaturedImages featuredImages;
10+
private final int thanksReceived;
11+
private final String user;
12+
private final int imagesEditedBySomeoneElse;
13+
14+
15+
public FeedbackResponse(String status,
16+
int uniqueUsedImages,
17+
int articlesUsingImages,
18+
int deletedUploads,
19+
FeaturedImages featuredImages,
20+
int thanksReceived,
21+
String user,
22+
int imagesEditedBySomeoneElse) {
23+
this.status = status;
24+
this.uniqueUsedImages = uniqueUsedImages;
25+
this.articlesUsingImages = articlesUsingImages;
26+
this.deletedUploads = deletedUploads;
27+
this.featuredImages = featuredImages;
28+
this.thanksReceived = thanksReceived;
29+
this.user = user;
30+
this.imagesEditedBySomeoneElse = imagesEditedBySomeoneElse;
31+
}
32+
33+
public String getStatus() {
34+
return status;
35+
}
36+
37+
public int getUniqueUsedImages() {
38+
return uniqueUsedImages;
39+
}
40+
41+
public int getArticlesUsingImages() {
42+
return articlesUsingImages;
43+
}
44+
45+
public int getDeletedUploads() {
46+
return deletedUploads;
47+
}
48+
49+
public FeaturedImages getFeaturedImages() {
50+
return featuredImages;
51+
}
52+
53+
public int getThanksReceived() {
54+
return thanksReceived;
55+
}
56+
57+
public String getUser() {
58+
return user;
59+
}
60+
61+
public int getImagesEditedBySomeoneElse() {
62+
return imagesEditedBySomeoneElse;
63+
}
64+
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
import dagger.Module;
1313
import dagger.Provides;
14-
1514
import fr.free.nrw.commons.BuildConfig;
1615
import fr.free.nrw.commons.auth.AccountUtil;
1716
import fr.free.nrw.commons.auth.SessionManager;
@@ -22,6 +21,7 @@
2221
import fr.free.nrw.commons.upload.UploadController;
2322
import fr.free.nrw.commons.wikidata.WikidataEditListener;
2423
import fr.free.nrw.commons.wikidata.WikidataEditListenerImpl;
24+
import okhttp3.OkHttpClient;
2525

2626
import static android.content.Context.MODE_PRIVATE;
2727
import static fr.free.nrw.commons.explore.recentsearches.RecentSearchesContentProvider.RECENT_SEARCH_AUTHORITY;

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

+11-4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import com.google.gson.Gson;
88
import com.google.gson.GsonBuilder;
99

10+
import java.io.File;
11+
1012
import javax.inject.Named;
1113
import javax.inject.Singleton;
1214

@@ -15,6 +17,7 @@
1517
import fr.free.nrw.commons.BuildConfig;
1618
import fr.free.nrw.commons.mwapi.ApacheHttpClientMediaWikiApi;
1719
import fr.free.nrw.commons.mwapi.MediaWikiApi;
20+
import okhttp3.Cache;
1821
import okhttp3.HttpUrl;
1922
import okhttp3.OkHttpClient;
2023

@@ -25,17 +28,21 @@ public class NetworkingModule {
2528

2629
@Provides
2730
@Singleton
28-
public OkHttpClient provideOkHttpClient() {
29-
return new OkHttpClient.Builder().build();
31+
public OkHttpClient provideOkHttpClient(Context context) {
32+
File dir = new File(context.getCacheDir(), "okHttpCache");
33+
return new OkHttpClient.Builder()
34+
.cache(new Cache(dir, OK_HTTP_CACHE_SIZE))
35+
.build();
3036
}
3137

3238
@Provides
3339
@Singleton
3440
public MediaWikiApi provideMediaWikiApi(Context context,
3541
@Named("default_preferences") SharedPreferences defaultPreferences,
3642
@Named("category_prefs") SharedPreferences categoryPrefs,
37-
Gson gson) {
38-
return new ApacheHttpClientMediaWikiApi(context, BuildConfig.WIKIMEDIA_API_HOST, BuildConfig.WIKIDATA_API_HOST, defaultPreferences, categoryPrefs, gson);
43+
Gson gson,
44+
OkHttpClient okHttpClient) {
45+
return new ApacheHttpClientMediaWikiApi(context, BuildConfig.WIKIMEDIA_API_HOST, BuildConfig.WIKIDATA_API_HOST, defaultPreferences, categoryPrefs, gson, okHttpClient);
3946
}
4047

4148
@Provides

0 commit comments

Comments
 (0)