mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-29 05:43:55 +01:00
Merge 2.8 release with master (#1887)
* Add Traceur for getting meaningful RxJava stack traces (#1832) * Hotfix for overwrite issue in 2.8.0 (#1838) * This solution is an hotfix for overrite issue came back on 2.8.0 version. What I did is checking the extension, and if it is null, adding .jpg suffix. Because commons files always have suffixes, and we should compare file names after adding suffixes. Othervise overrides are possible. * Check if file title includes an extension already, by checking if is there any dot in it. * Fix logic error * Add uncovered tests * Remove unecessary line breaks * Make Javadocs more explicit * Versioning and changelog for v2.8.2 (#1842) * Versioning for v2.8.2 * Changelog for v2.8.2 * Add logs in wiki data edit and session refresh flow (#1874) * Fix logout (#1875) * [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 * Set Traceur to only work in DEBUG mode (#1884) * Bug fix for uploaded images count in achievements activity (#1885) * Versioning and changelog for v2.8.3 (#1886) * Update changelog.md * Versioning for v2.8.3
This commit is contained in:
parent
13c377aa17
commit
a63b9f88bb
18 changed files with 284 additions and 252 deletions
|
|
@ -1,7 +1,5 @@
|
|||
package fr.free.nrw.commons.achievements;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
/**
|
||||
* represnts Achievements class ans stores all the parameters
|
||||
*/
|
||||
|
|
@ -45,62 +43,20 @@ public class Achievements {
|
|||
}
|
||||
|
||||
/**
|
||||
* Builder class for Achievements class
|
||||
* Get Achievements object from FeedbackResponse
|
||||
*
|
||||
* @param response
|
||||
* @return
|
||||
*/
|
||||
public class AchievementsBuilder {
|
||||
private int nestedUniqueUsedImages;
|
||||
private int nestedArticlesUsingImages;
|
||||
private int nestedThanksReceived;
|
||||
private int nestedImagesEditedBySomeoneElse;
|
||||
private int nestedFeaturedImages;
|
||||
private int nestedImagesUploaded;
|
||||
private int nestedRevertCount;
|
||||
|
||||
public AchievementsBuilder setUniqueUsedImages(int uniqueUsedImages) {
|
||||
this.nestedUniqueUsedImages = uniqueUsedImages;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AchievementsBuilder setArticlesUsingImages(int articlesUsingImages) {
|
||||
this.nestedArticlesUsingImages = articlesUsingImages;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AchievementsBuilder setThanksReceived(int thanksReceived) {
|
||||
this.nestedThanksReceived = thanksReceived;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AchievementsBuilder setImagesEditedBySomeoneElse(int imagesEditedBySomeoneElse) {
|
||||
this.nestedImagesEditedBySomeoneElse = imagesEditedBySomeoneElse;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AchievementsBuilder setFeaturedImages(int featuredImages) {
|
||||
this.nestedFeaturedImages = featuredImages;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AchievementsBuilder setImagesUploaded(int imagesUploaded) {
|
||||
this.nestedImagesUploaded = imagesUploaded;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AchievementsBuilder setRevertCount( int revertCount){
|
||||
this.nestedRevertCount = revertCount;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Achievements createAchievements(){
|
||||
return new Achievements(nestedUniqueUsedImages,
|
||||
nestedArticlesUsingImages,
|
||||
nestedThanksReceived,
|
||||
nestedImagesEditedBySomeoneElse,
|
||||
nestedFeaturedImages,
|
||||
nestedImagesUploaded,
|
||||
nestedRevertCount);
|
||||
}
|
||||
|
||||
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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -2,16 +2,9 @@ package fr.free.nrw.commons.achievements;
|
|||
|
||||
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;
|
||||
|
|
@ -20,7 +13,6 @@ import android.support.v4.content.res.ResourcesCompat;
|
|||
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;
|
||||
|
|
@ -34,13 +26,10 @@ import android.widget.TextView;
|
|||
|
||||
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;
|
||||
|
||||
|
|
@ -65,10 +54,7 @@ public class AchievementsActivity extends NavigationBaseActivity {
|
|||
|
||||
private static final double BADGE_IMAGE_WIDTH_RATIO = 0.4;
|
||||
private static final double BADGE_IMAGE_HEIGHT_RATIO = 0.3;
|
||||
private Boolean isUploadFetched = false;
|
||||
private Boolean isStatisticsFetched = false;
|
||||
private Boolean isRevertFetched = false;
|
||||
private Achievements achievements = new Achievements();
|
||||
|
||||
private LevelController.LevelInfo levelInfo;
|
||||
|
||||
@BindView(R.id.achievement_badge)
|
||||
|
|
@ -140,8 +126,6 @@ public class AchievementsActivity extends NavigationBaseActivity {
|
|||
progressBar.setVisibility(View.VISIBLE);
|
||||
hideLayouts();
|
||||
setAchievements();
|
||||
setUploadCount();
|
||||
setRevertCount();
|
||||
initDrawer();
|
||||
}
|
||||
|
||||
|
|
@ -203,60 +187,48 @@ public class AchievementsActivity extends NavigationBaseActivity {
|
|||
private void setAchievements() {
|
||||
if(checkAccount()) {
|
||||
compositeDisposable.add(mediaWikiApi
|
||||
.getAchievements(sessionManager.getCurrentAccount().name)
|
||||
.getAchievements(Objects.requireNonNull(sessionManager.getCurrentAccount()).name)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(
|
||||
jsonObject -> parseJson(jsonObject),
|
||||
t -> Timber.e(t, "Fetching achievements statisticss failed")
|
||||
response -> {
|
||||
if (response != null) {
|
||||
setUploadCount(Achievements.from(response));
|
||||
} else {
|
||||
onError();
|
||||
}
|
||||
},
|
||||
t -> {
|
||||
Timber.e(t, "Fetching achievements statistics failed");
|
||||
onError();
|
||||
}
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* To call the API to get reverts count in form of JSONObject
|
||||
*
|
||||
* Shows a generic error toast when error occurs while loading achievements or uploads
|
||||
*/
|
||||
|
||||
private void setRevertCount(){
|
||||
if(checkAccount()) {
|
||||
compositeDisposable.add(mediaWikiApi
|
||||
.getRevertRespObjectSingle(sessionManager.getCurrentAccount().name)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(
|
||||
object -> parseJsonRevertCount(object),
|
||||
t -> Timber.e(t, "Fetching revert count 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();
|
||||
private void onError() {
|
||||
ViewUtil.showLongToast(this, getResources().getString(R.string.error_occurred));
|
||||
progressBar.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
/**
|
||||
* used to the count of images uploaded by user
|
||||
*/
|
||||
private void setUploadCount() {
|
||||
private void setUploadCount(Achievements achievements) {
|
||||
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),
|
||||
t -> Timber.e(t, "Fetching upload count failed")
|
||||
uploadCount -> setAchievementsUploadCount(achievements, uploadCount),
|
||||
t -> {
|
||||
Timber.e(t, "Fetching upload count failed");
|
||||
onError();
|
||||
}
|
||||
));
|
||||
}
|
||||
}
|
||||
|
|
@ -265,10 +237,9 @@ public class AchievementsActivity extends NavigationBaseActivity {
|
|||
* used to set achievements upload count and call hideProgressbar
|
||||
* @param uploadCount
|
||||
*/
|
||||
private void setAchievementsUploadCount(int uploadCount){
|
||||
private void setAchievementsUploadCount(Achievements achievements, int uploadCount) {
|
||||
achievements.setImagesUploaded(uploadCount);
|
||||
isUploadFetched = true;
|
||||
hideProgressBar();
|
||||
hideProgressBar(achievements);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -293,33 +264,12 @@ public class AchievementsActivity extends NavigationBaseActivity {
|
|||
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() );
|
||||
|
|
@ -350,8 +300,8 @@ public class AchievementsActivity extends NavigationBaseActivity {
|
|||
/**
|
||||
* to hide progressbar
|
||||
*/
|
||||
private void hideProgressBar() {
|
||||
if (progressBar != null && isUploadFetched && isStatisticsFetched && isRevertFetched) {
|
||||
private void hideProgressBar(Achievements achievements) {
|
||||
if (progressBar != null) {
|
||||
levelInfo = LevelController.LevelInfo.from(achievements.getImagesUploaded(),
|
||||
achievements.getUniqueUsedImages(),
|
||||
achievements.getNotRevertPercentage());
|
||||
|
|
@ -393,17 +343,8 @@ public class AchievementsActivity extends NavigationBaseActivity {
|
|||
TextView shareMessage = (TextView) view.findViewById(R.id.alert_text);
|
||||
shareMessage.setText(R.string.achievements_share_message);
|
||||
alertadd.setView(view);
|
||||
alertadd.setPositiveButton(R.string.about_translate_proceed, new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
shareScreen(screenshot);
|
||||
}
|
||||
});
|
||||
alertadd.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
dialog.cancel();
|
||||
}
|
||||
});
|
||||
alertadd.setPositiveButton(R.string.about_translate_proceed, (dialog, which) -> shareScreen(screenshot));
|
||||
alertadd.setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.cancel());
|
||||
alertadd.show();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue