mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-11-01 07:13:56 +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