From 0f6eda1ebc8e236d5cccb0c25accc29c29d11186 Mon Sep 17 00:00:00 2001 From: Taras Smakula <tarassmakula@gmail.com> Date: Mon, 31 Jul 2023 15:46:36 +0300 Subject: [PATCH] Update create post to be able to edit media --- .../post/create/CreatePostDialogFragment.kt | 16 +++++--- .../post/create/CreatePostListener.kt | 2 +- .../org/futo/circles/view/PreviewPostView.kt | 40 ++++++++++++++++++- app/src/main/res/layout/view_preview_post.xml | 8 +--- .../timeline/post/PostContentDataSource.kt | 2 - 5 files changed, 52 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostDialogFragment.kt b/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostDialogFragment.kt index 5b0153fbd..faa446bfc 100644 --- a/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostDialogFragment.kt +++ b/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostDialogFragment.kt @@ -14,12 +14,14 @@ import org.futo.circles.core.extensions.navigateSafe import org.futo.circles.core.extensions.observeData import org.futo.circles.core.extensions.onBackPressed import org.futo.circles.core.fragment.BaseFullscreenDialogFragment +import org.futo.circles.core.model.MediaContent import org.futo.circles.core.model.MediaType +import org.futo.circles.core.model.PostContentType +import org.futo.circles.core.model.TextContent import org.futo.circles.core.picker.helper.MediaPickerHelper import org.futo.circles.databinding.DialogFragmentCreatePostBinding import org.futo.circles.feature.timeline.post.emoji.EmojiPickerListener import org.futo.circles.feature.timeline.post.markdown.span.TextStyle -import org.futo.circles.model.TextPostContent import org.futo.circles.view.PreviewPostListener import java.util.* @@ -78,8 +80,13 @@ class CreatePostDialogFragment : } private fun setupObservers() { - viewModel.textToEditLiveData.observeData(this) { - binding.vPostPreview.setText(it) + viewModel.postToEditContentLiveData.observeData(this) { + when (it.type) { + PostContentType.IMAGE_CONTENT, PostContentType.VIDEO_CONTENT -> + binding.vPostPreview.setMediaFromExistingPost(it as MediaContent) + + else -> binding.vPostPreview.setText((it as TextContent).message) + } } } @@ -102,9 +109,8 @@ class CreatePostDialogFragment : } private fun onEditPost() { - val newMessage = (binding.vPostPreview.getPostContent() as? TextPostContent)?.text ?: return val eventId = args.eventId ?: return - createPostListener?.onEditTextPost(args.roomId, newMessage, eventId) + createPostListener?.onEditPost(args.roomId, binding.vPostPreview.getPostContent(), eventId) } override fun onUploadMediaClicked() { diff --git a/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostListener.kt b/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostListener.kt index 06d324377..23b6c3ffb 100644 --- a/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostListener.kt +++ b/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostListener.kt @@ -4,5 +4,5 @@ import org.futo.circles.model.CreatePostContent interface CreatePostListener { fun onSendPost(roomId: String, postContent: CreatePostContent, threadEventId: String?) - fun onEditTextPost(roomId: String, newMessage: String, eventId: String) + fun onEditPost(roomId: String, postContent: CreatePostContent, eventId: String) } \ No newline at end of file diff --git a/app/src/main/java/org/futo/circles/view/PreviewPostView.kt b/app/src/main/java/org/futo/circles/view/PreviewPostView.kt index 50b64fd85..1283add2e 100644 --- a/app/src/main/java/org/futo/circles/view/PreviewPostView.kt +++ b/app/src/main/java/org/futo/circles/view/PreviewPostView.kt @@ -10,9 +10,11 @@ import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.updateLayoutParams import androidx.core.widget.doAfterTextChanged +import org.futo.circles.core.extensions.loadEncryptedIntoWithAspect import org.futo.circles.core.extensions.loadImage import org.futo.circles.core.extensions.notEmptyDisplayName import org.futo.circles.core.extensions.setIsVisible +import org.futo.circles.core.model.MediaContent import org.futo.circles.core.model.MediaType import org.futo.circles.core.provider.MatrixSessionProvider import org.futo.circles.core.utils.ImageUtils @@ -43,6 +45,7 @@ class PreviewPostView( private var listener: PreviewPostListener? = null private var postContent: CreatePostContent? = null + private var canEditMedia: Boolean = true init { getMyUser()?.let { @@ -98,6 +101,24 @@ class PreviewPostView( binding.etTextPost.addLinkSpan(title, link) } + fun setMediaFromExistingPost(mediaContent: MediaContent) { + canEditMedia = false + val caption = mediaContent.mediaContentInfo.caption ?: "" + setText(caption) + val uri = Uri.parse(mediaContent.mediaFileData.fileUrl) + val mediaType = mediaContent.getMediaType() + postContent = MediaPostContent(caption, uri, mediaType) + updateContentView() + loadMediaCover(mediaContent) + val isVideo = mediaType == MediaType.Video + binding.lMediaContent.videoGroup.setIsVisible(isVideo) + if (isVideo) + binding.lMediaContent.tvDuration.text = mediaContent.mediaContentInfo.duration + + listener?.onPostContentAvailable(true) + } + + fun setMedia(contentUri: Uri, mediaType: MediaType) { val caption = binding.etTextPost.text.toString().trim() postContent = MediaPostContent(caption, contentUri, mediaType) @@ -118,7 +139,8 @@ class PreviewPostView( private fun updateContentView() { val isTextContent = postContent is TextPostContent || postContent == null - binding.mediaContentGroup.setIsVisible(!isTextContent) + binding.lMediaContent.lMedia.setIsVisible(!isTextContent) + binding.ivRemoveImage.setIsVisible(!isTextContent && canEditMedia) if (isTextContent) requestFocusOnText() binding.etTextPost.setPadding( context.convertDpToPixel(12f).toInt(), @@ -148,6 +170,22 @@ class PreviewPostView( binding.lMediaContent.ivCover.loadImage(uri.toString()) } + private fun loadMediaCover(mediaContent: MediaContent) { + val image = binding.lMediaContent.ivCover + image.post { + val size = mediaContent.calculateSize(image.width) + image.updateLayoutParams { + width = size.width + height = size.height + } + } + mediaContent.mediaFileData.loadEncryptedIntoWithAspect( + image, + mediaContent.aspectRatio, + mediaContent.mediaContentInfo.thumbHash + ) + } + private fun requestFocusOnText() { binding.etTextPost.post { requestFocus() diff --git a/app/src/main/res/layout/view_preview_post.xml b/app/src/main/res/layout/view_preview_post.xml index 8e9fcf3a8..13f7ae6b1 100644 --- a/app/src/main/res/layout/view_preview_post.xml +++ b/app/src/main/res/layout/view_preview_post.xml @@ -91,13 +91,7 @@ app:layout_constraintEnd_toEndOf="@id/lMediaContent" app:layout_constraintTop_toTopOf="@id/lMediaContent" app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.App.CornerSize50Percent" /> - - <androidx.constraintlayout.widget.Group - android:id="@+id/mediaContentGroup" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - app:constraint_referenced_ids="ivRemoveImage, lMediaContent" /> - + </androidx.constraintlayout.widget.ConstraintLayout> </ScrollView> diff --git a/core/src/main/java/org/futo/circles/core/timeline/post/PostContentDataSource.kt b/core/src/main/java/org/futo/circles/core/timeline/post/PostContentDataSource.kt index bee31c28f..0fbb00d6f 100644 --- a/core/src/main/java/org/futo/circles/core/timeline/post/PostContentDataSource.kt +++ b/core/src/main/java/org/futo/circles/core/timeline/post/PostContentDataSource.kt @@ -6,10 +6,8 @@ import org.futo.circles.core.model.Post import org.futo.circles.core.model.PostContent import org.futo.circles.core.model.PostContentType import org.futo.circles.core.provider.MatrixSessionProvider -import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.getRoom import org.matrix.android.sdk.api.session.room.getTimelineEvent -import org.matrix.android.sdk.api.session.room.model.message.MessageContent import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.session.room.timeline.getLastMessageContent import javax.inject.Inject -- GitLab