77
88package com.nextcloud.talk.chat.ui.model
99
10+ import android.provider.Settings
1011import androidx.compose.runtime.Stable
1112import com.nextcloud.talk.R
1213import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
@@ -15,7 +16,9 @@ import com.nextcloud.talk.data.database.model.SendStatus
1516import com.nextcloud.talk.data.user.model.User
1617import com.nextcloud.talk.ui.PlaybackSpeed
1718import com.nextcloud.talk.utils.ApiUtils
19+ import com.nextcloud.talk.utils.CapabilitiesUtil
1820import com.nextcloud.talk.utils.DrawableUtils
21+ import com.nextcloud.talk.utils.MimetypeUtils
1922import java.time.LocalDate
2023
2124// immutable class for chat message UI. only val, no vars!
@@ -54,7 +57,12 @@ sealed interface MessageTypeContent {
5457
5558 data class LinkPreview (val url : String ) : MessageTypeContent
5659
57- data class Media (val previewUrl : String? , val drawableResourceId : Int ) : MessageTypeContent
60+ data class Media (
61+ val previewUrl : String? ,
62+ val drawableResourceId : Int ,
63+ val mimeType : String ,
64+ val animateGif : Boolean = false
65+ ) : MessageTypeContent
5866
5967 data class Geolocation (val id : String , val name : String , val lat : Double , val lon : Double ) : MessageTypeContent
6068
@@ -199,16 +207,52 @@ fun getMessageTypeContent(user: User, message: ChatMessage): MessageTypeContent?
199207 }
200208
201209fun getMediaContent (user : User , message : ChatMessage ): MessageTypeContent .Media {
202- val previewUrl = getPreviewImageUrl(user, message)
203210 val mimetype = message.fileParameters.mimetype
204211 val drawableResourceId = DrawableUtils .getDrawableResourceIdForMimeType(mimetype)
205212
213+ val animateGif = shouldAnimateGif(user, message, mimetype)
214+ val previewUrl = if (animateGif) {
215+ ApiUtils .getUrlForFileDownload(
216+ user.baseUrl!! ,
217+ user.userId!! ,
218+ message.fileParameters.path
219+ )
220+ } else {
221+ getPreviewImageUrl(user, message)
222+ }
223+
206224 return MessageTypeContent .Media (
207- previewUrl,
208- drawableResourceId
225+ previewUrl = previewUrl,
226+ drawableResourceId = drawableResourceId,
227+ mimeType = mimetype,
228+ animateGif = animateGif
209229 )
210230}
211231
232+ private fun shouldAnimateGif (user : User , message : ChatMessage , mimetype : String ): Boolean {
233+ val fileSize = message.fileParameters.size
234+ val spreedCapabilities = user.capabilities?.spreedCapability
235+ return MimetypeUtils .isGif(mimetype) &&
236+ fileSize != null &&
237+ message.fileParameters.path.isNotEmpty() &&
238+ spreedCapabilities != null &&
239+ fileSize <= CapabilitiesUtil .getMaxGifSize(spreedCapabilities) &&
240+ ! isReduceAnimationsEnabled()
241+ }
242+
243+ /* *
244+ * Returns true if the user has the accessibility option
245+ * for Remove/Reduce animations turned on
246+ */
247+ private fun isReduceAnimationsEnabled (): Boolean {
248+ val context = sharedApplication ? : return false
249+ return Settings .Global .getFloat(
250+ context.contentResolver,
251+ Settings .Global .ANIMATOR_DURATION_SCALE ,
252+ 1f
253+ ) == 0f
254+ }
255+
212256fun getPreviewImageUrl (user : User , message : ChatMessage ): String? {
213257 if (message.fileParameters.previewAvailable) {
214258 return ApiUtils .getUrlForFilePreviewWithFileId(
0 commit comments