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