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
@@ -203,16 +211,52 @@ fun getMessageTypeContent(user: User, message: ChatMessage): MessageTypeContent?
203211 }
204212
205213fun getMediaContent (user : User , message : ChatMessage ): MessageTypeContent .Media {
206- val previewUrl = getPreviewImageUrl(user, message)
207214 val mimetype = message.fileParameters.mimetype
208215 val drawableResourceId = DrawableUtils .getDrawableResourceIdForMimeType(mimetype)
209216
217+ val animateGif = shouldAnimateGif(user, message, mimetype)
218+ val previewUrl = if (animateGif) {
219+ ApiUtils .getUrlForFileDownload(
220+ user.baseUrl!! ,
221+ user.userId!! ,
222+ message.fileParameters.path
223+ )
224+ } else {
225+ getPreviewImageUrl(user, message)
226+ }
227+
210228 return MessageTypeContent .Media (
211- previewUrl,
212- drawableResourceId
229+ previewUrl = previewUrl,
230+ drawableResourceId = drawableResourceId,
231+ mimeType = mimetype,
232+ animateGif = animateGif
213233 )
214234}
215235
236+ private fun shouldAnimateGif (user : User , message : ChatMessage , mimetype : String ): Boolean {
237+ val fileSize = message.fileParameters.size
238+ val spreedCapabilities = user.capabilities?.spreedCapability
239+ return MimetypeUtils .isGif(mimetype) &&
240+ fileSize != null &&
241+ message.fileParameters.path.isNotEmpty() &&
242+ spreedCapabilities != null &&
243+ fileSize <= CapabilitiesUtil .getMaxGifSize(spreedCapabilities) &&
244+ ! isReduceAnimationsEnabled()
245+ }
246+
247+ /* *
248+ * Returns true if the user has the accessibility option
249+ * for Remove/Reduce animations turned on
250+ */
251+ private fun isReduceAnimationsEnabled (): Boolean {
252+ val context = sharedApplication ? : return false
253+ return Settings .Global .getFloat(
254+ context.contentResolver,
255+ Settings .Global .ANIMATOR_DURATION_SCALE ,
256+ 1f
257+ ) == 0f
258+ }
259+
216260fun getPreviewImageUrl (user : User , message : ChatMessage ): String? {
217261 if (message.fileParameters.previewAvailable) {
218262 return ApiUtils .getUrlForFilePreviewWithFileId(
0 commit comments