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