From cb1b660eff91cb3d3b951d0986a32e1987847052 Mon Sep 17 00:00:00 2001
From: Taras Smakula <tarassmakula@gmail.com>
Date: Tue, 12 Mar 2024 17:26:46 +0200
Subject: [PATCH] Implement removing media file

---
 .../feature/timeline/TimelineViewModel.kt     |  2 +-
 .../preview/TimelineMediaPreviewViewModel.kt  |  6 ++---
 core/build.gradle                             |  2 +-
 .../timeline/post/PostOptionsDataSource.kt    | 24 +++++++++++++++----
 .../feature/gallery/grid/GalleryViewModel.kt  |  2 +-
 5 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/app/src/main/java/org/futo/circles/feature/timeline/TimelineViewModel.kt b/app/src/main/java/org/futo/circles/feature/timeline/TimelineViewModel.kt
index 6bd22369e..9f75a896c 100644
--- a/app/src/main/java/org/futo/circles/feature/timeline/TimelineViewModel.kt
+++ b/app/src/main/java/org/futo/circles/feature/timeline/TimelineViewModel.kt
@@ -66,7 +66,7 @@ class TimelineViewModel @Inject constructor(
     }
 
     fun removeMessage(roomId: String, eventId: String) {
-        postOptionsDataSource.removeMessage(roomId, eventId)
+        launchBg { postOptionsDataSource.removeMessage(roomId, eventId) }
     }
 
     fun ignoreSender(senderId: String) {
diff --git a/app/src/main/java/org/futo/circles/feature/timeline/preview/TimelineMediaPreviewViewModel.kt b/app/src/main/java/org/futo/circles/feature/timeline/preview/TimelineMediaPreviewViewModel.kt
index 45adc4e27..5a96f1da8 100644
--- a/app/src/main/java/org/futo/circles/feature/timeline/preview/TimelineMediaPreviewViewModel.kt
+++ b/app/src/main/java/org/futo/circles/feature/timeline/preview/TimelineMediaPreviewViewModel.kt
@@ -6,9 +6,9 @@ import dagger.hilt.android.lifecycle.HiltViewModel
 import org.futo.circles.core.base.SingleEventLiveData
 import org.futo.circles.core.extensions.getOrThrow
 import org.futo.circles.core.extensions.launchBg
-import org.futo.circles.core.model.ShareableContent
-import org.futo.circles.core.feature.timeline.post.PostOptionsDataSource
 import org.futo.circles.core.feature.timeline.post.PostContentDataSource
+import org.futo.circles.core.feature.timeline.post.PostOptionsDataSource
+import org.futo.circles.core.model.ShareableContent
 import javax.inject.Inject
 
 @HiltViewModel
@@ -35,7 +35,7 @@ class TimelineMediaPreviewViewModel @Inject constructor(
     }
 
     fun removeImage() {
-        postOptionsDataSource.removeMessage(roomId, eventId)
+        launchBg { postOptionsDataSource.removeMessage(roomId, eventId) }
     }
 
     fun save() {
diff --git a/core/build.gradle b/core/build.gradle
index d9ca5b19b..302e0e1ea 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -76,7 +76,7 @@ dependencies {
     kapt "com.google.dagger:hilt-compiler:$rootProject.ext.hilt_version"
 
     //Matrix
-    api('org.futo.gitlab.circles:matrix-android-sdk:v1.6.10.24@aar') {
+    api('org.futo.gitlab.circles:matrix-android-sdk:v1.6.10.27@aar') {
         transitive = true
     }
 
diff --git a/core/src/main/java/org/futo/circles/core/feature/timeline/post/PostOptionsDataSource.kt b/core/src/main/java/org/futo/circles/core/feature/timeline/post/PostOptionsDataSource.kt
index bae01ac4f..d2ab6c0ed 100644
--- a/core/src/main/java/org/futo/circles/core/feature/timeline/post/PostOptionsDataSource.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/timeline/post/PostOptionsDataSource.kt
@@ -3,17 +3,23 @@ package org.futo.circles.core.feature.timeline.post
 import android.content.Context
 import dagger.hilt.android.qualifiers.ApplicationContext
 import org.futo.circles.core.extensions.createResult
+import org.futo.circles.core.extensions.getPostContentType
 import org.futo.circles.core.extensions.onBG
+import org.futo.circles.core.mapping.toMediaContent
 import org.futo.circles.core.model.MediaContent
 import org.futo.circles.core.model.MediaFileData
 import org.futo.circles.core.model.MediaShareable
+import org.futo.circles.core.model.MediaType
 import org.futo.circles.core.model.PostContent
+import org.futo.circles.core.model.PostContentType.IMAGE_CONTENT
+import org.futo.circles.core.model.PostContentType.VIDEO_CONTENT
 import org.futo.circles.core.model.ShareableContent
 import org.futo.circles.core.model.TextContent
 import org.futo.circles.core.model.TextShareable
 import org.futo.circles.core.provider.MatrixSessionProvider
 import org.futo.circles.core.utils.FileUtils.downloadEncryptedFileToContentUri
 import org.futo.circles.core.utils.FileUtils.saveMediaFileToDevice
+import org.matrix.android.sdk.api.extensions.tryOrNull
 import org.matrix.android.sdk.api.session.getRoom
 import org.matrix.android.sdk.api.session.room.getTimelineEvent
 import javax.inject.Inject
@@ -24,10 +30,18 @@ class PostOptionsDataSource @Inject constructor(
 
     private val session = MatrixSessionProvider.currentSession
 
-    fun removeMessage(roomId: String, eventId: String) {
-        val roomForMessage = session?.getRoom(roomId)
-        roomForMessage?.getTimelineEvent(eventId)
-            ?.let { roomForMessage.sendService().redactEvent(it.root, null) }
+    suspend fun removeMessage(roomId: String, eventId: String) {
+        val roomForMessage = session?.getRoom(roomId) ?: return
+        val event = roomForMessage.getTimelineEvent(eventId) ?: return
+        roomForMessage.sendService().redactEvent(event.root, null)
+
+        val eventType = event.getPostContentType()
+        val mediaEvent = when (eventType) {
+            IMAGE_CONTENT -> event.toMediaContent(MediaType.Image)
+            VIDEO_CONTENT -> event.toMediaContent(MediaType.Video)
+            else -> return
+        }
+        tryOrNull { session.mediaService().deleteMediaFile(mediaEvent.mediaFileData.fileUrl) }
     }
 
     fun sendReaction(roomId: String, eventId: String, emoji: String) {
@@ -44,7 +58,7 @@ class PostOptionsDataSource @Inject constructor(
     suspend fun getShareableContent(content: PostContent): ShareableContent? = onBG {
         when (content) {
             is MediaContent -> getShareableMediaContent(content.mediaFileData)
-            is TextContent -> TextShareable(content.message.toString())
+            is TextContent -> TextShareable(content.message)
             else -> throw IllegalArgumentException("Not shareable post content")
         }
     }
diff --git a/gallery/src/main/java/org/futo/circles/gallery/feature/gallery/grid/GalleryViewModel.kt b/gallery/src/main/java/org/futo/circles/gallery/feature/gallery/grid/GalleryViewModel.kt
index f557aa3fd..179a0c189 100644
--- a/gallery/src/main/java/org/futo/circles/gallery/feature/gallery/grid/GalleryViewModel.kt
+++ b/gallery/src/main/java/org/futo/circles/gallery/feature/gallery/grid/GalleryViewModel.kt
@@ -61,7 +61,7 @@ class GalleryViewModel @Inject constructor(
 
     fun removeImage(position: Int) {
         val eventId = galleryItemsLiveData.value?.getOrNull(position)?.id ?: return
-        postOptionsDataSource.removeMessage(roomId, eventId)
+        launchBg { postOptionsDataSource.removeMessage(roomId, eventId) }
     }
 
     fun save(position: Int) {
-- 
GitLab