diff --git a/CHANGELOG.md b/CHANGELOG.md index 235683719..4ab593358 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ * add mute option "8 hours" * add menu option to easily save/unsave selected message * improve deletion confirmation for "Device Messages" +* always paste as plain text in message draft area ## v1.54.4 2025-03 diff --git a/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java b/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java index 9a62925b0..ad6db3ff2 100644 --- a/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java +++ b/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java @@ -1,13 +1,16 @@ package org.thoughtcrime.securesms.components; +import android.content.ClipData; +import android.content.ClipboardManager; import android.content.Context; import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.RequiresApi; import androidx.appcompat.widget.AppCompatEditText; +import androidx.core.view.ContentInfoCompat; +import androidx.core.view.ViewCompat; import androidx.core.view.inputmethod.EditorInfoCompat; import androidx.core.view.inputmethod.InputConnectionCompat; import androidx.core.view.inputmethod.InputContentInfoCompat; @@ -50,6 +53,28 @@ public class ComposeText extends AppCompatEditText { initialize(); } + @Override + public boolean onTextContextMenuItem(int id) { + if (id == android.R.id.paste) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + id = android.R.id.pasteAsPlainText; + } else if (ViewCompat.getOnReceiveContentMimeTypes(this) != null) { + // older device, manually paste as plain text + ClipboardManager cm = (ClipboardManager) getContext().getSystemService( + Context.CLIPBOARD_SERVICE); + ClipData clip = (cm == null) ? null : cm.getPrimaryClip(); + if (clip != null && clip.getItemCount() > 0) { + ContentInfoCompat payload = new ContentInfoCompat.Builder(clip, ContentInfoCompat.SOURCE_CLIPBOARD) + .setFlags(ContentInfoCompat.FLAG_CONVERT_TO_PLAIN_TEXT) + .build(); + ViewCompat.performReceiveContent(this, payload); + } + return true; + } + } + return super.onTextContextMenuItem(id); + } + public String getTextTrimmed(){ return getText().toString().trim(); }