diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java b/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java index d7d88e4293..5c781cadce 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java @@ -4,7 +4,6 @@ import android.content.Context; import android.content.res.Configuration; import android.graphics.Canvas; import android.os.Build; -import android.os.Bundle; import android.text.Annotation; import android.text.Editable; import android.text.Selection; @@ -26,9 +25,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.core.content.ContextCompat; -import androidx.core.view.inputmethod.EditorInfoCompat; -import androidx.core.view.inputmethod.InputConnectionCompat; -import androidx.core.view.inputmethod.InputContentInfoCompat; import org.signal.core.util.StringUtil; import org.signal.core.util.logging.Log; @@ -69,7 +65,6 @@ public class ComposeText extends EmojiEditText { private MentionValidatorWatcher mentionValidatorWatcher; private MessageSendType lastMessageSendType; - @Nullable private InputPanel.MediaListener mediaListener; @Nullable private CursorPositionChangedListener cursorPositionChangedListener; @Nullable private InlineQueryChangedListener inlineQueryChangedListener; @Nullable private StylingChangedListener stylingChangedListener; @@ -247,20 +242,7 @@ public class ComposeText extends EmojiEditText { editorInfo.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION; } - if (mediaListener == null) { - return inputConnection; - } - - if (inputConnection == null) { - return null; - } - - EditorInfoCompat.setContentMimeTypes(editorInfo, new String[] { "image/jpeg", "image/png", "image/gif", "image/webp", "image/heic", "image/heif", "image/avif" }); - return InputConnectionCompat.createWrapper(inputConnection, editorInfo, new CommitContentListener(mediaListener)); - } - - public void setMediaListener(@Nullable InputPanel.MediaListener mediaListener) { - this.mediaListener = mediaListener; + return inputConnection; } public boolean hasMentions() { @@ -577,38 +559,6 @@ public class ComposeText extends EmojiEditText { return true; } - private static class CommitContentListener implements InputConnectionCompat.OnCommitContentListener { - - private static final String TAG = Log.tag(CommitContentListener.class); - - private final InputPanel.MediaListener mediaListener; - - private CommitContentListener(@NonNull InputPanel.MediaListener mediaListener) { - this.mediaListener = mediaListener; - } - - @Override - public boolean onCommitContent(InputContentInfoCompat inputContentInfo, int flags, Bundle opts) { - if (Build.VERSION.SDK_INT >= 25 && (flags & InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0) { - try { - inputContentInfo.requestPermission(); - } catch (Exception e) { - Log.w(TAG, e); - return false; - } - } - - if (inputContentInfo.getDescription().getMimeTypeCount() > 0) { - mediaListener.onMediaSelected(inputContentInfo.getContentUri(), - inputContentInfo.getDescription().getMimeType(0)); - - return true; - } - - return false; - } - } - private static class QueryStart { public int index; public boolean isMentionQuery; diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java b/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java index 08df078bc3..d1bbb9fcb9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java @@ -5,7 +5,6 @@ import android.animation.ValueAnimator; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.hardware.Camera; -import android.net.Uri; import android.text.SpannableString; import android.text.format.DateUtils; import android.util.AttributeSet; @@ -208,10 +207,6 @@ public class InputPanel extends ConstraintLayout } } - public void setMediaListener(@NonNull MediaListener listener) { - composeText.setMediaListener(listener); - } - public void setQuote(@NonNull RequestManager requestManager, long id, @NonNull Recipient author, @@ -954,8 +949,4 @@ public class InputPanel extends ConstraintLayout }; } } - - public interface MediaListener { - void onMediaSelected(@NonNull Uri uri, String contentType); - } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index 0960bce452..34c31eedbb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -430,6 +430,16 @@ class ConversationFragment : private const val ATTACHMENT_KEYBOARD_FRAGMENT_CREATOR_ID = 1 private const val MEDIA_KEYBOARD_FRAGMENT_CREATOR_ID = 2 + + private val RECEIVE_CONTENT_MIME_TYPES = arrayOf( + "image/jpeg", + "image/png", + "image/gif", + "image/webp", + "image/heic", + "image/heif", + "image/avif" + ) } private val args: ConversationArgs by lazy { @@ -457,6 +467,7 @@ class ConversationFragment : removeTextChangedListener(composeTextEventsListener) setStylingChangedListener(null) setOnClickListener(null) + ViewCompat.setOnReceiveContentListener(this, null, null) } dataObserver?.let { @@ -722,7 +733,26 @@ class ConversationFragment : SpoilerAnnotation.resetRevealedSpoilers() - inputPanel.setMediaListener(InputPanelMediaListener()) + val mediaListener = InputPanelMediaListener() + ViewCompat.setOnReceiveContentListener(composeText, RECEIVE_CONTENT_MIME_TYPES) { _, payload -> + val split = payload.partition { item -> item.uri != null } + val uriContent = split.first + + if (uriContent != null) { + val clip = uriContent.clip + val mimeType = if (clip.description.mimeTypeCount > 0) { + clip.description.getMimeType(0) + } else { + null + } + val uri = clip.getItemAt(0).uri + if (uri != null) { + mediaListener.onMediaSelected(uri, mimeType) + } + } + + split.second + } binding.conversationItemRecycler.addOnLayoutChangeListener { v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom -> viewModel.onChatBoundsChanged(Rect(left, top, right, bottom)) @@ -4956,8 +4986,8 @@ class ConversationFragment : } } - private inner class InputPanelMediaListener : InputPanel.MediaListener { - override fun onMediaSelected(uri: Uri, contentType: String?) { + private inner class InputPanelMediaListener { + fun onMediaSelected(uri: Uri, contentType: String?) { if (inputPanel.inEditMessageMode()) { Log.i(TAG, "Disregarding media because we are in edit mode") } else if (MediaUtil.isGif(contentType) || MediaUtil.isImageType(contentType)) {