Skip to content

Commit

Permalink
[WIP] Refactor feedback and quiz to reduce possibility of NPE (#1881)
Browse files Browse the repository at this point in the history
* Refactor feedback and quiz to reduce possibility of NPE

* Handle throwables in quiz checker

* Minor refactoring
  • Loading branch information
maskaravivek authored and misaochan committed Sep 6, 2018
1 parent 54caad2 commit 6eb01b8
Show file tree
Hide file tree
Showing 10 changed files with 182 additions and 171 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package fr.free.nrw.commons.achievements;

import android.util.Log;

/**
* represnts Achievements class ans stores all the parameters
*/
Expand Down Expand Up @@ -44,6 +42,23 @@ public Achievements(int uniqueUsedImages,
this.revertCount = revertCount;
}

/**
* Get Achievements object from FeedbackResponse
*
* @param response
* @return
*/
public static Achievements from(FeedbackResponse response) {
return new Achievements(response.getUniqueUsedImages(),
response.getArticlesUsingImages(),
response.getThanksReceived(),
response.getImagesEditedBySomeoneElse(),
response.getFeaturedImages().getQualityImages()
+ response.getFeaturedImages().getFeaturedPicturesOnWikimediaCommons(),
0,
response.getDeletedUploads());
}

/**
* Builder class for Achievements class
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,9 @@

import android.accounts.Account;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
Expand All @@ -20,7 +13,6 @@
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.Toolbar;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.Menu;
Expand All @@ -34,13 +26,10 @@

import com.dinuscxj.progressbar.CircleProgressBar;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Optional;
import java.util.Objects;

import javax.inject.Inject;

Expand Down Expand Up @@ -141,7 +130,6 @@ protected void onCreate(Bundle savedInstanceState) {
hideLayouts();
setAchievements();
setUploadCount();
setRevertCount();
initDrawer();
}

Expand Down Expand Up @@ -201,61 +189,37 @@ void shareScreen(Bitmap bitmap) {
* which then calls parseJson when results are fetched
*/
private void setAchievements() {
if(checkAccount()) {
compositeDisposable.add(mediaWikiApi
.getAchievements(sessionManager.getCurrentAccount().name)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
jsonObject -> parseJson(jsonObject),
t -> Timber.e(t, "Fetching achievements statisticss failed")
));
}
}

/**
* To call the API to get reverts count in form of JSONObject
*
*/

private void setRevertCount(){
if(checkAccount()) {
compositeDisposable.add(mediaWikiApi
.getRevertRespObjectSingle(sessionManager.getCurrentAccount().name)
.getAchievements(Objects.requireNonNull(sessionManager.getCurrentAccount()).name)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
object -> parseJsonRevertCount(object),
t -> Timber.e(t, "Fetching revert count failed")
response -> {
if (response != null) {
achievements = Achievements.from(response);
isRevertFetched = true;
isStatisticsFetched = true;
}
hideProgressBar();
},
t -> Timber.e(t, "Fetching achievements statisticss failed")
));
}
}

/**
* used to set number of deleted images
* @param object
*/
private void parseJsonRevertCount(JSONObject object){
try {
achievements.setRevertCount(object.getInt("deletedUploads"));
} catch (JSONException e) {
Timber.d( e, e.getMessage());
}
isRevertFetched = true;
hideProgressBar();
}

/**
* used to the count of images uploaded by user
*/
private void setUploadCount() {
if(checkAccount()) {
compositeDisposable.add(mediaWikiApi
.getUploadCount(sessionManager.getCurrentAccount().name)
.getUploadCount(Objects.requireNonNull(sessionManager.getCurrentAccount()).name)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
uploadCount -> setAchievementsUploadCount(uploadCount),
this::setAchievementsUploadCount,
t -> Timber.e(t, "Fetching upload count failed")
));
}
Expand Down Expand Up @@ -293,33 +257,12 @@ private void setImageRevertPercentage(int notRevertPercentage){
imagesRevertLimitText.setText(getResources().getString(R.string.achievements_revert_limit_message)+ levelInfo.getMinNonRevertPercentage() + "%");
}

/**
* used to parse the JSONObject containing results
* @param object
*/
private void parseJson(JSONObject object) {
try {
achievements.setUniqueUsedImages(object.getInt("uniqueUsedImages"));
achievements.setArticlesUsingImages(object.getInt("articlesUsingImages"));
achievements.setThanksReceived(object.getInt("thanksReceived"));
achievements.setImagesEditedBySomeoneElse(object.getInt("imagesEditedBySomeoneElse"));
JSONObject featuredImages = object.getJSONObject("featuredImages");
achievements.setFeaturedImages
(featuredImages.getInt("Quality_images") +
featuredImages.getInt("Featured_pictures_on_Wikimedia_Commons"));
} catch (JSONException e) {
e.printStackTrace();
}
isStatisticsFetched = true;
hideProgressBar();
}

/**
* Used the inflate the fetched statistics of the images uploaded by user
* and assign badge and level
* @param achievements
*/
private void inflateAchievements(Achievements achievements ){
private void inflateAchievements(Achievements achievements) {
thanksReceived.setText(Integer.toString(achievements.getThanksReceived()));
imagesUsedByWikiProgessbar.setProgress
(100*achievements.getUniqueUsedImages()/levelInfo.getMaxUniqueImages() );
Expand Down Expand Up @@ -393,17 +336,8 @@ public void showAlert(Bitmap screenshot){
TextView shareMessage = (TextView) view.findViewById(R.id.alert_text);
shareMessage.setText(R.string.achievements_share_message);
alertadd.setView(view);
alertadd.setPositiveButton("Proceed", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
shareScreen(screenshot);
}
});
alertadd.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
alertadd.setPositiveButton("Proceed", (dialog, which) -> shareScreen(screenshot));
alertadd.setNegativeButton("Cancel", (dialog, which) -> dialog.cancel());
alertadd.show();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package fr.free.nrw.commons.achievements;

import com.google.gson.annotations.SerializedName;

public class FeaturedImages {

@SerializedName("Quality_images")
private final int qualityImages;

@SerializedName("Featured_pictures_on_Wikimedia_Commons")
private final int featuredPicturesOnWikimediaCommons;

public FeaturedImages(int qualityImages, int featuredPicturesOnWikimediaCommons) {
this.qualityImages = qualityImages;
this.featuredPicturesOnWikimediaCommons = featuredPicturesOnWikimediaCommons;
}

public int getQualityImages() {
return qualityImages;
}

public int getFeaturedPicturesOnWikimediaCommons() {
return featuredPicturesOnWikimediaCommons;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package fr.free.nrw.commons.achievements;

public class FeedbackResponse {

private final String status;
private final int uniqueUsedImages;
private final int articlesUsingImages;
private final int deletedUploads;
private final FeaturedImages featuredImages;
private final int thanksReceived;
private final String user;
private final int imagesEditedBySomeoneElse;


public FeedbackResponse(String status,
int uniqueUsedImages,
int articlesUsingImages,
int deletedUploads,
FeaturedImages featuredImages,
int thanksReceived,
String user,
int imagesEditedBySomeoneElse) {
this.status = status;
this.uniqueUsedImages = uniqueUsedImages;
this.articlesUsingImages = articlesUsingImages;
this.deletedUploads = deletedUploads;
this.featuredImages = featuredImages;
this.thanksReceived = thanksReceived;
this.user = user;
this.imagesEditedBySomeoneElse = imagesEditedBySomeoneElse;
}

public String getStatus() {
return status;
}

public int getUniqueUsedImages() {
return uniqueUsedImages;
}

public int getArticlesUsingImages() {
return articlesUsingImages;
}

public int getDeletedUploads() {
return deletedUploads;
}

public FeaturedImages getFeaturedImages() {
return featuredImages;
}

public int getThanksReceived() {
return thanksReceived;
}

public String getUser() {
return user;
}

public int getImagesEditedBySomeoneElse() {
return imagesEditedBySomeoneElse;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@

import dagger.Module;
import dagger.Provides;

import fr.free.nrw.commons.BuildConfig;
import fr.free.nrw.commons.auth.AccountUtil;
import fr.free.nrw.commons.auth.SessionManager;
Expand All @@ -22,6 +21,7 @@
import fr.free.nrw.commons.upload.UploadController;
import fr.free.nrw.commons.wikidata.WikidataEditListener;
import fr.free.nrw.commons.wikidata.WikidataEditListenerImpl;
import okhttp3.OkHttpClient;

import static android.content.Context.MODE_PRIVATE;
import static fr.free.nrw.commons.explore.recentsearches.RecentSearchesContentProvider.RECENT_SEARCH_AUTHORITY;
Expand Down
15 changes: 11 additions & 4 deletions app/src/main/java/fr/free/nrw/commons/di/NetworkingModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.File;

import javax.inject.Named;
import javax.inject.Singleton;

Expand All @@ -15,6 +17,7 @@
import fr.free.nrw.commons.BuildConfig;
import fr.free.nrw.commons.mwapi.ApacheHttpClientMediaWikiApi;
import fr.free.nrw.commons.mwapi.MediaWikiApi;
import okhttp3.Cache;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;

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

@Provides
@Singleton
public OkHttpClient provideOkHttpClient() {
return new OkHttpClient.Builder().build();
public OkHttpClient provideOkHttpClient(Context context) {
File dir = new File(context.getCacheDir(), "okHttpCache");
return new OkHttpClient.Builder()
.cache(new Cache(dir, OK_HTTP_CACHE_SIZE))
.build();
}

@Provides
@Singleton
public MediaWikiApi provideMediaWikiApi(Context context,
@Named("default_preferences") SharedPreferences defaultPreferences,
@Named("category_prefs") SharedPreferences categoryPrefs,
Gson gson) {
return new ApacheHttpClientMediaWikiApi(context, BuildConfig.WIKIMEDIA_API_HOST, BuildConfig.WIKIDATA_API_HOST, defaultPreferences, categoryPrefs, gson);
Gson gson,
OkHttpClient okHttpClient) {
return new ApacheHttpClientMediaWikiApi(context, BuildConfig.WIKIMEDIA_API_HOST, BuildConfig.WIKIDATA_API_HOST, defaultPreferences, categoryPrefs, gson, okHttpClient);
}

@Provides
Expand Down
Loading

0 comments on commit 6eb01b8

Please sign in to comment.