diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/LinkPreviewView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/LinkPreviewView.kt index 90e2a5be17..b26c5adadf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/LinkPreviewView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/LinkPreviewView.kt @@ -1,9 +1,11 @@ package org.thoughtcrime.securesms.conversation.v2.messages import android.content.Context +import android.graphics.Canvas import android.graphics.Outline import android.graphics.Path import android.graphics.RectF +import android.graphics.drawable.Drawable import android.os.Build import android.util.AttributeSet import android.util.Log @@ -29,8 +31,9 @@ class LinkPreviewView : LinearLayout { // endregion // region Updating - fun bind(message: MmsMessageRecord, glide: GlideRequests, isStartOfMessageCluster: Boolean, isEndOfMessageCluster: Boolean) { - mainLinkPreviewContainer.outlineProvider = getOutlineProvider(message.isOutgoing, isStartOfMessageCluster, isEndOfMessageCluster) + fun bind(message: MmsMessageRecord, glide: GlideRequests, background: Drawable) { + mainLinkPreviewContainer.background = background + mainLinkPreviewContainer.outlineProvider = ViewOutlineProvider.BACKGROUND mainLinkPreviewContainer.clipToOutline = true // Thumbnail val linkPreview = message.linkPreviews.first() @@ -40,38 +43,12 @@ class LinkPreviewView : LinearLayout { // TODO: Properly use glide and the actual thumbnail // Title titleTextView.text = linkPreview.title + // Body + mainLinkPreviewContainer.addView(VisibleMessageContentView.getBodyTextView(context, message)) } fun recycle() { // TODO: Implement } // endregion - - // region Convenience - private fun getOutlineProvider(isOutgoing: Boolean, isStartOfMessageCluster: Boolean, isEndOfMessageCluster: Boolean): ViewOutlineProvider { - return object : ViewOutlineProvider() { - - override fun getOutline(view: View, outline: Outline) { - val path = Path() - val rect = RectF(0.0f, 0.0f, view.width.toFloat(), view.height.toFloat()) - val topLeft = if (isOutgoing) { - resources.getDimension(R.dimen.message_corner_radius) - } else { - if (isStartOfMessageCluster) resources.getDimension(R.dimen.message_corner_radius) else resources.getDimension(R.dimen.message_corner_collapse_radius) - } - val topRight = if (isOutgoing) { - if (isStartOfMessageCluster) resources.getDimension(R.dimen.message_corner_radius) else resources.getDimension(R.dimen.message_corner_collapse_radius) - } else { - resources.getDimension(R.dimen.message_corner_radius) - } - path.addRoundRect(rect, floatArrayOf( topLeft, topLeft, topRight, topRight, 0.0f, 0.0f, 0.0f, 0.0f ), Path.Direction.CW) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - outline.setPath(path) - } else { - @Suppress("DEPRECATION") outline.setConvexPath(path) - } - } - } - } - // endregion } \ No newline at end of file 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 c2938dff96..f1e5eb53c6 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 @@ -55,16 +55,15 @@ class VisibleMessageContentView : LinearLayout { onContentClick = null if (message is MmsMessageRecord && message.linkPreviews.isNotEmpty()) { val linkPreviewView = LinkPreviewView(context) - linkPreviewView.bind(message, glide, isStartOfMessageCluster, isEndOfMessageCluster) + linkPreviewView.bind(message, glide, background) mainContainer.addView(linkPreviewView) - val bodyTextView = getBodyTextView(message) - mainContainer.addView(bodyTextView) + // Body text view is inside the link preview for layout convenience } else if (message is MmsMessageRecord && message.quote != null) { val quote = message.quote!! val quoteView = QuoteView(context, QuoteView.Mode.Regular) quoteView.bind(quote.author.toString(), quote.text, quote.attachment, message.recipient, message.isOutgoing) mainContainer.addView(quoteView) - val bodyTextView = getBodyTextView(message) + val bodyTextView = VisibleMessageContentView.getBodyTextView(context, message) ViewUtil.setPaddingTop(bodyTextView, 0) mainContainer.addView(bodyTextView) } else if (message is MmsMessageRecord && message.slideDeck.audioSlide != null) { @@ -74,12 +73,12 @@ class VisibleMessageContentView : LinearLayout { onContentClick = { voiceMessageView.togglePlayback() } } else if (message is MmsMessageRecord && message.slideDeck.documentSlide != null) { val documentView = DocumentView(context) - documentView.bind(message, getTextColor(message)) + documentView.bind(message, VisibleMessageContentView.getTextColor(context, message)) mainContainer.addView(documentView) } else if (message is MmsMessageRecord && message.slideDeck.asAttachments().isNotEmpty()) { throw IllegalStateException("Not yet implemented; we may want to use Signal's album view here.") } else { - val bodyTextView = getBodyTextView(message) + val bodyTextView = VisibleMessageContentView.getBodyTextView(context, message) mainContainer.addView(bodyTextView) } } @@ -105,27 +104,30 @@ class VisibleMessageContentView : LinearLayout { // endregion // region Convenience - private fun getBodyTextView(message: MessageRecord): TextView { - val result = TextView(context) - val vPadding = resources.getDimension(R.dimen.small_spacing).toInt() - val hPadding = toPx(12, resources) - result.setPadding(hPadding, vPadding, hPadding, vPadding) - result.text = message.body - result.setTextSize(TypedValue.COMPLEX_UNIT_PX, resources.getDimension(R.dimen.small_font_size)) - val color = getTextColor(message) - result.setTextColor(color) - return result - } + companion object { - @ColorInt - private fun getTextColor(message: MessageRecord): Int { - val uiMode = UiModeUtilities.getUserSelectedUiMode(context) - val colorID = if (message.isOutgoing) { - if (uiMode == UiMode.NIGHT) R.color.black else R.color.white - } else { - if (uiMode == UiMode.NIGHT) R.color.white else R.color.black + fun getBodyTextView(context: Context, message: MessageRecord): TextView { + val result = TextView(context) + val vPadding = context.resources.getDimension(R.dimen.small_spacing).toInt() + val hPadding = toPx(12, context.resources) + result.setPadding(hPadding, vPadding, hPadding, vPadding) + result.text = message.body + result.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.resources.getDimension(R.dimen.small_font_size)) + val color = getTextColor(context, message) + result.setTextColor(color) + return result + } + + @ColorInt + fun getTextColor(context: Context, message: MessageRecord): Int { + val uiMode = UiModeUtilities.getUserSelectedUiMode(context) + val colorID = if (message.isOutgoing) { + if (uiMode == UiMode.NIGHT) R.color.black else R.color.white + } else { + if (uiMode == UiMode.NIGHT) R.color.white else R.color.black + } + return context.resources.getColorWithID(colorID, context.theme) } - return resources.getColorWithID(colorID, context.theme) } // endregion } \ No newline at end of file diff --git a/app/src/main/res/layout/view_link_preview.xml b/app/src/main/res/layout/view_link_preview.xml index 8d381092d5..38e0ef00cf 100644 --- a/app/src/main/res/layout/view_link_preview.xml +++ b/app/src/main/res/layout/view_link_preview.xml @@ -5,27 +5,34 @@ android:layout_width="match_parent" android:layout_height="wrap_content" xmlns:tools="http://schemas.android.com/tools" - android:orientation="horizontal" - android:gravity="center"> + android:orientation="vertical"> - - - + android:layout_height="wrap_content" + android:orientation="horizontal" + android:gravity="center"> + + + + + + \ No newline at end of file