mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-11-02 15:53:55 +01:00
Merge pull request #1 from u7479759/Improve-Kotlin-conversion-of-Achievement-Models
Converted kotlin classes into data classes and added immutability
This commit is contained in:
commit
1bd5ccfa05
3 changed files with 104 additions and 153 deletions
|
|
@ -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,
|
)
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue