diff --git a/app/src/main/java/org/thoughtcrime/securesms/RecipientPreferenceActivity.java b/app/src/main/java/org/thoughtcrime/securesms/RecipientPreferenceActivity.java index 76b962bea4..46df63e9e5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/RecipientPreferenceActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/RecipientPreferenceActivity.java @@ -22,6 +22,7 @@ import android.view.ViewGroup; import android.view.WindowManager; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -77,8 +78,10 @@ import org.thoughtcrime.securesms.util.DynamicDarkToolbarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.IdentityUtil; +import org.thoughtcrime.securesms.util.ServiceUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.ThemeUtil; +import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; import org.thoughtcrime.securesms.util.concurrent.SimpleTask; @@ -728,6 +731,15 @@ public class RecipientPreferenceActivity extends PassphraseRequiredActionBarActi public void onInSecureCallClicked() { CommunicationActions.startInsecureCall(requireActivity(), recipient.get()); } + + @Override + public void onLongClick() { + if (recipient.get().hasE164()) { + Util.copyToClipboard(requireContext(), recipient.get().requireE164()); + ServiceUtil.getVibrator(requireContext()).vibrate(250); + Toast.makeText(requireContext(), R.string.RecipientBottomSheet_copied_to_clipboard, Toast.LENGTH_SHORT).show(); + } + } } private class CustomNotificationsChangedListener implements Preference.OnPreferenceChangeListener { diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ContactPreference.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ContactPreference.java index 5b1eda7140..5321d976f2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ContactPreference.java +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ContactPreference.java @@ -17,6 +17,7 @@ public class ContactPreference extends Preference { private ImageView callButton; private ImageView secureCallButton; private ImageView secureVideoButton; + private View itemView; private Listener listener; private boolean secure; @@ -50,6 +51,7 @@ public class ContactPreference extends Preference { public void onBindViewHolder(PreferenceViewHolder view) { super.onBindViewHolder(view); + this.itemView = view.itemView; this.messageButton = (ImageView) view.findViewById(R.id.message); this.callButton = (ImageView) view.findViewById(R.id.call); this.secureCallButton = (ImageView) view.findViewById(R.id.secure_call); @@ -88,13 +90,21 @@ public class ContactPreference extends Preference { if (this.secureCallButton != null) this.secureCallButton.setOnClickListener(v -> listener.onSecureCallClicked()); if (this.secureVideoButton != null) this.secureVideoButton.setOnClickListener(v -> listener.onSecureVideoClicked()); if (this.callButton != null) this.callButton.setOnClickListener(v -> listener.onInSecureCallClicked()); + + if (this.itemView != null) { + itemView.setOnLongClickListener(v -> { + listener.onLongClick(); + return true; + }); + } } public interface Listener { - public void onMessageClicked(); - public void onSecureCallClicked(); - public void onSecureVideoClicked(); - public void onInSecureCallClicked(); + void onMessageClicked(); + void onSecureCallClicked(); + void onSecureVideoClicked(); + void onInSecureCallClicked(); + void onLongClick(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java index 8aa8c15760..ecce8cb4a3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java @@ -8,6 +8,7 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -20,7 +21,9 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.AvatarImageView; import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.recipients.RecipientId; +import org.thoughtcrime.securesms.util.ServiceUtil; import org.thoughtcrime.securesms.util.ThemeUtil; +import org.thoughtcrime.securesms.util.Util; import java.util.Objects; @@ -110,6 +113,12 @@ public final class RecipientBottomSheetDialogFragment extends BottomSheetDialogF .trim(); usernameNumber.setText(usernameNumberString); usernameNumber.setVisibility(TextUtils.isEmpty(usernameNumberString) ? View.GONE : View.VISIBLE); + usernameNumber.setOnLongClickListener(v -> { + Util.copyToClipboard(v.getContext(), usernameNumber.getText().toString()); + ServiceUtil.getVibrator(v.getContext()).vibrate(250); + Toast.makeText(v.getContext(), R.string.RecipientBottomSheet_copied_to_clipboard, Toast.LENGTH_SHORT).show(); + return true; + }); boolean blocked = recipient.isBlocked(); blockButton.setVisibility(blocked ? View.GONE : View.VISIBLE); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6731114eed..aea0ed9d3e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2312,6 +2312,7 @@ Remove %1$s from "%2$s"? Remove + Copied to clipboard Admin