From 328dbaa01c9c0d57a5d2715f8f1c91e76e4e932b Mon Sep 17 00:00:00 2001 From: M M Arif Date: Fri, 5 Mar 2021 06:24:48 +0100 Subject: [PATCH] Copy user id to clipboard (#840) Co-Authored-By: M M Arif Co-Committed-By: M M Arif --- .../gitnex/adapters/AdminGetUsersAdapter.java | 38 +++++++++++++----- .../gitnex/adapters/CollaboratorsAdapter.java | 27 ++++++++++--- .../gitnex/adapters/IssueCommentsAdapter.java | 10 +++++ .../mian/gitnex/adapters/IssuesAdapter.java | 26 +++++++----- .../gitnex/adapters/MembersByOrgAdapter.java | 40 ++++++++++++++----- .../adapters/ProfileFollowersAdapter.java | 26 +++++++++--- .../adapters/ProfileFollowingAdapter.java | 26 +++++++++--- .../gitnex/adapters/PullRequestsAdapter.java | 24 +++++------ .../gitnex/adapters/SearchIssuesAdapter.java | 35 +++++++++------- .../adapters/TeamMembersByOrgAdapter.java | 27 +++++++++---- .../gitnex/fragments/ProfileFragment.java | 6 +++ .../java/org/mian/gitnex/helpers/AppUtil.java | 13 ++++++ app/src/main/res/values/strings.xml | 1 + 13 files changed, 216 insertions(+), 83 deletions(-) diff --git a/app/src/main/java/org/mian/gitnex/adapters/AdminGetUsersAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/AdminGetUsersAdapter.java index c065f021..4f7766d8 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/AdminGetUsersAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/AdminGetUsersAdapter.java @@ -16,6 +16,7 @@ import com.amulyakhare.textdrawable.TextDrawable; import org.gitnex.tea4j.models.UserInfo; import org.mian.gitnex.R; import org.mian.gitnex.clients.PicassoService; +import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.RoundedTransformation; import java.util.ArrayList; import java.util.List; @@ -26,19 +27,22 @@ import java.util.List; public class AdminGetUsersAdapter extends RecyclerView.Adapter implements Filterable { - private List usersList; - private Context mCtx; - private List usersListFull; + private final List usersList; + private final Context mCtx; + private final List usersListFull; static class UsersViewHolder extends RecyclerView.ViewHolder { - private ImageView userAvatar; - private TextView userFullName; - private TextView userEmail; - private ImageView userRole; - private TextView userName; + private String userLoginId; + + private final ImageView userAvatar; + private final TextView userFullName; + private final TextView userEmail; + private final ImageView userRole; + private final TextView userName; private UsersViewHolder(View itemView) { + super(itemView); userAvatar = itemView.findViewById(R.id.userAvatar); @@ -47,10 +51,17 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter { + + Context context = loginId.getContext(); + + AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); + }); } } public AdminGetUsersAdapter(Context mCtx, List usersListMain) { + this.mCtx = mCtx; this.usersList = usersListMain; usersListFull = new ArrayList<>(usersList); @@ -59,6 +70,7 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter filteredList = new ArrayList<>(); if (constraint == null || constraint.length() == 0) { filteredList.addAll(usersListFull); - } else { + } + else { String filterPattern = constraint.toString().toLowerCase().trim(); for (UserInfo item : usersListFull) { @@ -142,6 +159,7 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter collaboratorsList; - private Context mCtx; + private final List collaboratorsList; + private final Context mCtx; - private class ViewHolder { + private static class ViewHolder { - private ImageView collaboratorAvatar; - private TextView collaboratorName; + private String userLoginId; + + private final ImageView collaboratorAvatar; + private final TextView collaboratorName; ViewHolder(View v) { + collaboratorAvatar = v.findViewById(R.id.collaboratorAvatar); collaboratorName = v.findViewById(R.id.collaboratorName); + + collaboratorAvatar.setOnClickListener(loginId -> { + + Context context = loginId.getContext(); + + AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); + }); } } public CollaboratorsAdapter(Context mCtx, List collaboratorsListMain) { + this.mCtx = mCtx; this.collaboratorsList = collaboratorsListMain; } @@ -62,17 +74,18 @@ public class CollaboratorsAdapter extends BaseAdapter { ViewHolder viewHolder = null; if (finalView == null) { + finalView = LayoutInflater.from(mCtx).inflate(R.layout.list_collaborators, null); viewHolder = new ViewHolder(finalView); finalView.setTag(viewHolder); } else { + viewHolder = (ViewHolder) finalView.getTag(); } initData(viewHolder, position); return finalView; - } private void initData(ViewHolder viewHolder, int position) { @@ -80,6 +93,8 @@ public class CollaboratorsAdapter extends BaseAdapter { Collaborators currentItem = collaboratorsList.get(position); PicassoService.getInstance(mCtx).get().load(currentItem.getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(180, 180).centerCrop().into(viewHolder.collaboratorAvatar); + viewHolder.userLoginId = currentItem.getLogin(); + if(!currentItem.getFull_name().equals("")) { viewHolder.collaboratorName.setText(Html.fromHtml(currentItem.getFull_name())); diff --git a/app/src/main/java/org/mian/gitnex/adapters/IssueCommentsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/IssueCommentsAdapter.java index e8213c3d..51c8aabe 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/IssueCommentsAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/IssueCommentsAdapter.java @@ -65,6 +65,7 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter { + + Context context = loginId.getContext(); + + AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); + }); + } } @@ -311,6 +319,8 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter class IssuesHolder extends RecyclerView.ViewHolder { + private String userLoginId; + private final TextView issueNumber; private final ImageView issueAssigneeAvatar; private final TextView issueTitle; @@ -118,9 +121,9 @@ public class IssuesAdapter extends RecyclerView.Adapter LinearLayout frameCommentsCount = itemView.findViewById(R.id.frameCommentsCount); issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime); - issueTitle.setOnClickListener(v -> { + issueTitle.setOnClickListener(title -> { - Context context = v.getContext(); + Context context = title.getContext(); Intent intent = new Intent(context, IssueDetailActivity.class); intent.putExtra("issueNumber", issueNumber.getText()); @@ -131,9 +134,10 @@ public class IssuesAdapter extends RecyclerView.Adapter context.startActivity(intent); }); - frameCommentsCount.setOnClickListener(v -> { - Context context = v.getContext(); + frameCommentsCount.setOnClickListener(commentsCount -> { + + Context context = commentsCount.getContext(); Intent intent = new Intent(context, IssueDetailActivity.class); intent.putExtra("issueNumber", issueNumber.getText()); @@ -145,6 +149,13 @@ public class IssuesAdapter extends RecyclerView.Adapter }); + issueAssigneeAvatar.setOnClickListener(loginId -> { + + Context context = loginId.getContext(); + + AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); + }); + } @SuppressLint("SetTextI18n") @@ -154,12 +165,7 @@ public class IssuesAdapter extends RecyclerView.Adapter final String locale = tinyDb.getString("locale"); final String timeFormat = tinyDb.getString("dateFormat"); - if(!issuesModel.getUser().getFull_name().equals("")) { - issueAssigneeAvatar.setOnClickListener(new ClickListener(context.getResources().getString(R.string.issueCreator) + issuesModel.getUser().getFull_name(), context)); - } - else { - issueAssigneeAvatar.setOnClickListener(new ClickListener(context.getResources().getString(R.string.issueCreator) + issuesModel.getUser().getLogin(), context)); - } + userLoginId = issuesModel.getUser().getLogin(); PicassoService.getInstance(context).get().load(issuesModel.getUser().getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(issueAssigneeAvatar); diff --git a/app/src/main/java/org/mian/gitnex/adapters/MembersByOrgAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/MembersByOrgAdapter.java index f62b4917..e1636e8e 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/MembersByOrgAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/MembersByOrgAdapter.java @@ -14,6 +14,7 @@ import android.widget.TextView; import org.gitnex.tea4j.models.UserInfo; import org.mian.gitnex.R; import org.mian.gitnex.clients.PicassoService; +import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.RoundedTransformation; import java.util.ArrayList; import java.util.List; @@ -24,26 +25,36 @@ import java.util.List; public class MembersByOrgAdapter extends BaseAdapter implements Filterable { - private List membersList; - private Context mCtx; - private List membersListFull; + private final List membersList; + private final Context mCtx; + private final List membersListFull; - private class ViewHolder { + private static class ViewHolder { - private ImageView memberAvatar; - private TextView memberName; + private String userLoginId; + + private final ImageView memberAvatar; + private final TextView memberName; ViewHolder(View v) { + memberAvatar = v.findViewById(R.id.memberAvatar); memberName = v.findViewById(R.id.memberName); + + memberAvatar.setOnClickListener(loginId -> { + + Context context = loginId.getContext(); + + AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); + }); } } public MembersByOrgAdapter(Context mCtx, List membersListMain) { + this.mCtx = mCtx; this.membersList = membersListMain; membersListFull = new ArrayList<>(membersList); - } @Override @@ -68,17 +79,18 @@ public class MembersByOrgAdapter extends BaseAdapter implements Filterable { MembersByOrgAdapter.ViewHolder viewHolder = null; if (finalView == null) { + finalView = LayoutInflater.from(mCtx).inflate(R.layout.list_members_by_org, null); - viewHolder = new MembersByOrgAdapter.ViewHolder(finalView); + viewHolder = new ViewHolder(finalView); finalView.setTag(viewHolder); } else { + viewHolder = (MembersByOrgAdapter.ViewHolder) finalView.getTag(); } initData(viewHolder, position); return finalView; - } private void initData(MembersByOrgAdapter.ViewHolder viewHolder, int position) { @@ -86,6 +98,8 @@ public class MembersByOrgAdapter extends BaseAdapter implements Filterable { UserInfo currentItem = membersList.get(position); PicassoService.getInstance(mCtx).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(viewHolder.memberAvatar); + viewHolder.userLoginId = currentItem.getLogin(); + if(!currentItem.getFullname().equals("")) { viewHolder.memberName.setText(Html.fromHtml(currentItem.getFullname())); @@ -102,14 +116,17 @@ public class MembersByOrgAdapter extends BaseAdapter implements Filterable { return membersFilter; } - private Filter membersFilter = new Filter() { + private final Filter membersFilter = new Filter() { @Override protected FilterResults performFiltering(CharSequence constraint) { List filteredList = new ArrayList<>(); if (constraint == null || constraint.length() == 0) { + filteredList.addAll(membersListFull); - } else { + } + else { + String filterPattern = constraint.toString().toLowerCase().trim(); for (UserInfo item : membersListFull) { @@ -127,6 +144,7 @@ public class MembersByOrgAdapter extends BaseAdapter implements Filterable { @Override protected void publishResults(CharSequence constraint, FilterResults results) { + membersList.clear(); membersList.addAll((List) results.values); notifyDataSetChanged(); diff --git a/app/src/main/java/org/mian/gitnex/adapters/ProfileFollowersAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/ProfileFollowersAdapter.java index 24f27227..55779d15 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/ProfileFollowersAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/ProfileFollowersAdapter.java @@ -12,6 +12,7 @@ import androidx.recyclerview.widget.RecyclerView; import org.gitnex.tea4j.models.UserInfo; import org.mian.gitnex.R; import org.mian.gitnex.clients.PicassoService; +import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.RoundedTransformation; import java.util.List; @@ -21,26 +22,36 @@ import java.util.List; public class ProfileFollowersAdapter extends RecyclerView.Adapter { - private List followersList; - private Context mCtx; + private final List followersList; + private final Context mCtx; static class FollowersViewHolder extends RecyclerView.ViewHolder { - private ImageView userAvatar; - private TextView userFullName; - private TextView userName; + private String userLoginId; + + private final ImageView userAvatar; + private final TextView userFullName; + private final TextView userName; private FollowersViewHolder(View itemView) { + super(itemView); userAvatar = itemView.findViewById(R.id.userAvatar); userFullName = itemView.findViewById(R.id.userFullName); userName = itemView.findViewById(R.id.userName); + userAvatar.setOnClickListener(loginId -> { + + Context context = loginId.getContext(); + + AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); + }); } } public ProfileFollowersAdapter(Context mCtx, List followersListMain) { + this.mCtx = mCtx; this.followersList = followersListMain; } @@ -48,8 +59,9 @@ public class ProfileFollowersAdapter extends RecyclerView.Adapter { - private List followingList; - private Context mCtx; + private final List followingList; + private final Context mCtx; static class FollowingViewHolder extends RecyclerView.ViewHolder { - private ImageView userAvatar; - private TextView userFullName; - private TextView userName; + private String userLoginId; + + private final ImageView userAvatar; + private final TextView userFullName; + private final TextView userName; private FollowingViewHolder(View itemView) { + super(itemView); userAvatar = itemView.findViewById(R.id.userAvatar); userFullName = itemView.findViewById(R.id.userFullName); userName = itemView.findViewById(R.id.userName); + userAvatar.setOnClickListener(loginId -> { + + Context context = loginId.getContext(); + + AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); + }); } } public ProfileFollowingAdapter(Context mCtx, List followingListMain) { + this.mCtx = mCtx; this.followingList = followingListMain; } @@ -48,8 +59,9 @@ public class ProfileFollowingAdapter extends RecyclerView.Adapter { Context context = v.getContext(); @@ -159,7 +163,13 @@ public class PullRequestsAdapter extends RecyclerView.Adapter { + + Context context = loginId.getContext(); + + AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); }); } @@ -171,19 +181,9 @@ public class PullRequestsAdapter extends RecyclerView.Adapter" + context.getResources().getString(R.string.hash) + prModel.getNumber() + ""; prTitle.setText(HtmlCompat.fromHtml(prNumber_ + " " + EmojiParser.parseToUnicode(prModel.getTitle()), HtmlCompat.FROM_HTML_MODE_LEGACY)); diff --git a/app/src/main/java/org/mian/gitnex/adapters/SearchIssuesAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/SearchIssuesAdapter.java index f0bf9f6e..a2df9de1 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/SearchIssuesAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/SearchIssuesAdapter.java @@ -17,6 +17,7 @@ import org.mian.gitnex.activities.IssueDetailActivity; import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.database.models.Repository; +import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.TimeHelper; @@ -33,9 +34,9 @@ import java.util.Locale; public class SearchIssuesAdapter extends RecyclerView.Adapter { - private List searchedList; - private Context mCtx; - private TinyDB tinyDb; + private final List searchedList; + private final Context mCtx; + private final TinyDB tinyDb; public SearchIssuesAdapter(List dataList, Context mCtx) { @@ -46,12 +47,14 @@ public class SearchIssuesAdapter extends RecyclerView.Adapter { + + Context context = loginId.getContext(); + + AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); + }); } } @@ -120,12 +130,7 @@ public class SearchIssuesAdapter extends RecyclerView.Adapter teamMembersList; - private Context mCtx; + private final List teamMembersList; + private final Context mCtx; private static class ViewHolder { - private ImageView memberAvatar; - private TextView memberName; + private String userLoginId; + + private final ImageView memberAvatar; + private final TextView memberName; ViewHolder(View v) { + memberAvatar = v.findViewById(R.id.memberAvatar); memberName = v.findViewById(R.id.memberName); + + memberAvatar.setOnClickListener(loginId -> { + + Context context = loginId.getContext(); + + AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); + }); } } public TeamMembersByOrgAdapter(Context mCtx, List membersListMain) { + this.mCtx = mCtx; this.teamMembersList = membersListMain; - } @Override @@ -65,17 +76,18 @@ public class TeamMembersByOrgAdapter extends BaseAdapter { TeamMembersByOrgAdapter.ViewHolder viewHolder = null; if (finalView == null) { + finalView = LayoutInflater.from(mCtx).inflate(R.layout.list_members_by_team_by_org, null); viewHolder = new ViewHolder(finalView); finalView.setTag(viewHolder); } else { + viewHolder = (TeamMembersByOrgAdapter.ViewHolder) finalView.getTag(); } initData(viewHolder, position); return finalView; - } private void initData(TeamMembersByOrgAdapter.ViewHolder viewHolder, int position) { @@ -83,6 +95,8 @@ public class TeamMembersByOrgAdapter extends BaseAdapter { UserInfo currentItem = teamMembersList.get(position); PicassoService.getInstance(mCtx).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(180, 180).centerCrop().into(viewHolder.memberAvatar); + viewHolder.userLoginId = currentItem.getLogin(); + final TinyDB tinyDb = TinyDB.getInstance(mCtx); Typeface myTypeface; @@ -112,6 +126,5 @@ public class TeamMembersByOrgAdapter extends BaseAdapter { } viewHolder.memberName.setTypeface(myTypeface); - } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/ProfileFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ProfileFragment.java index c61895b8..1282c19b 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ProfileFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ProfileFragment.java @@ -25,6 +25,7 @@ import com.squareup.picasso.Callback; import org.mian.gitnex.R; import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.clients.PicassoService; +import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.ColorInverter; import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.TinyDB; @@ -76,6 +77,11 @@ public class ProfileFragment extends Fragment { userLanguage.setText(R.string.notSupported); } + userAvatar.setOnClickListener(loginId -> { + + AppUtil.copyToClipboard(ctx, tinyDb.getString("userLogin"), ctx.getString(R.string.copyLoginIdToClipBoard, tinyDb.getString("userLogin"))); + }); + userFullName.setText(Html.fromHtml(tinyDb.getString("userFullname"))); userLogin.setText(getString(R.string.usernameWithAt, tinyDb.getString("userLogin"))); diff --git a/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java index d4ae2371..a5fee3fd 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java +++ b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java @@ -1,5 +1,7 @@ package org.mian.gitnex.helpers; +import android.content.ClipData; +import android.content.ClipboardManager; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; @@ -21,6 +23,7 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Objects; /** * Author M M Arif @@ -245,4 +248,14 @@ public class AppUtil { return (int) (context.getResources().getDisplayMetrics().scaledDensity * sp); } + public static void copyToClipboard(Context ctx, CharSequence data, String message) { + + ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(ctx).getSystemService(Context.CLIPBOARD_SERVICE); + assert clipboard != null; + + ClipData clip = ClipData.newPlainText(data, data); + clipboard.setPrimaryClip(clip); + + Toasty.info(ctx, message); + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cab8b6c5..c920d761 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -733,4 +733,5 @@ White on Grey Dark on White + Login ID \'%s\' copied to clipboard