From 620d063194a67934f97f2e00c44d319d22283dfa Mon Sep 17 00:00:00 2001 From: jubb Date: Fri, 25 Jun 2021 09:57:58 +1000 Subject: [PATCH] feat: adding text and shade, reverting other components to use old ThumbnailView --- .../components/AlbumThumbnailView.java | 4 +- .../components/ConversationItemThumbnail.java | 4 - .../components/OutlinedThumbnailView.java | 1 - .../conversation/v2/AlbumThumbnailView.kt | 23 +++--- .../conversation/v2/ConversationActivityV2.kt | 2 - .../v2/messages/VisibleMessageContentView.kt | 3 +- .../v2/utilities/KThumbnailView.kt} | 78 +++++++++++++++---- .../securesms/mms/AttachmentManager.java | 2 +- app/src/main/res/layout/album_thumbnail_1.xml | 10 +-- app/src/main/res/layout/album_thumbnail_2.xml | 4 +- app/src/main/res/layout/album_thumbnail_3.xml | 6 +- app/src/main/res/layout/album_thumbnail_4.xml | 8 +- app/src/main/res/layout/album_thumbnail_5.xml | 10 +-- .../main/res/layout/album_thumbnail_many.xml | 10 +-- .../main/res/layout/album_thumbnail_view.xml | 36 ++++++++- 15 files changed, 137 insertions(+), 64 deletions(-) rename app/src/main/java/org/thoughtcrime/securesms/{components/v2/utilities/ThumbnailView.kt => conversation/v2/utilities/KThumbnailView.kt} (73%) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/AlbumThumbnailView.java b/app/src/main/java/org/thoughtcrime/securesms/components/AlbumThumbnailView.java index 4529ef1fc4..8274e463fa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/AlbumThumbnailView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/AlbumThumbnailView.java @@ -53,8 +53,8 @@ public class AlbumThumbnailView extends FrameLayout { private void initialize() { inflate(getContext(), R.layout.album_thumbnail_view, this); - albumCellContainer = findViewById(R.id.album_cell_container); - transferControls = new Stub<>(findViewById(R.id.album_transfer_controls_stub)); + albumCellContainer = findViewById(R.id.albumCellContainer); + transferControls = new Stub<>(findViewById(R.id.albumTransferControlsStub)); } public void setSlides(@NonNull GlideRequests glideRequests, @NonNull List slides, boolean showControls) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemThumbnail.java b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemThumbnail.java index 53ef48b174..af9e766416 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemThumbnail.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemThumbnail.java @@ -65,10 +65,6 @@ public class ConversationItemThumbnail extends FrameLayout { if (attrs != null) { TypedArray typedArray = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.ConversationItemThumbnail, 0, 0); - thumbnail.setBounds(typedArray.getDimensionPixelSize(R.styleable.ConversationItemThumbnail_conversationThumbnail_minWidth, 0), - typedArray.getDimensionPixelSize(R.styleable.ConversationItemThumbnail_conversationThumbnail_maxWidth, 0), - typedArray.getDimensionPixelSize(R.styleable.ConversationItemThumbnail_conversationThumbnail_minHeight, 0), - typedArray.getDimensionPixelSize(R.styleable.ConversationItemThumbnail_conversationThumbnail_maxHeight, 0)); typedArray.recycle(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/OutlinedThumbnailView.java b/app/src/main/java/org/thoughtcrime/securesms/components/OutlinedThumbnailView.java index df28984ab0..71bf8a2804 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/OutlinedThumbnailView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/OutlinedThumbnailView.java @@ -29,7 +29,6 @@ public class OutlinedThumbnailView extends ThumbnailView { outliner = new Outliner(); outliner.setColor(ThemeUtil.getThemedColor(getContext(), R.attr.conversation_item_image_outline_color)); - setRadius(0); setWillNotDraw(false); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/AlbumThumbnailView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/AlbumThumbnailView.kt index a00cf92673..ecd23e0b03 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/AlbumThumbnailView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/AlbumThumbnailView.kt @@ -6,9 +6,11 @@ import android.util.AttributeSet import android.view.LayoutInflater import android.view.ViewGroup import android.widget.FrameLayout +import androidx.core.view.isVisible import kotlinx.android.synthetic.main.album_thumbnail_view.view.* import network.loki.messenger.R import org.thoughtcrime.securesms.components.CornerMask +import org.thoughtcrime.securesms.conversation.v2.utilities.KThumbnailView import org.thoughtcrime.securesms.conversation.v2.utilities.ThumbnailView import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.mms.GlideRequests @@ -20,13 +22,10 @@ class AlbumThumbnailView: FrameLayout { constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { initialize() } constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { initialize() } - private val albumCellContainer by lazy { album_cell_container } - private lateinit var cornerMask: CornerMask + private val cornerMask by lazy { CornerMask(this) } private fun initialize() { LayoutInflater.from(context).inflate(R.layout.album_thumbnail_view, this) - cornerMask = CornerMask(this) - cornerMask.setRadius(80) } override fun dispatchDraw(canvas: Canvas?) { @@ -50,8 +49,10 @@ class AlbumThumbnailView: FrameLayout { LayoutInflater.from(context).inflate(layoutRes(slides.size), albumCellContainer) // iterate slides.take(5).forEachIndexed { position, slide -> - getThumbnailView(position).setImageResource(glideRequests, slide, showControls = false, isPreview = false) + val imageResource = getThumbnailView(position).setImageResource(glideRequests, slide, showControls = false, isPreview = false) } + albumCellBodyParent.isVisible = message.body.isNotEmpty() + albumCellBodyText.text = message.body } // endregion @@ -66,12 +67,12 @@ class AlbumThumbnailView: FrameLayout { else -> R.layout.album_thumbnail_many// five or more } - fun getThumbnailView(position: Int): ThumbnailView = when (position) { - 0 -> albumCellContainer.findViewById(R.id.album_cell_container).findViewById(R.id.album_cell_1) - 1 -> albumCellContainer.findViewById(R.id.album_cell_container).findViewById(R.id.album_cell_2) - 2 -> albumCellContainer.findViewById(R.id.album_cell_container).findViewById(R.id.album_cell_3) - 3 -> albumCellContainer.findViewById(R.id.album_cell_container).findViewById(R.id.album_cell_4) - 4 -> albumCellContainer.findViewById(R.id.album_cell_container).findViewById(R.id.album_cell_5) + fun getThumbnailView(position: Int): KThumbnailView = when (position) { + 0 -> albumCellContainer.findViewById(R.id.albumCellContainer).findViewById(R.id.album_cell_1) + 1 -> albumCellContainer.findViewById(R.id.albumCellContainer).findViewById(R.id.album_cell_2) + 2 -> albumCellContainer.findViewById(R.id.albumCellContainer).findViewById(R.id.album_cell_3) + 3 -> albumCellContainer.findViewById(R.id.albumCellContainer).findViewById(R.id.album_cell_4) + 4 -> albumCellContainer.findViewById(R.id.albumCellContainer).findViewById(R.id.album_cell_5) else -> throw Exception("Can't get thumbnail view for non-existent thumbnail at position: $position") } 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 8f57a7a97e..f2368c8fc6 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 @@ -7,7 +7,6 @@ import android.database.Cursor import android.graphics.Rect import android.graphics.Typeface import android.os.Bundle -import android.util.Log import android.util.TypedValue import android.view.* import android.widget.RelativeLayout @@ -31,7 +30,6 @@ import org.session.libsession.messaging.mentions.MentionsManager import org.session.libsession.messaging.open_groups.OpenGroupAPIV2 import org.session.libsession.utilities.TextSecurePreferences import org.thoughtcrime.securesms.ApplicationContext -import org.thoughtcrime.securesms.ApplicationContext import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity import org.thoughtcrime.securesms.conversation.v2.dialogs.* import org.thoughtcrime.securesms.conversation.v2.input_bar.InputBarButton 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 c949163a7c..6cd959c5ed 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 @@ -19,7 +19,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.components.v2.AlbumThumbnailView +import org.thoughtcrime.securesms.conversation.v2.AlbumThumbnailView import org.thoughtcrime.securesms.components.emoji.EmojiTextView import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.database.model.MmsMessageRecord @@ -87,6 +87,7 @@ class VisibleMessageContentView : LinearLayout { val albumThumbnailView = AlbumThumbnailView(context) mainContainer.addView(albumThumbnailView) // 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(glide, message, isStartOfMessageCluster, isEndOfMessageCluster) } else if (message.isOpenGroupInvitation) { val openGroupInvitationView = OpenGroupInvitationView(context) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/v2/utilities/ThumbnailView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/KThumbnailView.kt similarity index 73% rename from app/src/main/java/org/thoughtcrime/securesms/components/v2/utilities/ThumbnailView.kt rename to app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/KThumbnailView.kt index 69fe44ea2a..ceec1ae8f8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/v2/utilities/ThumbnailView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/KThumbnailView.kt @@ -3,11 +3,14 @@ package org.thoughtcrime.securesms.conversation.v2.utilities import android.content.Context import android.graphics.Bitmap import android.graphics.drawable.Drawable +import android.net.Uri import android.util.AttributeSet import android.widget.FrameLayout import android.widget.ProgressBar import androidx.core.view.isVisible import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.request.RequestOptions import kotlinx.android.synthetic.main.thumbnail_view.view.* @@ -15,14 +18,15 @@ import network.loki.messenger.R import org.session.libsession.messaging.sending_receiving.attachments.AttachmentTransferProgress import org.session.libsession.utilities.Util.equals import org.session.libsession.utilities.ViewUtil +import org.session.libsignal.utilities.ListenableFuture +import org.session.libsignal.utilities.SettableFuture +import org.thoughtcrime.securesms.components.GlideBitmapListeningTarget +import org.thoughtcrime.securesms.components.GlideDrawableListeningTarget import org.thoughtcrime.securesms.components.TransferControlView +import org.thoughtcrime.securesms.mms.* import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri -import org.thoughtcrime.securesms.mms.GlideRequest -import org.thoughtcrime.securesms.mms.GlideRequests -import org.thoughtcrime.securesms.mms.Slide -import org.thoughtcrime.securesms.mms.SlideClickListener -class ThumbnailView: FrameLayout { +open class KThumbnailView: FrameLayout { companion object { private const val WIDTH = 0 @@ -45,16 +49,19 @@ class ThumbnailView: FrameLayout { var thumbnailClickListener: SlideClickListener? = null private var slide: Slide? = null + private var radius: Int = 0 private fun initialize(attrs: AttributeSet?) { inflate(context, R.layout.thumbnail_view, this) if (attrs != null) { val typedArray = context.theme.obtainStyledAttributes(attrs, R.styleable.ThumbnailView, 0, 0) - dimensDelegate.setBounds(typedArray.getDimensionPixelSize(R.styleable.ConversationItemThumbnail_conversationThumbnail_minWidth, 0), - typedArray.getDimensionPixelSize(R.styleable.ConversationItemThumbnail_conversationThumbnail_minHeight, 0), - typedArray.getDimensionPixelSize(R.styleable.ConversationItemThumbnail_conversationThumbnail_maxWidth, 0), - typedArray.getDimensionPixelSize(R.styleable.ConversationItemThumbnail_conversationThumbnail_maxHeight, 0)) + dimensDelegate.setBounds(typedArray.getDimensionPixelSize(R.styleable.ThumbnailView_minWidth, 0), + typedArray.getDimensionPixelSize(R.styleable.ThumbnailView_minHeight, 0), + typedArray.getDimensionPixelSize(R.styleable.ThumbnailView_maxWidth, 0), + typedArray.getDimensionPixelSize(R.styleable.ThumbnailView_maxHeight, 0)) + + radius = typedArray.getDimensionPixelSize(R.styleable.ThumbnailView_thumbnail_radius, 0) typedArray.recycle() } @@ -82,13 +89,13 @@ class ThumbnailView: FrameLayout { // endregion // region Interaction - fun setImageResource(glide: GlideRequests, slide: Slide, showControls: Boolean, isPreview: Boolean) { + fun setImageResource(glide: GlideRequests, slide: Slide, showControls: Boolean, isPreview: Boolean): ListenableFuture { return setImageResource(glide, slide, showControls, isPreview, 0, 0) } fun setImageResource(glide: GlideRequests, slide: Slide, showControls: Boolean, isPreview: Boolean, - naturalWidth: Int, naturalHeight: Int) { + naturalWidth: Int, naturalHeight: Int): ListenableFuture { val currentSlide = this.slide @@ -104,7 +111,7 @@ class ThumbnailView: FrameLayout { if (equals(currentSlide, slide)) { // don't re-load slide - return + return SettableFuture(false) } @@ -121,17 +128,21 @@ class ThumbnailView: FrameLayout { dimensDelegate.setDimens(naturalWidth, naturalHeight) invalidate() + val result = SettableFuture() + when { slide.thumbnailUri != null -> { - buildThumbnailGlideRequest(glide, slide).into(image) + buildThumbnailGlideRequest(glide, slide).into(GlideDrawableListeningTarget(image, result)) } slide.hasPlaceholder() -> { - buildPlaceholderGlideRequest(glide, slide).into(image) + buildPlaceholderGlideRequest(glide, slide).into(GlideBitmapListeningTarget(image, result)) } else -> { glide.clear(image) + result.set(false) } } + return result } fun buildThumbnailGlideRequest(glide: GlideRequests, slide: Slide): GlideRequest { @@ -169,6 +180,45 @@ class ThumbnailView: FrameLayout { } .fitCenter() } + + open fun clear(glideRequests: GlideRequests) { + glideRequests.clear(image) + transferControls.clear() + slide = null + } + + fun showProgressSpinner() { + transferControls.showProgressSpinner() + } + + fun setImageResource(glideRequests: GlideRequests, uri: Uri): ListenableFuture { + val future = SettableFuture() + + transferControls.isVisible = false + + var request: GlideRequest = glideRequests.load(DecryptableUri(uri)) + .diskCacheStrategy(DiskCacheStrategy.NONE) + .transition(DrawableTransitionOptions.withCrossFade()) + + request = if (radius > 0) { + request.transforms(CenterCrop(), RoundedCorners(radius)) + } else { + request.transforms(CenterCrop()) + } + + request.into(GlideDrawableListeningTarget(image, future)) + + return future + } + + fun showDownloadText(showDownloadText: Boolean) { + transferControls.setShowDownloadText(showDownloadText) + } + + fun setDownloadClickListener(listener: SlidesClickedListener) { + + } + // endregion } \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java b/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java index e2b7980ab6..153f07c168 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java @@ -83,7 +83,7 @@ public class AttachmentManager { private final @NonNull AttachmentListener attachmentListener; private RemovableEditableMediaView removableMediaView; - private ThumbnailView thumbnail; + private ThumbnailView thumbnail; private MessageAudioView audioView; private DocumentView documentView; diff --git a/app/src/main/res/layout/album_thumbnail_1.xml b/app/src/main/res/layout/album_thumbnail_1.xml index c323b9e1d1..cf0f5d4892 100644 --- a/app/src/main/res/layout/album_thumbnail_1.xml +++ b/app/src/main/res/layout/album_thumbnail_1.xml @@ -6,14 +6,14 @@ android:layout_width="@dimen/media_bubble_default_dimens" android:layout_height="@dimen/media_bubble_default_dimens"> - \ No newline at end of file diff --git a/app/src/main/res/layout/album_thumbnail_2.xml b/app/src/main/res/layout/album_thumbnail_2.xml index 6ce179ea6a..9ac5866113 100644 --- a/app/src/main/res/layout/album_thumbnail_2.xml +++ b/app/src/main/res/layout/album_thumbnail_2.xml @@ -7,13 +7,13 @@ android:layout_width="@dimen/album_total_width" android:layout_height="@dimen/album_2_total_height"> - - - - - - - - - - - - - - - - - - - + /> + + + + + + + + \ No newline at end of file