Skip to content

Commit 088dd24

Browse files
Changed to data classes, and added immutability (commons-app#5905)
Co-authored-by: Jinniu Du <[email protected]>
1 parent cf88f9b commit 088dd24

File tree

3 files changed

+104
-153
lines changed

3 files changed

+104
-153
lines changed
Lines changed: 31 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,45 @@
11
package fr.free.nrw.commons.profile.achievements
22

33
/**
4-
* Represents Achievements class and stores all the parameters
4+
* Represents Achievements data class and stores all the parameters.
5+
* Immutable version with default values for optional properties.
56
*/
6-
class Achievements {
7+
data class Achievements(
8+
val uniqueUsedImages: Int = 0,
9+
val articlesUsingImages: Int = 0,
10+
val thanksReceived: Int = 0,
11+
val featuredImages: Int = 0,
12+
val qualityImages: Int = 0,
13+
val imagesUploaded: Int = 0,
14+
val revertCount: Int = 0
15+
) {
716
/**
8-
* The count of unique images used by the wiki.
9-
* @return The count of unique images used.
10-
* @param uniqueUsedImages The count to set for unique images used.
11-
*/
12-
var uniqueUsedImages = 0
13-
private var articlesUsingImages = 0
14-
15-
/**
16-
* The count of thanks received.
17-
* @return The count of thanks received.
18-
* @param thanksReceived The count to set for thanks received.
19-
*/
20-
var thanksReceived = 0
21-
22-
/**
23-
* The count of featured images.
24-
* @return The count of featured images.
25-
* @param featuredImages The count to set for featured images.
26-
*/
27-
var featuredImages = 0
28-
29-
/**
30-
* The count of quality images.
31-
* @return The count of quality images.
32-
* @param qualityImages The count to set for quality images.
33-
*/
34-
var qualityImages = 0
35-
36-
/**
37-
* The count of images uploaded.
38-
* @return The count of images uploaded.
39-
* @param imagesUploaded The count to set for images uploaded.
40-
*/
41-
var imagesUploaded = 0
42-
private var revertCount = 0
43-
44-
constructor() {}
45-
46-
/**
47-
* constructor for achievements class to set its data members
48-
* @param uniqueUsedImages
49-
* @param articlesUsingImages
50-
* @param thanksReceived
51-
* @param featuredImages
52-
* @param imagesUploaded
53-
* @param revertCount
54-
*/
55-
constructor(
56-
uniqueUsedImages: Int,
57-
articlesUsingImages: Int,
58-
thanksReceived: Int,
59-
featuredImages: Int,
60-
qualityImages: Int,
61-
imagesUploaded: Int,
62-
revertCount: Int,
63-
) {
64-
this.uniqueUsedImages = uniqueUsedImages
65-
this.articlesUsingImages = articlesUsingImages
66-
this.thanksReceived = thanksReceived
67-
this.featuredImages = featuredImages
68-
this.qualityImages = qualityImages
69-
this.imagesUploaded = imagesUploaded
70-
this.revertCount = revertCount
71-
}
72-
73-
/**
74-
* used to calculate the percentages of images that haven't been reverted
75-
* @return
17+
* Used to calculate the percentages of images that haven't been reverted.
18+
* Returns 100 if imagesUploaded is 0 to avoid division by zero.
7619
*/
7720
val notRevertPercentage: Int
78-
get() =
79-
try {
80-
(imagesUploaded - revertCount) * 100 / imagesUploaded
81-
} catch (divideByZero: ArithmeticException) {
82-
100
83-
}
21+
get() = if (imagesUploaded > 0) {
22+
(imagesUploaded - revertCount) * 100 / imagesUploaded
23+
} else {
24+
100
25+
}
8426

8527
companion object {
8628
/**
87-
* Get Achievements object from FeedbackResponse
29+
* Get Achievements object from FeedbackResponse.
8830
*
89-
* @param response
90-
* @return
31+
* @param response The feedback response to convert.
32+
* @return An Achievements object with values from the response.
9133
*/
9234
@JvmStatic
93-
fun from(response: FeedbackResponse): Achievements =
94-
Achievements(
95-
response.uniqueUsedImages,
96-
response.articlesUsingImages,
97-
response.thanksReceived,
98-
response.featuredImages.featuredPicturesOnWikimediaCommons,
99-
response.featuredImages.qualityImages,
100-
0,
101-
response.deletedUploads,
102-
)
35+
fun from(response: FeedbackResponse): Achievements = Achievements(
36+
uniqueUsedImages = response.uniqueUsedImages,
37+
articlesUsingImages = response.articlesUsingImages,
38+
thanksReceived = response.thanksReceived,
39+
featuredImages = response.featuredImages.featuredPicturesOnWikimediaCommons,
40+
qualityImages = response.featuredImages.qualityImages,
41+
imagesUploaded = 0, // Assuming imagesUploaded should be 0
42+
revertCount = response.deletedUploads
43+
)
10344
}
104-
}
45+
}

app/src/main/java/fr/free/nrw/commons/profile/achievements/AchievementsFragment.java

Lines changed: 72 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
105105

106106
// Used for the setting the size of imageView at runtime
107107
ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams)
108-
binding.achievementBadgeImage.getLayoutParams();
108+
binding.achievementBadgeImage.getLayoutParams();
109109
params.height = (int) (height * BADGE_IMAGE_HEIGHT_RATIO);
110110
params.width = (int) (width * BADGE_IMAGE_WIDTH_RATIO);
111111
binding.achievementBadgeImage.requestLayout();
@@ -186,37 +186,37 @@ private void setAchievements() {
186186
try{
187187

188188
compositeDisposable.add(okHttpJsonApiClient
189-
.getAchievements(Objects.requireNonNull(userName))
190-
.subscribeOn(Schedulers.io())
191-
.observeOn(AndroidSchedulers.mainThread())
192-
.subscribe(
193-
response -> {
194-
if (response != null) {
195-
setUploadCount(Achievements.from(response));
196-
} else {
197-
Timber.d("success");
198-
binding.layoutImageReverts.setVisibility(View.INVISIBLE);
199-
binding.achievementBadgeImage.setVisibility(View.INVISIBLE);
200-
// If the number of edits made by the user are more than 150,000
201-
// in some cases such high number of wiki edit counts cause the
202-
// achievements calculator to fail in some cases, for more details
203-
// refer Issue: #3295
204-
if (numberOfEdits <= 150000) {
205-
showSnackBarWithRetry(false);
206-
} else {
207-
showSnackBarWithRetry(true);
208-
}
209-
}
210-
},
211-
t -> {
212-
Timber.e(t, "Fetching achievements statistics failed");
213-
if (numberOfEdits <= 150000) {
214-
showSnackBarWithRetry(false);
215-
} else {
216-
showSnackBarWithRetry(true);
217-
}
189+
.getAchievements(Objects.requireNonNull(userName))
190+
.subscribeOn(Schedulers.io())
191+
.observeOn(AndroidSchedulers.mainThread())
192+
.subscribe(
193+
response -> {
194+
if (response != null) {
195+
setUploadCount(Achievements.from(response));
196+
} else {
197+
Timber.d("success");
198+
binding.layoutImageReverts.setVisibility(View.INVISIBLE);
199+
binding.achievementBadgeImage.setVisibility(View.INVISIBLE);
200+
// If the number of edits made by the user are more than 150,000
201+
// in some cases such high number of wiki edit counts cause the
202+
// achievements calculator to fail in some cases, for more details
203+
// refer Issue: #3295
204+
if (numberOfEdits <= 150000) {
205+
showSnackBarWithRetry(false);
206+
} else {
207+
showSnackBarWithRetry(true);
218208
}
219-
));
209+
}
210+
},
211+
t -> {
212+
Timber.e(t, "Fetching achievements statistics failed");
213+
if (numberOfEdits <= 150000) {
214+
showSnackBarWithRetry(false);
215+
} else {
216+
showSnackBarWithRetry(true);
217+
}
218+
}
219+
));
220220
}
221221
catch (Exception e){
222222
Timber.d(e+"success");
@@ -233,15 +233,15 @@ private void setWikidataEditCount() {
233233
return;
234234
}
235235
compositeDisposable.add(okHttpJsonApiClient
236-
.getWikidataEdits(userName)
237-
.subscribeOn(Schedulers.io())
238-
.observeOn(AndroidSchedulers.mainThread())
239-
.subscribe(edits -> {
240-
numberOfEdits = edits;
241-
binding.wikidataEdits.setText(String.valueOf(edits));
242-
}, e -> {
243-
Timber.e("Error:" + e);
244-
}));
236+
.getWikidataEdits(userName)
237+
.subscribeOn(Schedulers.io())
238+
.observeOn(AndroidSchedulers.mainThread())
239+
.subscribe(edits -> {
240+
numberOfEdits = edits;
241+
binding.wikidataEdits.setText(String.valueOf(edits));
242+
}, e -> {
243+
Timber.e("Error:" + e);
244+
}));
245245
}
246246

247247
/**
@@ -255,11 +255,11 @@ private void showSnackBarWithRetry(boolean tooManyAchievements) {
255255
if (tooManyAchievements) {
256256
binding.progressBar.setVisibility(View.GONE);
257257
ViewUtil.showDismissibleSnackBar(getActivity().findViewById(android.R.id.content),
258-
R.string.achievements_fetch_failed_ultimate_achievement, R.string.retry, view -> setAchievements());
258+
R.string.achievements_fetch_failed_ultimate_achievement, R.string.retry, view -> setAchievements());
259259
} else {
260260
binding.progressBar.setVisibility(View.GONE);
261261
ViewUtil.showDismissibleSnackBar(getActivity().findViewById(android.R.id.content),
262-
R.string.achievements_fetch_failed, R.string.retry, view -> setAchievements());
262+
R.string.achievements_fetch_failed, R.string.retry, view -> setAchievements());
263263
}
264264
}
265265

@@ -277,16 +277,16 @@ private void onError() {
277277
private void setUploadCount(Achievements achievements) {
278278
if (checkAccount()) {
279279
compositeDisposable.add(okHttpJsonApiClient
280-
.getUploadCount(Objects.requireNonNull(userName))
281-
.subscribeOn(Schedulers.io())
282-
.observeOn(AndroidSchedulers.mainThread())
283-
.subscribe(
284-
uploadCount -> setAchievementsUploadCount(achievements, uploadCount),
285-
t -> {
286-
Timber.e(t, "Fetching upload count failed");
287-
onError();
288-
}
289-
));
280+
.getUploadCount(Objects.requireNonNull(userName))
281+
.subscribeOn(Schedulers.io())
282+
.observeOn(AndroidSchedulers.mainThread())
283+
.subscribe(
284+
uploadCount -> setAchievementsUploadCount(achievements, uploadCount),
285+
t -> {
286+
Timber.e(t, "Fetching upload count failed");
287+
onError();
288+
}
289+
));
290290
}
291291
}
292292

@@ -295,8 +295,18 @@ private void setUploadCount(Achievements achievements) {
295295
* @param uploadCount
296296
*/
297297
private void setAchievementsUploadCount(Achievements achievements, int uploadCount) {
298-
achievements.setImagesUploaded(uploadCount);
299-
hideProgressBar(achievements);
298+
// Create a new instance of Achievements with updated imagesUploaded
299+
Achievements updatedAchievements = new Achievements(
300+
achievements.getUniqueUsedImages(),
301+
achievements.getArticlesUsingImages(),
302+
achievements.getThanksReceived(),
303+
achievements.getFeaturedImages(),
304+
achievements.getQualityImages(),
305+
uploadCount, // Update imagesUploaded with new value
306+
achievements.getRevertCount()
307+
);
308+
309+
hideProgressBar(updatedAchievements);
300310
}
301311

302312
/**
@@ -309,7 +319,7 @@ private void setUploadProgress(int uploadCount){
309319
}else {
310320
binding.imagesUploadedProgressbar.setVisibility(View.VISIBLE);
311321
binding.imagesUploadedProgressbar.setProgress
312-
(100*uploadCount/levelInfo.getMaxUploadCount());
322+
(100*uploadCount/levelInfo.getMaxUploadCount());
313323
binding.tvUploadedImages.setText
314324
(uploadCount + "/" + levelInfo.getMaxUploadCount());
315325
}
@@ -318,8 +328,8 @@ private void setUploadProgress(int uploadCount){
318328

319329
private void setZeroAchievements() {
320330
String message = !Objects.equals(sessionManager.getUserName(), userName) ?
321-
getString(R.string.no_achievements_yet, userName) :
322-
getString(R.string.you_have_no_achievements_yet);
331+
getString(R.string.no_achievements_yet, userName) :
332+
getString(R.string.you_have_no_achievements_yet);
323333
DialogUtil.showAlertDialog(getActivity(),
324334
null,
325335
message,
@@ -357,7 +367,7 @@ private void inflateAchievements(Achievements achievements) {
357367
// binding.imagesUsedByWikiProgressBar.setVisibility(View.VISIBLE);
358368
binding.thanksReceived.setText(String.valueOf(achievements.getThanksReceived()));
359369
binding.imagesUsedByWikiProgressBar.setProgress
360-
(100 * achievements.getUniqueUsedImages() / levelInfo.getMaxUniqueImages());
370+
(100 * achievements.getUniqueUsedImages() / levelInfo.getMaxUniqueImages());
361371
binding.tvWikiPb.setText(achievements.getUniqueUsedImages() + "/"
362372
+ levelInfo.getMaxUniqueImages());
363373
binding.imageFeatured.setText(String.valueOf(achievements.getFeaturedImages()));
@@ -366,7 +376,7 @@ private void inflateAchievements(Achievements achievements) {
366376
levelUpInfoString += " " + levelInfo.getLevelNumber();
367377
binding.achievementLevel.setText(levelUpInfoString);
368378
binding.achievementBadgeImage.setImageDrawable(VectorDrawableCompat.create(getResources(), R.drawable.badge,
369-
new ContextThemeWrapper(getActivity(), levelInfo.getLevelStyle()).getTheme()));
379+
new ContextThemeWrapper(getActivity(), levelInfo.getLevelStyle()).getTheme()));
370380
binding.achievementBadgeText.setText(Integer.toString(levelInfo.getLevelNumber()));
371381
BasicKvStore store = new BasicKvStore(this.getContext(), userName);
372382
store.putString("userAchievementsLevel", Integer.toString(levelInfo.getLevelNumber()));
@@ -378,8 +388,8 @@ private void inflateAchievements(Achievements achievements) {
378388
private void hideProgressBar(Achievements achievements) {
379389
if (binding.progressBar != null) {
380390
levelInfo = LevelController.LevelInfo.from(achievements.getImagesUploaded(),
381-
achievements.getUniqueUsedImages(),
382-
achievements.getNotRevertPercentage());
391+
achievements.getUniqueUsedImages(),
392+
achievements.getNotRevertPercentage());
383393
inflateAchievements(achievements);
384394
setUploadProgress(achievements.getImagesUploaded());
385395
setImageRevertPercentage(achievements.getNotRevertPercentage());
@@ -479,4 +489,4 @@ private boolean checkAccount(){
479489
}
480490
return true;
481491
}
482-
}
492+
}

app/src/main/java/fr/free/nrw/commons/profile/achievements/FeaturedImages.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import com.google.gson.annotations.SerializedName
66
* Represents Featured Images on WikiMedia Commons platform
77
* Used by Achievements and FeedbackResponse (objects) of the user
88
*/
9-
class FeaturedImages(
9+
data class FeaturedImages(
1010
@field:SerializedName("Quality_images") val qualityImages: Int,
1111
@field:SerializedName("Featured_pictures_on_Wikimedia_Commons") val featuredPicturesOnWikimediaCommons: Int,
1212
)

0 commit comments

Comments
 (0)