mirror of
				https://github.com/commons-app/apps-android-commons.git
				synced 2025-10-31 14:53:59 +01:00 
			
		
		
		
	Changed to data classes, and added immutability
This commit is contained in:
		
							parent
							
								
									bc065c8792
								
							
						
					
					
						commit
						fd0141a5b4
					
				
					 3 changed files with 104 additions and 153 deletions
				
			
		|  | @ -1,104 +1,45 @@ | |||
| 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. | ||||
|      * @return The count of unique images used. | ||||
|      * @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 | ||||
|      * Used to calculate the percentages of images that haven't been reverted. | ||||
|      * Returns 100 if imagesUploaded is 0 to avoid division by zero. | ||||
|      */ | ||||
|     val notRevertPercentage: Int | ||||
|         get() = | ||||
|             try { | ||||
|                 (imagesUploaded - revertCount) * 100 / imagesUploaded | ||||
|             } catch (divideByZero: ArithmeticException) { | ||||
|                 100 | ||||
|             } | ||||
|         get() = if (imagesUploaded > 0) { | ||||
|             (imagesUploaded - revertCount) * 100 / imagesUploaded | ||||
|         } else { | ||||
|             100 | ||||
|         } | ||||
| 
 | ||||
|     companion object { | ||||
|         /** | ||||
|          * Get Achievements object from FeedbackResponse | ||||
|          * Get Achievements object from FeedbackResponse. | ||||
|          * | ||||
|          * @param response | ||||
|          * @return | ||||
|          * @param response The feedback response to convert. | ||||
|          * @return An Achievements object with values from the response. | ||||
|          */ | ||||
|         @JvmStatic | ||||
|         fun from(response: FeedbackResponse): Achievements = | ||||
|             Achievements( | ||||
|                 response.uniqueUsedImages, | ||||
|                 response.articlesUsingImages, | ||||
|                 response.thanksReceived, | ||||
|                 response.featuredImages.featuredPicturesOnWikimediaCommons, | ||||
|                 response.featuredImages.qualityImages, | ||||
|                 0, | ||||
|                 response.deletedUploads, | ||||
|             ) | ||||
|         fun from(response: FeedbackResponse): Achievements = Achievements( | ||||
|             uniqueUsedImages = response.uniqueUsedImages, | ||||
|             articlesUsingImages = response.articlesUsingImages, | ||||
|             thanksReceived = response.thanksReceived, | ||||
|             featuredImages = response.featuredImages.featuredPicturesOnWikimediaCommons, | ||||
|             qualityImages = response.featuredImages.qualityImages, | ||||
|             imagesUploaded = 0,  // Assuming imagesUploaded should be 0 | ||||
|             revertCount = response.deletedUploads | ||||
|         ) | ||||
|     } | ||||
| } | ||||
| } | ||||
|  | @ -104,7 +104,7 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment { | |||
| 
 | ||||
|         // Used for the setting the size of imageView at runtime | ||||
|         ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) | ||||
|                 binding.achievementBadgeImage.getLayoutParams(); | ||||
|             binding.achievementBadgeImage.getLayoutParams(); | ||||
|         params.height = (int) (height * BADGE_IMAGE_HEIGHT_RATIO); | ||||
|         params.width = (int) (width * BADGE_IMAGE_WIDTH_RATIO); | ||||
|         binding.achievementBadgeImage.requestLayout(); | ||||
|  | @ -185,37 +185,37 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment { | |||
|             try{ | ||||
| 
 | ||||
|                 compositeDisposable.add(okHttpJsonApiClient | ||||
|                         .getAchievements(Objects.requireNonNull(userName)) | ||||
|                         .subscribeOn(Schedulers.io()) | ||||
|                         .observeOn(AndroidSchedulers.mainThread()) | ||||
|                         .subscribe( | ||||
|                                 response -> { | ||||
|                                     if (response != null) { | ||||
|                                         setUploadCount(Achievements.from(response)); | ||||
|                                     } else { | ||||
|                                         Timber.d("success"); | ||||
|                                         binding.layoutImageReverts.setVisibility(View.INVISIBLE); | ||||
|                                         binding.achievementBadgeImage.setVisibility(View.INVISIBLE); | ||||
|                                         // 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 | ||||
|                                         // achievements calculator to fail in some cases, for more details | ||||
|                                         // refer Issue: #3295 | ||||
|                                         if (numberOfEdits <= 150000) { | ||||
|                                             showSnackBarWithRetry(false); | ||||
|                                         } else { | ||||
|                                             showSnackBarWithRetry(true); | ||||
|                                         } | ||||
|                                     } | ||||
|                                 }, | ||||
|                                 t -> { | ||||
|                                     Timber.e(t, "Fetching achievements statistics failed"); | ||||
|                                     if (numberOfEdits <= 150000) { | ||||
|                                         showSnackBarWithRetry(false); | ||||
|                                     } else { | ||||
|                                         showSnackBarWithRetry(true); | ||||
|                                     } | ||||
|                     .getAchievements(Objects.requireNonNull(userName)) | ||||
|                     .subscribeOn(Schedulers.io()) | ||||
|                     .observeOn(AndroidSchedulers.mainThread()) | ||||
|                     .subscribe( | ||||
|                         response -> { | ||||
|                             if (response != null) { | ||||
|                                 setUploadCount(Achievements.from(response)); | ||||
|                             } else { | ||||
|                                 Timber.d("success"); | ||||
|                                 binding.layoutImageReverts.setVisibility(View.INVISIBLE); | ||||
|                                 binding.achievementBadgeImage.setVisibility(View.INVISIBLE); | ||||
|                                 // 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 | ||||
|                                 // achievements calculator to fail in some cases, for more details | ||||
|                                 // refer Issue: #3295 | ||||
|                                 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){ | ||||
|                 Timber.d(e+"success"); | ||||
|  | @ -232,15 +232,15 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment { | |||
|             return; | ||||
|         } | ||||
|         compositeDisposable.add(okHttpJsonApiClient | ||||
|                 .getWikidataEdits(userName) | ||||
|                 .subscribeOn(Schedulers.io()) | ||||
|                 .observeOn(AndroidSchedulers.mainThread()) | ||||
|                 .subscribe(edits -> { | ||||
|                     numberOfEdits = edits; | ||||
|                     binding.wikidataEdits.setText(String.valueOf(edits)); | ||||
|                 }, e -> { | ||||
|                     Timber.e("Error:" + e); | ||||
|                 })); | ||||
|             .getWikidataEdits(userName) | ||||
|             .subscribeOn(Schedulers.io()) | ||||
|             .observeOn(AndroidSchedulers.mainThread()) | ||||
|             .subscribe(edits -> { | ||||
|                 numberOfEdits = edits; | ||||
|                 binding.wikidataEdits.setText(String.valueOf(edits)); | ||||
|             }, e -> { | ||||
|                 Timber.e("Error:" + e); | ||||
|             })); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | @ -254,11 +254,11 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment { | |||
|         if (tooManyAchievements) { | ||||
|             binding.progressBar.setVisibility(View.GONE); | ||||
|             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 { | ||||
|             binding.progressBar.setVisibility(View.GONE); | ||||
|             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) { | ||||
|         if (checkAccount()) { | ||||
|             compositeDisposable.add(okHttpJsonApiClient | ||||
|                     .getUploadCount(Objects.requireNonNull(userName)) | ||||
|                     .subscribeOn(Schedulers.io()) | ||||
|                     .observeOn(AndroidSchedulers.mainThread()) | ||||
|                     .subscribe( | ||||
|                             uploadCount -> setAchievementsUploadCount(achievements, uploadCount), | ||||
|                             t -> { | ||||
|                                 Timber.e(t, "Fetching upload count failed"); | ||||
|                                 onError(); | ||||
|                             } | ||||
|                     )); | ||||
|                 .getUploadCount(Objects.requireNonNull(userName)) | ||||
|                 .subscribeOn(Schedulers.io()) | ||||
|                 .observeOn(AndroidSchedulers.mainThread()) | ||||
|                 .subscribe( | ||||
|                     uploadCount -> setAchievementsUploadCount(achievements, uploadCount), | ||||
|                     t -> { | ||||
|                         Timber.e(t, "Fetching upload count failed"); | ||||
|                         onError(); | ||||
|                     } | ||||
|                 )); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  | @ -294,8 +294,18 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment { | |||
|      * @param uploadCount | ||||
|      */ | ||||
|     private void setAchievementsUploadCount(Achievements achievements, int uploadCount) { | ||||
|         achievements.setImagesUploaded(uploadCount); | ||||
|         hideProgressBar(achievements); | ||||
|         // Create a new instance of Achievements with updated imagesUploaded | ||||
|         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 { | ||||
|             binding.imagesUploadedProgressbar.setVisibility(View.VISIBLE); | ||||
|             binding.imagesUploadedProgressbar.setProgress | ||||
|                     (100*uploadCount/levelInfo.getMaxUploadCount()); | ||||
|                 (100*uploadCount/levelInfo.getMaxUploadCount()); | ||||
|             binding.tvUploadedImages.setText | ||||
|                 (uploadCount + "/" + levelInfo.getMaxUploadCount()); | ||||
|         } | ||||
|  | @ -317,8 +327,8 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment { | |||
| 
 | ||||
|     private void setZeroAchievements() { | ||||
|         String message = !Objects.equals(sessionManager.getUserName(), userName) ? | ||||
|                 getString(R.string.no_achievements_yet, userName) : | ||||
|                 getString(R.string.you_have_no_achievements_yet); | ||||
|             getString(R.string.no_achievements_yet, userName) : | ||||
|             getString(R.string.you_have_no_achievements_yet); | ||||
|         DialogUtil.showAlertDialog(getActivity(), | ||||
|             null, | ||||
|             message, | ||||
|  | @ -356,7 +366,7 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment { | |||
| //        binding.imagesUsedByWikiProgressBar.setVisibility(View.VISIBLE); | ||||
|         binding.thanksReceived.setText(String.valueOf(achievements.getThanksReceived())); | ||||
|         binding.imagesUsedByWikiProgressBar.setProgress | ||||
|                 (100 * achievements.getUniqueUsedImages() / levelInfo.getMaxUniqueImages()); | ||||
|             (100 * achievements.getUniqueUsedImages() / levelInfo.getMaxUniqueImages()); | ||||
|         binding.tvWikiPb.setText(achievements.getUniqueUsedImages() + "/" | ||||
|             + levelInfo.getMaxUniqueImages()); | ||||
|         binding.imageFeatured.setText(String.valueOf(achievements.getFeaturedImages())); | ||||
|  | @ -365,7 +375,7 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment { | |||
|         levelUpInfoString += " " + levelInfo.getLevelNumber(); | ||||
|         binding.achievementLevel.setText(levelUpInfoString); | ||||
|         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())); | ||||
|         BasicKvStore store = new BasicKvStore(this.getContext(), userName); | ||||
|         store.putString("userAchievementsLevel", Integer.toString(levelInfo.getLevelNumber())); | ||||
|  | @ -377,8 +387,8 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment { | |||
|     private void hideProgressBar(Achievements achievements) { | ||||
|         if (binding.progressBar != null) { | ||||
|             levelInfo = LevelController.LevelInfo.from(achievements.getImagesUploaded(), | ||||
|                     achievements.getUniqueUsedImages(), | ||||
|                     achievements.getNotRevertPercentage()); | ||||
|                 achievements.getUniqueUsedImages(), | ||||
|                 achievements.getNotRevertPercentage()); | ||||
|             inflateAchievements(achievements); | ||||
|             setUploadProgress(achievements.getImagesUploaded()); | ||||
|             setImageRevertPercentage(achievements.getNotRevertPercentage()); | ||||
|  | @ -478,4 +488,4 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment { | |||
|         } | ||||
|         return true; | ||||
|     } | ||||
| } | ||||
| } | ||||
|  | @ -6,7 +6,7 @@ import com.google.gson.annotations.SerializedName | |||
|  * Represents Featured Images on WikiMedia Commons platform | ||||
|  * Used by Achievements and FeedbackResponse (objects) of the user | ||||
|  */ | ||||
| class FeaturedImages( | ||||
| data class FeaturedImages( | ||||
|     @field:SerializedName("Quality_images") val qualityImages: Int, | ||||
|     @field:SerializedName("Featured_pictures_on_Wikimedia_Commons") val featuredPicturesOnWikimediaCommons: Int, | ||||
| ) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 u7479759
						u7479759