Skip to content

Commit 785f802

Browse files
committed
fix(mediaviewer): Decode full-screen images via Coil so SVG renders
BitmapShrinker decodes via ImageDecoder/BitmapFactory, which are raster-only and silently fail on SVG. Route through Coil's ImageLoader instead, which already has SvgDecoder registered. Assisted-by: Claude Code:claude-sonnet-5 Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
1 parent 84ef344 commit 785f802

1 file changed

Lines changed: 23 additions & 12 deletions

File tree

app/src/main/java/com/nextcloud/talk/mediaviewer/activities/MediaViewerScreen.kt

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77
package com.nextcloud.talk.mediaviewer.activities
88

9+
import android.graphics.drawable.Drawable
910
import android.util.Log
1011
import android.view.View
1112
import android.view.ViewGroup.MarginLayoutParams
@@ -74,18 +75,21 @@ import androidx.media3.exoplayer.ExoPlayer
7475
import androidx.media3.ui.DefaultTimeBar
7576
import androidx.media3.ui.PlayerView
7677
import coil.compose.AsyncImage
78+
import coil.imageLoader
79+
import coil.request.ImageRequest
80+
import coil.request.SuccessResult
7781
import com.github.chrisbanes.photoview.PhotoView
7882
import com.nextcloud.talk.R
7983
import com.nextcloud.talk.components.StandardAppBar
8084
import com.nextcloud.talk.mediaviewer.model.MediaViewerGroup
8185
import com.nextcloud.talk.mediaviewer.model.MediaViewerItem
8286
import com.nextcloud.talk.mediaviewer.viewmodels.MediaViewerViewModel
83-
import com.nextcloud.talk.utils.BitmapShrinker
8487
import com.nextcloud.talk.utils.DateConstants
8588
import com.nextcloud.talk.utils.DateUtils
8689
import com.nextcloud.talk.utils.DrawableUtils
8790
import com.nextcloud.talk.utils.Mimetype
8891
import com.nextcloud.talk.utils.MimetypeUtils
92+
import java.io.File
8993
import kotlinx.coroutines.launch
9094
import pl.droidsonroids.gif.GifDrawable
9195
import pl.droidsonroids.gif.GifImageView
@@ -348,26 +352,33 @@ private fun GifPage(localPath: String, onToggleControls: () -> Unit) {
348352

349353
@Composable
350354
private fun ImagePage(localPath: String, onToggleControls: () -> Unit) {
355+
val context = LocalContext.current
356+
var drawable by remember(localPath) { mutableStateOf<Drawable?>(null) }
357+
358+
LaunchedEffect(localPath) {
359+
val displayMetrics = context.resources.displayMetrics
360+
val request = ImageRequest.Builder(context)
361+
.data(File(localPath))
362+
.size(displayMetrics.widthPixels * 2, displayMetrics.heightPixels * 2)
363+
.build()
364+
val result = context.imageLoader.execute(request)
365+
if (result is SuccessResult) {
366+
drawable = result.drawable
367+
} else {
368+
Log.e(TAG, "image could not be decoded from path: $localPath")
369+
}
370+
}
371+
351372
AndroidView(
352373
factory = { ctx ->
353374
PhotoView(ctx).apply {
354375
maximumScale = MAX_SCALE
355376
mediumScale = MEDIUM_SCALE
356377
setOnPhotoTapListener { _, _, _ -> onToggleControls() }
357378
setOnOutsidePhotoTapListener { onToggleControls() }
358-
val displayMetrics = ctx.resources.displayMetrics
359-
val bitmap = BitmapShrinker.shrinkBitmap(
360-
localPath,
361-
displayMetrics.widthPixels * 2,
362-
displayMetrics.heightPixels * 2
363-
)
364-
if (bitmap != null) {
365-
setImageBitmap(bitmap)
366-
} else {
367-
Log.e(TAG, "bitmap could not be decoded from path: $localPath")
368-
}
369379
}
370380
},
381+
update = { photoView -> drawable?.let { photoView.setImageDrawable(it) } },
371382
modifier = Modifier.fillMaxSize()
372383
)
373384
}

0 commit comments

Comments
 (0)