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 | ||||
|  */ | ||||
| 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 | ||||
|      */ | ||||
|     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 | ||||
|      */ | ||||
|     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 | ||||
|      */ | ||||
|     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 | ||||
|      * 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 | ||||
|      * 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 | ||||
|      */ | ||||
|     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 | ||||
|      */ | ||||
|     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