From dbedc5039ae628036c9c6d275f47e51da62d4cdf Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Tue, 29 Jun 2021 14:05:32 +1000 Subject: [PATCH] Implement image quoting --- .../conversation/v2/ConversationActivityV2.kt | 4 ++-- .../v2/{ => components}/AlbumThumbnailView.kt | 2 +- .../conversation/v2/input_bar/InputBar.kt | 4 ++-- .../conversation/v2/messages/QuoteView.kt | 21 ++++++++++++++++--- .../v2/messages/VisibleMessageContentView.kt | 14 ++++++------- app/src/main/res/layout/view_quote.xml | 7 +++++++ 6 files changed, 36 insertions(+), 16 deletions(-) rename app/src/main/java/org/thoughtcrime/securesms/conversation/v2/{ => components}/AlbumThumbnailView.kt (99%) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index 86853b55ec..8ba6e3b388 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -612,7 +612,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe // `position` is the adapter position; not the visual position private fun handleSwipeToReply(message: MessageRecord, position: Int) { - inputBar.draftQuote(message) + inputBar.draftQuote(message, glide) } // `position` is the adapter position; not the visual position @@ -1047,7 +1047,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe } override fun reply(messages: Set) { - inputBar.draftQuote(messages.first()) + inputBar.draftQuote(messages.first(), glide) endActionMode() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/AlbumThumbnailView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/components/AlbumThumbnailView.kt similarity index 99% rename from app/src/main/java/org/thoughtcrime/securesms/conversation/v2/AlbumThumbnailView.kt rename to app/src/main/java/org/thoughtcrime/securesms/conversation/v2/components/AlbumThumbnailView.kt index 5384be14e2..dcbeaf1bd3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/AlbumThumbnailView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/components/AlbumThumbnailView.kt @@ -1,4 +1,4 @@ -package org.thoughtcrime.securesms.conversation.v2 +package org.thoughtcrime.securesms.conversation.v2.components import android.content.Context import android.graphics.Canvas diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/input_bar/InputBar.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/input_bar/InputBar.kt index b1ba60bc96..31be742776 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/input_bar/InputBar.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/input_bar/InputBar.kt @@ -101,7 +101,7 @@ class InputBar : RelativeLayout, InputBarEditTextDelegate, QuoteViewDelegate, Li // Drafting quotes and drafting link previews is mutually exclusive, i.e. you can't draft // a quote and a link preview at the same time. - fun draftQuote(message: MessageRecord) { + fun draftQuote(message: MessageRecord, glide: GlideRequests) { quote = message linkPreview = null linkPreviewDraftView = null @@ -115,7 +115,7 @@ class InputBar : RelativeLayout, InputBarEditTextDelegate, QuoteViewDelegate, Li // here to get the layout right. val maxContentWidth = (screenWidth - 2 * resources.getDimension(R.dimen.medium_spacing) - toPx(16, resources) - toPx(30, resources)).roundToInt() quoteView.bind(message.individualRecipient.address.toString(), message.body, attachments, - message.recipient, true, maxContentWidth, message.isOpenGroupInvitation, message.threadId) + message.recipient, true, maxContentWidth, message.isOpenGroupInvitation, message.threadId, glide) // The 6 DP below is the padding the quote view applies to itself, which isn't included in the // intrinsic height calculation. val quoteViewIntrinsicHeight = quoteView.getIntrinsicHeight(maxContentWidth) + toPx(6, resources) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt index e4ffa588f2..2ab119950a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.conversation.v2.messages +import android.content.ContentResolver import android.content.Context import android.content.res.ColorStateList import android.content.res.Resources @@ -13,6 +14,8 @@ import androidx.core.content.res.ResourcesCompat import androidx.core.text.toSpannable import androidx.core.view.isVisible import androidx.core.view.marginStart +import com.google.android.exoplayer2.util.MimeTypes +import kotlinx.android.synthetic.main.view_link_preview.view.* import kotlinx.android.synthetic.main.view_quote.view.* import network.loki.messenger.R import org.session.libsession.messaging.contacts.Contact @@ -22,7 +25,10 @@ import org.thoughtcrime.securesms.conversation.v2.utilities.TextUtilities import org.thoughtcrime.securesms.database.DatabaseFactory import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.loki.utilities.* +import org.thoughtcrime.securesms.mms.GlideRequests +import org.thoughtcrime.securesms.mms.ImageSlide import org.thoughtcrime.securesms.mms.SlideDeck +import org.thoughtcrime.securesms.util.MediaUtil import kotlin.math.max import kotlin.math.min import kotlin.math.roundToInt @@ -104,7 +110,7 @@ class QuoteView : LinearLayout { // region Updating fun bind(authorPublicKey: String, body: String?, attachments: SlideDeck?, thread: Recipient, - isOutgoingMessage: Boolean, maxContentWidth: Int, isOpenGroupInvitation: Boolean, threadID: Long) { + isOutgoingMessage: Boolean, maxContentWidth: Int, isOpenGroupInvitation: Boolean, threadID: Long, glide: GlideRequests) { val contactDB = DatabaseFactory.getSessionContactDatabase(context) // Reduce the max body text view line count to 2 if this is a group thread because // we'll be showing the author text view and we don't want the overall quote view height @@ -136,15 +142,24 @@ class QuoteView : LinearLayout { val backgroundColorID = if (UiModeUtilities.isDayUiMode(context)) R.color.black else R.color.accent val backgroundColor = ResourcesCompat.getColor(resources, backgroundColorID, context.theme) quoteViewAttachmentPreviewContainer.backgroundTintList = ColorStateList.valueOf(backgroundColor) + quoteViewAttachmentPreviewImageView.isVisible = false + quoteViewAttachmentThumbnailImageView.isVisible = false if (attachments.audioSlide != null) { quoteViewAttachmentPreviewImageView.setImageResource(R.drawable.ic_microphone) + quoteViewAttachmentPreviewImageView.isVisible = true quoteViewBodyTextView.text = resources.getString(R.string.Slide_audio) } else if (attachments.documentSlide != null) { quoteViewAttachmentPreviewImageView.setImageResource(R.drawable.ic_document_large_light) + quoteViewAttachmentPreviewImageView.isVisible = true quoteViewBodyTextView.text = resources.getString(R.string.document) + } else if (attachments.thumbnailSlide != null) { + val slide = attachments.thumbnailSlide!! + // This internally fetches the thumbnail + quoteViewAttachmentThumbnailImageView.radius = toPx(4, resources) + quoteViewAttachmentThumbnailImageView.setImageResource(glide, slide, false, false) + quoteViewAttachmentThumbnailImageView.isVisible = true + quoteViewBodyTextView.text = if (MediaUtil.isVideo(slide.asAttachment())) resources.getString(R.string.Slide_video) else resources.getString(R.string.Slide_image) } - // TODO: Link previews - // TODO: Images/video } mainQuoteViewContainer.layoutParams = LayoutParams(LayoutParams.WRAP_CONTENT, getIntrinsicHeight(maxContentWidth)) val quoteViewMainContentContainerLayoutParams = quoteViewMainContentContainer.layoutParams as RelativeLayout.LayoutParams diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt index 9cb5051031..29492b6db8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt @@ -2,8 +2,6 @@ package org.thoughtcrime.securesms.conversation.v2.messages import android.content.Context import android.graphics.Rect -import android.content.res.ColorStateList -import android.graphics.Color import android.graphics.drawable.Drawable import android.text.util.Linkify import android.util.AttributeSet @@ -22,7 +20,7 @@ import network.loki.messenger.R import org.session.libsession.utilities.ThemeUtil import org.session.libsession.utilities.ViewUtil import org.session.libsession.utilities.recipients.Recipient -import org.thoughtcrime.securesms.conversation.v2.AlbumThumbnailView +import org.thoughtcrime.securesms.conversation.v2.components.AlbumThumbnailView import org.thoughtcrime.securesms.components.emoji.EmojiTextView import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.database.model.MmsMessageRecord @@ -71,7 +69,7 @@ class VisibleMessageContentView : LinearLayout { // here to get the layout right. val maxContentWidth = (maxWidth - 2 * resources.getDimension(R.dimen.medium_spacing) - toPx(16, resources)).roundToInt() quoteView.bind(quote.author.toString(), quote.text, quote.attachment, thread, - message.isOutgoing, maxContentWidth, message.isOpenGroupInvitation, message.threadId) + message.isOutgoing, maxContentWidth, message.isOpenGroupInvitation, message.threadId, glide) mainContainer.addView(quoteView) val bodyTextView = VisibleMessageContentView.getBodyTextView(context, message) ViewUtil.setPaddingTop(bodyTextView, 0) @@ -94,10 +92,10 @@ class VisibleMessageContentView : LinearLayout { // isStart and isEnd of cluster needed for calculating the mask for full bubble image groups // bind after add view because views are inflated and calculated during bind albumThumbnailView.bind( - glideRequests = glide, - message = message, - isStart = isStartOfMessageCluster, - isEnd = isEndOfMessageCluster + glideRequests = glide, + message = message, + isStart = isStartOfMessageCluster, + isEnd = isEndOfMessageCluster ) onContentClick = { albumThumbnailView.calculateHitObject(it, message) } } else if (message.isOpenGroupInvitation) { diff --git a/app/src/main/res/layout/view_quote.xml b/app/src/main/res/layout/view_quote.xml index ff069a7b2e..d2835c8fb9 100644 --- a/app/src/main/res/layout/view_quote.xml +++ b/app/src/main/res/layout/view_quote.xml @@ -32,6 +32,13 @@ android:scaleType="centerInside" android:src="@drawable/ic_microphone" /> + +