Changed to data classes, and added immutability

This commit is contained in:
u7479759 2024-10-27 20:56:37 +11:00
parent bc065c8792
commit fd0141a5b4
3 changed files with 104 additions and 153 deletions

View file

@ -1,104 +1,45 @@
package fr.free.nrw.commons.profile.achievements package fr.free.nrw.commons.profile.achievements
/** /**
* Represents Achievements class and stores all the parameters * Represents Achievements data class and stores all the parameters.
* Immutable version with default values for optional properties.
*/ */
class Achievements { data class Achievements(
val uniqueUsedImages: Int = 0,
val articlesUsingImages: Int = 0,
val thanksReceived: Int = 0,
val featuredImages: Int = 0,
val qualityImages: Int = 0,
val imagesUploaded: Int = 0,
val revertCount: Int = 0
) {
/** /**
* The count of unique images used by the wiki. * Used to calculate the percentages of images that haven't been reverted.
* @return The count of unique images used. * Returns 100 if imagesUploaded is 0 to avoid division by zero.
* @param uniqueUsedImages The count to set for unique images used.
*/
var uniqueUsedImages = 0
private var articlesUsingImages = 0
/**
* The count of thanks received.
* @return The count of thanks received.
* @param thanksReceived The count to set for thanks received.
*/
var thanksReceived = 0
/**
* The count of featured images.
* @return The count of featured images.
* @param featuredImages The count to set for featured images.
*/
var featuredImages = 0
/**
* The count of quality images.
* @return The count of quality images.
* @param qualityImages The count to set for quality images.
*/
var qualityImages = 0
/**
* The count of images uploaded.
* @return The count of images uploaded.
* @param imagesUploaded The count to set for images uploaded.
*/
var imagesUploaded = 0
private var revertCount = 0
constructor() {}
/**
* constructor for achievements class to set its data members
* @param uniqueUsedImages
* @param articlesUsingImages
* @param thanksReceived
* @param featuredImages
* @param imagesUploaded
* @param revertCount
*/
constructor(
uniqueUsedImages: Int,
articlesUsingImages: Int,
thanksReceived: Int,
featuredImages: Int,
qualityImages: Int,
imagesUploaded: Int,
revertCount: Int,
) {
this.uniqueUsedImages = uniqueUsedImages
this.articlesUsingImages = articlesUsingImages
this.thanksReceived = thanksReceived
this.featuredImages = featuredImages
this.qualityImages = qualityImages
this.imagesUploaded = imagesUploaded
this.revertCount = revertCount
}
/**
* used to calculate the percentages of images that haven't been reverted
* @return
*/ */
val notRevertPercentage: Int val notRevertPercentage: Int
get() = get() = if (imagesUploaded > 0) {
try { (imagesUploaded - revertCount) * 100 / imagesUploaded
(imagesUploaded - revertCount) * 100 / imagesUploaded } else {
} catch (divideByZero: ArithmeticException) { 100
100 }
}
companion object { companion object {
/** /**
* Get Achievements object from FeedbackResponse * Get Achievements object from FeedbackResponse.
* *
* @param response * @param response The feedback response to convert.
* @return * @return An Achievements object with values from the response.
*/ */
@JvmStatic @JvmStatic
fun from(response: FeedbackResponse): Achievements = fun from(response: FeedbackResponse): Achievements = Achievements(
Achievements( uniqueUsedImages = response.uniqueUsedImages,
response.uniqueUsedImages, articlesUsingImages = response.articlesUsingImages,
response.articlesUsingImages, thanksReceived = response.thanksReceived,
response.thanksReceived, featuredImages = response.featuredImages.featuredPicturesOnWikimediaCommons,
response.featuredImages.featuredPicturesOnWikimediaCommons, qualityImages = response.featuredImages.qualityImages,
response.featuredImages.qualityImages, imagesUploaded = 0, // Assuming imagesUploaded should be 0
0, revertCount = response.deletedUploads
response.deletedUploads, )
)
} }
} }

View file

@ -104,7 +104,7 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
// Used for the setting the size of imageView at runtime // Used for the setting the size of imageView at runtime
ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams)
binding.achievementBadgeImage.getLayoutParams(); binding.achievementBadgeImage.getLayoutParams();
params.height = (int) (height * BADGE_IMAGE_HEIGHT_RATIO); params.height = (int) (height * BADGE_IMAGE_HEIGHT_RATIO);
params.width = (int) (width * BADGE_IMAGE_WIDTH_RATIO); params.width = (int) (width * BADGE_IMAGE_WIDTH_RATIO);
binding.achievementBadgeImage.requestLayout(); binding.achievementBadgeImage.requestLayout();
@ -185,37 +185,37 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
try{ try{
compositeDisposable.add(okHttpJsonApiClient compositeDisposable.add(okHttpJsonApiClient
.getAchievements(Objects.requireNonNull(userName)) .getAchievements(Objects.requireNonNull(userName))
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe( .subscribe(
response -> { response -> {
if (response != null) { if (response != null) {
setUploadCount(Achievements.from(response)); setUploadCount(Achievements.from(response));
} else { } else {
Timber.d("success"); Timber.d("success");
binding.layoutImageReverts.setVisibility(View.INVISIBLE); binding.layoutImageReverts.setVisibility(View.INVISIBLE);
binding.achievementBadgeImage.setVisibility(View.INVISIBLE); binding.achievementBadgeImage.setVisibility(View.INVISIBLE);
// If the number of edits made by the user are more than 150,000 // If the number of edits made by the user are more than 150,000
// in some cases such high number of wiki edit counts cause the // in some cases such high number of wiki edit counts cause the
// achievements calculator to fail in some cases, for more details // achievements calculator to fail in some cases, for more details
// refer Issue: #3295 // refer Issue: #3295
if (numberOfEdits <= 150000) { if (numberOfEdits <= 150000) {
showSnackBarWithRetry(false); showSnackBarWithRetry(false);
} else { } else {
showSnackBarWithRetry(true); showSnackBarWithRetry(true);
}
}
},
t -> {
Timber.e(t, "Fetching achievements statistics failed");
if (numberOfEdits <= 150000) {
showSnackBarWithRetry(false);
} else {
showSnackBarWithRetry(true);
}
} }
)); }
},
t -> {
Timber.e(t, "Fetching achievements statistics failed");
if (numberOfEdits <= 150000) {
showSnackBarWithRetry(false);
} else {
showSnackBarWithRetry(true);
}
}
));
} }
catch (Exception e){ catch (Exception e){
Timber.d(e+"success"); Timber.d(e+"success");
@ -232,15 +232,15 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
return; return;
} }
compositeDisposable.add(okHttpJsonApiClient compositeDisposable.add(okHttpJsonApiClient
.getWikidataEdits(userName) .getWikidataEdits(userName)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe(edits -> { .subscribe(edits -> {
numberOfEdits = edits; numberOfEdits = edits;
binding.wikidataEdits.setText(String.valueOf(edits)); binding.wikidataEdits.setText(String.valueOf(edits));
}, e -> { }, e -> {
Timber.e("Error:" + e); Timber.e("Error:" + e);
})); }));
} }
/** /**
@ -254,11 +254,11 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
if (tooManyAchievements) { if (tooManyAchievements) {
binding.progressBar.setVisibility(View.GONE); binding.progressBar.setVisibility(View.GONE);
ViewUtil.showDismissibleSnackBar(getActivity().findViewById(android.R.id.content), ViewUtil.showDismissibleSnackBar(getActivity().findViewById(android.R.id.content),
R.string.achievements_fetch_failed_ultimate_achievement, R.string.retry, view -> setAchievements()); R.string.achievements_fetch_failed_ultimate_achievement, R.string.retry, view -> setAchievements());
} else { } else {
binding.progressBar.setVisibility(View.GONE); binding.progressBar.setVisibility(View.GONE);
ViewUtil.showDismissibleSnackBar(getActivity().findViewById(android.R.id.content), ViewUtil.showDismissibleSnackBar(getActivity().findViewById(android.R.id.content),
R.string.achievements_fetch_failed, R.string.retry, view -> setAchievements()); R.string.achievements_fetch_failed, R.string.retry, view -> setAchievements());
} }
} }
@ -276,16 +276,16 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
private void setUploadCount(Achievements achievements) { private void setUploadCount(Achievements achievements) {
if (checkAccount()) { if (checkAccount()) {
compositeDisposable.add(okHttpJsonApiClient compositeDisposable.add(okHttpJsonApiClient
.getUploadCount(Objects.requireNonNull(userName)) .getUploadCount(Objects.requireNonNull(userName))
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe( .subscribe(
uploadCount -> setAchievementsUploadCount(achievements, uploadCount), uploadCount -> setAchievementsUploadCount(achievements, uploadCount),
t -> { t -> {
Timber.e(t, "Fetching upload count failed"); Timber.e(t, "Fetching upload count failed");
onError(); onError();
} }
)); ));
} }
} }
@ -294,8 +294,18 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
* @param uploadCount * @param uploadCount
*/ */
private void setAchievementsUploadCount(Achievements achievements, int uploadCount) { private void setAchievementsUploadCount(Achievements achievements, int uploadCount) {
achievements.setImagesUploaded(uploadCount); // Create a new instance of Achievements with updated imagesUploaded
hideProgressBar(achievements); Achievements updatedAchievements = new Achievements(
achievements.getUniqueUsedImages(),
achievements.getArticlesUsingImages(),
achievements.getThanksReceived(),
achievements.getFeaturedImages(),
achievements.getQualityImages(),
uploadCount, // Update imagesUploaded with new value
achievements.getRevertCount()
);
hideProgressBar(updatedAchievements);
} }
/** /**
@ -308,7 +318,7 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
}else { }else {
binding.imagesUploadedProgressbar.setVisibility(View.VISIBLE); binding.imagesUploadedProgressbar.setVisibility(View.VISIBLE);
binding.imagesUploadedProgressbar.setProgress binding.imagesUploadedProgressbar.setProgress
(100*uploadCount/levelInfo.getMaxUploadCount()); (100*uploadCount/levelInfo.getMaxUploadCount());
binding.tvUploadedImages.setText binding.tvUploadedImages.setText
(uploadCount + "/" + levelInfo.getMaxUploadCount()); (uploadCount + "/" + levelInfo.getMaxUploadCount());
} }
@ -317,8 +327,8 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
private void setZeroAchievements() { private void setZeroAchievements() {
String message = !Objects.equals(sessionManager.getUserName(), userName) ? String message = !Objects.equals(sessionManager.getUserName(), userName) ?
getString(R.string.no_achievements_yet, userName) : getString(R.string.no_achievements_yet, userName) :
getString(R.string.you_have_no_achievements_yet); getString(R.string.you_have_no_achievements_yet);
DialogUtil.showAlertDialog(getActivity(), DialogUtil.showAlertDialog(getActivity(),
null, null,
message, message,
@ -356,7 +366,7 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
// binding.imagesUsedByWikiProgressBar.setVisibility(View.VISIBLE); // binding.imagesUsedByWikiProgressBar.setVisibility(View.VISIBLE);
binding.thanksReceived.setText(String.valueOf(achievements.getThanksReceived())); binding.thanksReceived.setText(String.valueOf(achievements.getThanksReceived()));
binding.imagesUsedByWikiProgressBar.setProgress binding.imagesUsedByWikiProgressBar.setProgress
(100 * achievements.getUniqueUsedImages() / levelInfo.getMaxUniqueImages()); (100 * achievements.getUniqueUsedImages() / levelInfo.getMaxUniqueImages());
binding.tvWikiPb.setText(achievements.getUniqueUsedImages() + "/" binding.tvWikiPb.setText(achievements.getUniqueUsedImages() + "/"
+ levelInfo.getMaxUniqueImages()); + levelInfo.getMaxUniqueImages());
binding.imageFeatured.setText(String.valueOf(achievements.getFeaturedImages())); binding.imageFeatured.setText(String.valueOf(achievements.getFeaturedImages()));
@ -365,7 +375,7 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
levelUpInfoString += " " + levelInfo.getLevelNumber(); levelUpInfoString += " " + levelInfo.getLevelNumber();
binding.achievementLevel.setText(levelUpInfoString); binding.achievementLevel.setText(levelUpInfoString);
binding.achievementBadgeImage.setImageDrawable(VectorDrawableCompat.create(getResources(), R.drawable.badge, binding.achievementBadgeImage.setImageDrawable(VectorDrawableCompat.create(getResources(), R.drawable.badge,
new ContextThemeWrapper(getActivity(), levelInfo.getLevelStyle()).getTheme())); new ContextThemeWrapper(getActivity(), levelInfo.getLevelStyle()).getTheme()));
binding.achievementBadgeText.setText(Integer.toString(levelInfo.getLevelNumber())); binding.achievementBadgeText.setText(Integer.toString(levelInfo.getLevelNumber()));
BasicKvStore store = new BasicKvStore(this.getContext(), userName); BasicKvStore store = new BasicKvStore(this.getContext(), userName);
store.putString("userAchievementsLevel", Integer.toString(levelInfo.getLevelNumber())); store.putString("userAchievementsLevel", Integer.toString(levelInfo.getLevelNumber()));
@ -377,8 +387,8 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
private void hideProgressBar(Achievements achievements) { private void hideProgressBar(Achievements achievements) {
if (binding.progressBar != null) { if (binding.progressBar != null) {
levelInfo = LevelController.LevelInfo.from(achievements.getImagesUploaded(), levelInfo = LevelController.LevelInfo.from(achievements.getImagesUploaded(),
achievements.getUniqueUsedImages(), achievements.getUniqueUsedImages(),
achievements.getNotRevertPercentage()); achievements.getNotRevertPercentage());
inflateAchievements(achievements); inflateAchievements(achievements);
setUploadProgress(achievements.getImagesUploaded()); setUploadProgress(achievements.getImagesUploaded());
setImageRevertPercentage(achievements.getNotRevertPercentage()); setImageRevertPercentage(achievements.getNotRevertPercentage());
@ -478,4 +488,4 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
} }
return true; return true;
} }
} }

View file

@ -6,7 +6,7 @@ import com.google.gson.annotations.SerializedName
* Represents Featured Images on WikiMedia Commons platform * Represents Featured Images on WikiMedia Commons platform
* Used by Achievements and FeedbackResponse (objects) of the user * Used by Achievements and FeedbackResponse (objects) of the user
*/ */
class FeaturedImages( data class FeaturedImages(
@field:SerializedName("Quality_images") val qualityImages: Int, @field:SerializedName("Quality_images") val qualityImages: Int,
@field:SerializedName("Featured_pictures_on_Wikimedia_Commons") val featuredPicturesOnWikimediaCommons: Int, @field:SerializedName("Featured_pictures_on_Wikimedia_Commons") val featuredPicturesOnWikimediaCommons: Int,
) )