|
7 | 7 |
|
8 | 8 | package com.nextcloud.talk.chat.ui.model |
9 | 9 |
|
| 10 | +import android.provider.Settings |
10 | 11 | import androidx.compose.runtime.Stable |
11 | 12 | import com.nextcloud.talk.R |
12 | 13 | import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication |
13 | 14 | import com.nextcloud.talk.chat.data.model.ChatMessage |
14 | 15 | import com.nextcloud.talk.data.database.model.SendStatus |
15 | 16 | import com.nextcloud.talk.data.user.model.User |
16 | 17 | import com.nextcloud.talk.utils.ApiUtils |
| 18 | +import com.nextcloud.talk.utils.CapabilitiesUtil |
17 | 19 | import com.nextcloud.talk.utils.DrawableUtils |
| 20 | +import com.nextcloud.talk.utils.MimetypeUtils |
18 | 21 | import com.nextcloud.talk.ui.PlaybackSpeed |
19 | 22 | import java.time.LocalDate |
20 | 23 |
|
@@ -54,7 +57,12 @@ sealed interface MessageTypeContent { |
54 | 57 |
|
55 | 58 | data class LinkPreview(val url: String) : MessageTypeContent |
56 | 59 |
|
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 |
58 | 66 |
|
59 | 67 | data class Geolocation(val id: String, val name: String, val lat: Double, val lon: Double) : MessageTypeContent |
60 | 68 |
|
@@ -203,16 +211,52 @@ fun getMessageTypeContent(user: User, message: ChatMessage): MessageTypeContent? |
203 | 211 | } |
204 | 212 |
|
205 | 213 | fun getMediaContent(user: User, message: ChatMessage): MessageTypeContent.Media { |
206 | | - val previewUrl = getPreviewImageUrl(user, message) |
207 | 214 | val mimetype = message.fileParameters.mimetype |
208 | 215 | val drawableResourceId = DrawableUtils.getDrawableResourceIdForMimeType(mimetype) |
209 | 216 |
|
| 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 | + |
210 | 228 | return MessageTypeContent.Media( |
211 | | - previewUrl, |
212 | | - drawableResourceId |
| 229 | + previewUrl = previewUrl, |
| 230 | + drawableResourceId = drawableResourceId, |
| 231 | + mimeType = mimetype, |
| 232 | + animateGif = animateGif |
213 | 233 | ) |
214 | 234 | } |
215 | 235 |
|
| 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 | + |
216 | 260 | fun getPreviewImageUrl(user: User, message: ChatMessage): String? { |
217 | 261 | if (message.fileParameters.previewAvailable) { |
218 | 262 | return ApiUtils.getUrlForFilePreviewWithFileId( |
|
0 commit comments