Skip to content

Commit 3ca5b4e

Browse files
authored
Merge pull request #6080 from anakin78z/6061-gif-playback-broken
Auto play GIF media.
2 parents 0b3d1c8 + c559818 commit 3ca5b4e

3 files changed

Lines changed: 58 additions & 8 deletions

File tree

app/src/main/java/com/nextcloud/talk/chat/ui/model/ChatMessageUi.kt

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package com.nextcloud.talk.chat.ui.model
99

10+
import android.provider.Settings
1011
import androidx.compose.runtime.Stable
1112
import com.nextcloud.talk.R
1213
import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
@@ -15,7 +16,9 @@ import com.nextcloud.talk.data.database.model.SendStatus
1516
import com.nextcloud.talk.data.user.model.User
1617
import com.nextcloud.talk.ui.PlaybackSpeed
1718
import com.nextcloud.talk.utils.ApiUtils
19+
import com.nextcloud.talk.utils.CapabilitiesUtil
1820
import com.nextcloud.talk.utils.DrawableUtils
21+
import com.nextcloud.talk.utils.MimetypeUtils
1922
import 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

201209
fun 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+
212256
fun getPreviewImageUrl(user: User, message: ChatMessage): String? {
213257
if (message.fileParameters.previewAvailable) {
214258
return ApiUtils.getUrlForFilePreviewWithFileId(

app/src/main/java/com/nextcloud/talk/ui/chat/ChatMessageView.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,8 @@ private fun ChatMessageViewMediaPreview() {
234234
val uiMessage = createBaseMessage(
235235
MessageTypeContent.Media(
236236
previewUrl = null,
237-
drawableResourceId = R.drawable.ic_mimetype_image
237+
drawableResourceId = R.drawable.ic_mimetype_image,
238+
mimeType = ""
238239
)
239240
)
240241
ChatMessageView(message = uiMessage)
@@ -248,7 +249,8 @@ private fun ChatMessageViewMediaPreviewWithoutCaption() {
248249
val uiMessage = createBaseMessageWithoutCaption(
249250
MessageTypeContent.Media(
250251
previewUrl = null,
251-
drawableResourceId = R.drawable.ic_mimetype_image
252+
drawableResourceId = R.drawable.ic_mimetype_image,
253+
mimeType = ""
252254
)
253255
)
254256
ChatMessageView(message = uiMessage)

app/src/main/java/com/nextcloud/talk/ui/chat/MediaMessage.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import com.nextcloud.talk.R
3131
import com.nextcloud.talk.chat.ui.model.ChatMessageUi
3232
import com.nextcloud.talk.chat.ui.model.MessageTypeContent
3333
import com.nextcloud.talk.contacts.load
34+
import com.nextcloud.talk.utils.MimetypeUtils
3435

3536
private const val FILE_PLACEHOLDER_MESSAGE = "{file}"
3637

@@ -78,15 +79,18 @@ fun MediaMessage(
7879
Column {
7980
val context = LocalContext.current
8081
val resourceName = context.resources.getResourceEntryName(typeContent.drawableResourceId)
82+
val isGif = MimetypeUtils.isGif(typeContent.mimeType)
8183
val showPlayButton = !typeContent.previewUrl.isNullOrEmpty() &&
82-
(resourceName.contains("video") || resourceName.contains("audio"))
84+
(resourceName.contains("video") || resourceName.contains("audio") ||
85+
(isGif && !typeContent.animateGif))
8386

8487
Box(modifier = Modifier.fillMaxWidth()) {
8588
val loadedImage = remember(typeContent.previewUrl) {
8689
load(
8790
imageUri = typeContent.previewUrl,
8891
context = context,
89-
errorPlaceholderImage = typeContent.drawableResourceId
92+
errorPlaceholderImage = typeContent.drawableResourceId,
93+
animated = typeContent.animateGif
9094
)
9195
}
9296

0 commit comments

Comments
 (0)