mirror of
				https://github.com/commons-app/apps-android-commons.git
				synced 2025-10-31 14:53:59 +01:00 
			
		
		
		
	Convert LeaderboardListAdapter to kotlin
This commit is contained in:
		
							parent
							
								
									41e7da5a34
								
							
						
					
					
						commit
						351942ecd9
					
				
					 5 changed files with 134 additions and 241 deletions
				
			
		|  | @ -1,45 +1,43 @@ | ||||||
| package fr.free.nrw.commons.profile.leaderboard; | package fr.free.nrw.commons.profile.leaderboard | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * This class contains the constant variables for leaderboard |  * This class contains the constant variables for leaderboard | ||||||
|  */ |  */ | ||||||
| public class LeaderboardConstants { | object LeaderboardConstants { | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * This is the size of the page i.e. number items to load in a batch when pagination is performed |      * This is the size of the page i.e. number items to load in a batch when pagination is performed | ||||||
|      */ |      */ | ||||||
|     public static final int PAGE_SIZE = 100; |     const val PAGE_SIZE: Int = 100 | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * This is the starting offset, we set it to 0 to start loading from rank 1 |      * This is the starting offset, we set it to 0 to start loading from rank 1 | ||||||
|      */ |      */ | ||||||
|     public static final int START_OFFSET = 0; |     const val START_OFFSET: Int = 0 | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * This is the prefix of the user's homepage url, appending the username will give us complete url |      * This is the prefix of the user's homepage url, appending the username will give us complete url | ||||||
|      */ |      */ | ||||||
|     public static final String USER_LINK_PREFIX = "https://commons.wikimedia.org/wiki/User:"; |     const val USER_LINK_PREFIX: String = "https://commons.wikimedia.org/wiki/User:" | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * This is the a constant string for the state loading, when the pages are getting loaded we can |      * This is the a constant string for the state loading, when the pages are getting loaded we can | ||||||
|      * use this constant to identify if we need to show the progress bar or not |      * use this constant to identify if we need to show the progress bar or not | ||||||
|      */ |      */ | ||||||
|     public final static String LOADING = "Loading"; |     const val LOADING: String = "Loading" | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * This is the a constant string for the state loaded, when the pages are loaded we can |      * This is the a constant string for the state loaded, when the pages are loaded we can | ||||||
|      * use this constant to identify if we need to show the progress bar or not |      * use this constant to identify if we need to show the progress bar or not | ||||||
|      */ |      */ | ||||||
|     public final static String LOADED = "Loaded"; |     const val LOADED: String = "Loaded" | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * This API endpoint is to update the leaderboard avatar |      * This API endpoint is to update the leaderboard avatar | ||||||
|      */ |      */ | ||||||
|     public final static String UPDATE_AVATAR_END_POINT = "/update_avatar.py"; |     const val UPDATE_AVATAR_END_POINT: String = "/update_avatar.py" | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * This API endpoint is to get leaderboard data |      * This API endpoint is to get leaderboard data | ||||||
|      */ |      */ | ||||||
|     public final static String LEADERBOARD_END_POINT = "/leaderboard.py"; |     const val LEADERBOARD_END_POINT: String = "/leaderboard.py" | ||||||
| 
 |  | ||||||
| } | } | ||||||
|  | @ -1,137 +0,0 @@ | ||||||
| package fr.free.nrw.commons.profile.leaderboard; |  | ||||||
| 
 |  | ||||||
| import androidx.annotation.NonNull; |  | ||||||
| import androidx.recyclerview.widget.DiffUtil; |  | ||||||
| import androidx.recyclerview.widget.DiffUtil.ItemCallback; |  | ||||||
| import com.google.gson.annotations.Expose; |  | ||||||
| import com.google.gson.annotations.SerializedName; |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * This class represents the leaderboard API response sub part of i.e. leaderboard list |  | ||||||
|  * The leaderboard list will contain the ranking of the users from 1 to n, |  | ||||||
|  * avatars, username and count in the selected category. |  | ||||||
|  */ |  | ||||||
| public class LeaderboardList { |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * Username of the user |  | ||||||
|      * Example value - Syced |  | ||||||
|      */ |  | ||||||
|     @SerializedName("username") |  | ||||||
|     @Expose |  | ||||||
|     private String username; |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * Count in the category |  | ||||||
|      * Example value - 10 |  | ||||||
|      */ |  | ||||||
|     @SerializedName("category_count") |  | ||||||
|     @Expose |  | ||||||
|     private Integer categoryCount; |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * URL of the avatar of user |  | ||||||
|      * Example value = https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Gnome-stock_person.svg/200px-Gnome-stock_person.svg.png |  | ||||||
|      */ |  | ||||||
|     @SerializedName("avatar") |  | ||||||
|     @Expose |  | ||||||
|     private String avatar; |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * Rank of the user |  | ||||||
|      * Example value - 1 |  | ||||||
|      */ |  | ||||||
|     @SerializedName("rank") |  | ||||||
|     @Expose |  | ||||||
|     private Integer rank; |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * @return the username of the user in the leaderboard list |  | ||||||
|      */ |  | ||||||
|     public String getUsername() { |  | ||||||
|         return username; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * Sets the username of the user in the leaderboard list |  | ||||||
|      */ |  | ||||||
|     public void setUsername(String username) { |  | ||||||
|         this.username = username; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * @return the category count of the user in the leaderboard list |  | ||||||
|      */ |  | ||||||
|     public Integer getCategoryCount() { |  | ||||||
|         return categoryCount; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * Sets the category count of the user in the leaderboard list |  | ||||||
|      */ |  | ||||||
|     public void setCategoryCount(Integer categoryCount) { |  | ||||||
|         this.categoryCount = categoryCount; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * @return the avatar of the user in the leaderboard list |  | ||||||
|      */ |  | ||||||
|     public String getAvatar() { |  | ||||||
|         return avatar; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * Sets the avatar of the user in the leaderboard list |  | ||||||
|      */ |  | ||||||
|     public void setAvatar(String avatar) { |  | ||||||
|         this.avatar = avatar; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * @return the rank of the user in the leaderboard list |  | ||||||
|      */ |  | ||||||
|     public Integer getRank() { |  | ||||||
|         return rank; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * Sets the rank of the user in the leaderboard list |  | ||||||
|      */ |  | ||||||
|     public void setRank(Integer rank) { |  | ||||||
|         this.rank = rank; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * This method checks for the diff in the callbacks for paged lists |  | ||||||
|      */ |  | ||||||
|     public static DiffUtil.ItemCallback<LeaderboardList> DIFF_CALLBACK = |  | ||||||
|         new ItemCallback<LeaderboardList>() { |  | ||||||
|             @Override |  | ||||||
|             public boolean areItemsTheSame(@NonNull LeaderboardList oldItem, |  | ||||||
|                 @NonNull LeaderboardList newItem) { |  | ||||||
|                 return newItem == oldItem; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             @Override |  | ||||||
|             public boolean areContentsTheSame(@NonNull LeaderboardList oldItem, |  | ||||||
|                 @NonNull LeaderboardList newItem) { |  | ||||||
|                 return newItem.getRank().equals(oldItem.getRank()); |  | ||||||
|             } |  | ||||||
|         }; |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * Returns true if two objects are equal, false otherwise |  | ||||||
|      * @param obj |  | ||||||
|      * @return |  | ||||||
|      */ |  | ||||||
|     @Override |  | ||||||
|     public boolean equals(Object obj) { |  | ||||||
|         if (obj == this) { |  | ||||||
|             return true; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         LeaderboardList leaderboardList = (LeaderboardList) obj; |  | ||||||
|         return leaderboardList.getRank().equals(this.getRank()); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -0,0 +1,61 @@ | ||||||
|  | package fr.free.nrw.commons.profile.leaderboard | ||||||
|  | 
 | ||||||
|  | import androidx.recyclerview.widget.DiffUtil | ||||||
|  | import com.google.gson.annotations.SerializedName | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * This class represents the leaderboard API response sub part of i.e. leaderboard list | ||||||
|  |  * The leaderboard list will contain the ranking of the users from 1 to n, | ||||||
|  |  * avatars, username and count in the selected category. | ||||||
|  |  */ | ||||||
|  | data class LeaderboardList ( | ||||||
|  |     @SerializedName("username") | ||||||
|  |     var username: String? = null, | ||||||
|  |     @SerializedName("category_count") | ||||||
|  |     var categoryCount: Int? = null, | ||||||
|  |     @SerializedName("avatar") | ||||||
|  |     var avatar: String? = null, | ||||||
|  |     @SerializedName("rank") | ||||||
|  |     var rank: Int? = null | ||||||
|  | ) { | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Returns true if two objects are equal, false otherwise | ||||||
|  |      * @param other | ||||||
|  |      * @return | ||||||
|  |      */ | ||||||
|  |     override fun equals(other: Any?): Boolean { | ||||||
|  |         if (other === this) { | ||||||
|  |             return true | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         val leaderboardList = other as LeaderboardList | ||||||
|  |         return leaderboardList.rank == rank | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     override fun hashCode(): Int { | ||||||
|  |         var result = username?.hashCode() ?: 0 | ||||||
|  |         result = 31 * result + (categoryCount ?: 0) | ||||||
|  |         result = 31 * result + (avatar?.hashCode() ?: 0) | ||||||
|  |         result = 31 * result + (rank ?: 0) | ||||||
|  |         return result | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     companion object { | ||||||
|  |         /** | ||||||
|  |          * This method checks for the diff in the callbacks for paged lists | ||||||
|  |          */ | ||||||
|  |         var DIFF_CALLBACK: DiffUtil.ItemCallback<LeaderboardList> = | ||||||
|  |             object : DiffUtil.ItemCallback<LeaderboardList>() { | ||||||
|  |                 override fun areItemsTheSame( | ||||||
|  |                     oldItem: LeaderboardList, | ||||||
|  |                     newItem: LeaderboardList | ||||||
|  |                 ): Boolean = newItem === oldItem | ||||||
|  | 
 | ||||||
|  |                 override fun areContentsTheSame( | ||||||
|  |                     oldItem: LeaderboardList, | ||||||
|  |                     newItem: LeaderboardList | ||||||
|  |                 ): Boolean = newItem.rank == oldItem.rank | ||||||
|  |             } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -1,93 +0,0 @@ | ||||||
| package fr.free.nrw.commons.profile.leaderboard; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| import android.app.Activity; |  | ||||||
| import android.content.Context; |  | ||||||
| import android.net.Uri; |  | ||||||
| import android.view.LayoutInflater; |  | ||||||
| import android.view.View; |  | ||||||
| import android.view.ViewGroup; |  | ||||||
| import android.widget.TextView; |  | ||||||
| import androidx.annotation.NonNull; |  | ||||||
| import androidx.paging.PagedListAdapter; |  | ||||||
| import androidx.recyclerview.widget.RecyclerView; |  | ||||||
| import com.facebook.drawee.view.SimpleDraweeView; |  | ||||||
| import fr.free.nrw.commons.R; |  | ||||||
| import fr.free.nrw.commons.profile.ProfileActivity; |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * This class extends RecyclerView.Adapter and creates the List section of the leaderboard |  | ||||||
|  */ |  | ||||||
| public class LeaderboardListAdapter extends PagedListAdapter<LeaderboardList, LeaderboardListAdapter.ListViewHolder> { |  | ||||||
| 
 |  | ||||||
|     public LeaderboardListAdapter() { |  | ||||||
|         super(LeaderboardList.DIFF_CALLBACK); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public class ListViewHolder extends RecyclerView.ViewHolder { |  | ||||||
|         TextView rank; |  | ||||||
|         SimpleDraweeView avatar; |  | ||||||
|         TextView username; |  | ||||||
|         TextView count; |  | ||||||
| 
 |  | ||||||
|         public ListViewHolder(View itemView) { |  | ||||||
|             super(itemView); |  | ||||||
|             this.rank = itemView.findViewById(R.id.user_rank); |  | ||||||
|             this.avatar = itemView.findViewById(R.id.user_avatar); |  | ||||||
|             this.username = itemView.findViewById(R.id.user_name); |  | ||||||
|             this.count = itemView.findViewById(R.id.user_count); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         /** |  | ||||||
|          * This method will return the Context |  | ||||||
|          * @return Context |  | ||||||
|          */ |  | ||||||
|         public Context getContext() { |  | ||||||
|             return itemView.getContext(); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * Overrides the onCreateViewHolder and inflates the recyclerview list item layout |  | ||||||
|      * @param parent |  | ||||||
|      * @param viewType |  | ||||||
|      * @return |  | ||||||
|      */ |  | ||||||
|     @NonNull |  | ||||||
|     @Override |  | ||||||
|     public LeaderboardListAdapter.ListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { |  | ||||||
|         View view = LayoutInflater.from(parent.getContext()) |  | ||||||
|             .inflate(R.layout.leaderboard_list_element, parent, false); |  | ||||||
| 
 |  | ||||||
|         return new ListViewHolder(view); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * Overrides the onBindViewHolder Set the view at the specific position with the specific value |  | ||||||
|      * @param holder |  | ||||||
|      * @param position |  | ||||||
|      */ |  | ||||||
|     @Override |  | ||||||
|     public void onBindViewHolder(@NonNull LeaderboardListAdapter.ListViewHolder holder, int position) { |  | ||||||
|         TextView rank = holder.rank; |  | ||||||
|         SimpleDraweeView avatar = holder.avatar; |  | ||||||
|         TextView username = holder.username; |  | ||||||
|         TextView count = holder.count; |  | ||||||
| 
 |  | ||||||
|         rank.setText(getItem(position).getRank().toString()); |  | ||||||
| 
 |  | ||||||
|         avatar.setImageURI(Uri.parse(getItem(position).getAvatar())); |  | ||||||
|         username.setText(getItem(position).getUsername()); |  | ||||||
|         count.setText(getItem(position).getCategoryCount().toString()); |  | ||||||
| 
 |  | ||||||
|         /* |  | ||||||
|           Now that we have our in app profile-section, lets take the user there |  | ||||||
|          */ |  | ||||||
|         holder.itemView.setOnClickListener(view -> { |  | ||||||
|             if (view.getContext() instanceof ProfileActivity) { |  | ||||||
|                 ((Activity) (view.getContext())).finish(); |  | ||||||
|             } |  | ||||||
|             ProfileActivity.startYourself(view.getContext(), getItem(position).getUsername(), true); |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -0,0 +1,64 @@ | ||||||
|  | package fr.free.nrw.commons.profile.leaderboard | ||||||
|  | 
 | ||||||
|  | import android.app.Activity | ||||||
|  | import android.net.Uri | ||||||
|  | import android.view.LayoutInflater | ||||||
|  | import android.view.View | ||||||
|  | import android.view.ViewGroup | ||||||
|  | import android.widget.TextView | ||||||
|  | import androidx.paging.PagedListAdapter | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
|  | import com.facebook.drawee.view.SimpleDraweeView | ||||||
|  | import fr.free.nrw.commons.R | ||||||
|  | import fr.free.nrw.commons.profile.ProfileActivity | ||||||
|  | import fr.free.nrw.commons.profile.leaderboard.LeaderboardList.Companion.DIFF_CALLBACK | ||||||
|  | import fr.free.nrw.commons.profile.leaderboard.LeaderboardListAdapter.ListViewHolder | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * This class extends RecyclerView.Adapter and creates the List section of the leaderboard | ||||||
|  |  */ | ||||||
|  | class LeaderboardListAdapter : PagedListAdapter<LeaderboardList, ListViewHolder>(DIFF_CALLBACK) { | ||||||
|  |     inner class ListViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { | ||||||
|  |         var rank: TextView = itemView.findViewById(R.id.user_rank) | ||||||
|  |         var avatar: SimpleDraweeView = itemView.findViewById(R.id.user_avatar) | ||||||
|  |         var username: TextView = itemView.findViewById(R.id.user_name) | ||||||
|  |         var count: TextView = itemView.findViewById(R.id.user_count) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Overrides the onCreateViewHolder and inflates the recyclerview list item layout | ||||||
|  |      * @param parent | ||||||
|  |      * @param viewType | ||||||
|  |      * @return | ||||||
|  |      */ | ||||||
|  |     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListViewHolder = | ||||||
|  |         ListViewHolder( | ||||||
|  |             LayoutInflater.from(parent.context) | ||||||
|  |                 .inflate(R.layout.leaderboard_list_element, parent, false) | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Overrides the onBindViewHolder Set the view at the specific position with the specific value | ||||||
|  |      * @param holder | ||||||
|  |      * @param position | ||||||
|  |      */ | ||||||
|  |     override fun onBindViewHolder(holder: ListViewHolder, position: Int) = with (holder) { | ||||||
|  |         val item = getItem(position)!! | ||||||
|  | 
 | ||||||
|  |         rank.text = item.rank.toString() | ||||||
|  |         avatar.setImageURI(Uri.parse(item.avatar)) | ||||||
|  |         username.text = item.username | ||||||
|  |         count.text = item.categoryCount.toString() | ||||||
|  | 
 | ||||||
|  |         /* | ||||||
|  |           Now that we have our in app profile-section, lets take the user there | ||||||
|  |          */ | ||||||
|  |         itemView.setOnClickListener { view: View -> | ||||||
|  |             if (view.context is ProfileActivity) { | ||||||
|  |                 ((view.context) as Activity).finish() | ||||||
|  |             } | ||||||
|  |             ProfileActivity.startYourself(view.context, item.username, true) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Paul Hawke
						Paul Hawke