Merge pull request #1162 from davotoula/bugfix-images-reported-saved-as-video

Bugfix: images reported saved as video
This commit is contained in:
Vitor Pamplona
2024-11-04 10:09:36 -05:00
committed by GitHub
@@ -29,7 +29,6 @@ import android.widget.FrameLayout
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut import androidx.compose.animation.fadeOut
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Arrangement.spacedBy import androidx.compose.foundation.layout.Arrangement.spacedBy
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
@@ -67,7 +66,6 @@ import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogProperties
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.core.view.ViewCompat
import coil3.compose.AsyncImage import coil3.compose.AsyncImage
import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.isGranted import com.google.accompanist.permissions.isGranted
@@ -104,8 +102,6 @@ fun ZoomableImageDialog(
onDismiss: () -> Unit, onDismiss: () -> Unit,
accountViewModel: AccountViewModel, accountViewModel: AccountViewModel,
) { ) {
val orientation = LocalConfiguration.current.orientation
Dialog( Dialog(
onDismissRequest = onDismiss, onDismissRequest = onDismiss,
properties = properties =
@@ -115,7 +111,6 @@ fun ZoomableImageDialog(
), ),
) { ) {
val view = LocalView.current val view = LocalView.current
val insets = ViewCompat.getRootWindowInsets(view)
val orientation = LocalConfiguration.current.orientation val orientation = LocalConfiguration.current.orientation
println("This Log only exists to force orientation listener $orientation") println("This Log only exists to force orientation listener $orientation")
@@ -151,7 +146,7 @@ fun ZoomableImageDialog(
} }
@Composable @Composable
@OptIn(ExperimentalFoundationApi::class, ExperimentalPermissionsApi::class) @OptIn(ExperimentalPermissionsApi::class)
private fun DialogContent( private fun DialogContent(
allImages: ImmutableList<BaseMediaContent>, allImages: ImmutableList<BaseMediaContent>,
imageUrl: BaseMediaContent, imageUrl: BaseMediaContent,
@@ -296,7 +291,7 @@ private fun saveMediaToGallery(
localContext: Context, localContext: Context,
accountViewModel: AccountViewModel, accountViewModel: AccountViewModel,
) { ) {
val isImage = content is MediaUrlImage && content is MediaLocalImage val isImage = content is MediaUrlImage || content is MediaLocalImage
val success = if (isImage) R.string.image_saved_to_the_gallery else R.string.video_saved_to_the_gallery val success = if (isImage) R.string.image_saved_to_the_gallery else R.string.video_saved_to_the_gallery
val failure = if (isImage) R.string.failed_to_save_the_image else R.string.failed_to_save_the_video val failure = if (isImage) R.string.failed_to_save_the_image else R.string.failed_to_save_the_video
@@ -329,8 +324,8 @@ private fun saveMediaToGallery(
onSuccess = { onSuccess = {
accountViewModel.toast(success, success) accountViewModel.toast(success, success)
}, },
onError = { onError = { innerIt ->
accountViewModel.toast(failure, null, it) accountViewModel.toast(failure, null, innerIt)
}, },
) )
} }
@@ -338,7 +333,6 @@ private fun saveMediaToGallery(
} }
@Composable @Composable
@OptIn(ExperimentalFoundationApi::class)
fun InlineCarrousel( fun InlineCarrousel(
allImages: ImmutableList<String>, allImages: ImmutableList<String>,
imageUrl: String, imageUrl: String,
@@ -385,7 +379,7 @@ private fun RenderImageOrVideo(
onToggleControllerVisibility: (() -> Unit)? = null, onToggleControllerVisibility: (() -> Unit)? = null,
accountViewModel: AccountViewModel, accountViewModel: AccountViewModel,
) { ) {
val automaticallyStartPlayback = remember { mutableStateOf<Boolean>(true) } val automaticallyStartPlayback = remember { mutableStateOf(true) }
val contentScale = val contentScale =
if (isFiniteHeight) { if (isFiniteHeight) {
ContentScale.Fit ContentScale.Fit
@@ -394,81 +388,41 @@ private fun RenderImageOrVideo(
} }
Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center, modifier = Modifier.fillMaxWidth()) { Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center, modifier = Modifier.fillMaxWidth()) {
if (content is MediaUrlImage) { when (content) {
val mainModifier = is MediaUrlImage -> {
Modifier val mainModifier =
.fillMaxWidth() Modifier
.zoomable( .fillMaxWidth()
rememberZoomState(), .zoomable(
onTap = { rememberZoomState(),
if (onToggleControllerVisibility != null) { onTap = {
onToggleControllerVisibility() if (onToggleControllerVisibility != null) {
} onToggleControllerVisibility()
}, }
) },
)
UrlImageView( UrlImageView(
content = content, content = content,
contentScale = contentScale, contentScale = contentScale,
mainImageModifier = mainModifier, mainImageModifier = mainModifier,
loadedImageModifier = Modifier.fillMaxWidth(), loadedImageModifier = Modifier.fillMaxWidth(),
controllerVisible = controllerVisible, controllerVisible = controllerVisible,
accountViewModel = accountViewModel, accountViewModel = accountViewModel,
alwayShowImage = true, alwayShowImage = true,
) )
} else if (content is MediaUrlVideo) { }
val borderModifier =
if (roundedCorner) {
MaterialTheme.colorScheme.imageModifier
} else {
Modifier.fillMaxWidth()
}
VideoViewInner( is MediaUrlVideo -> {
videoUri = content.url, val borderModifier =
mimeType = content.mimeType, if (roundedCorner) {
title = content.description, MaterialTheme.colorScheme.imageModifier
artworkUri = content.artworkUri, } else {
authorName = content.authorName, Modifier.fillMaxWidth()
borderModifier = borderModifier, }
isFiniteHeight = isFiniteHeight,
automaticallyStartPlayback = automaticallyStartPlayback,
onControllerVisibilityChanged = onControllerVisibilityChanged,
accountViewModel = accountViewModel,
)
} else if (content is MediaLocalImage) {
val mainModifier =
Modifier
.fillMaxWidth()
.zoomable(
rememberZoomState(),
onTap = {
if (onToggleControllerVisibility != null) {
onToggleControllerVisibility()
}
},
)
LocalImageView(
content = content,
contentScale = contentScale,
mainImageModifier = mainModifier,
loadedImageModifier = Modifier.fillMaxWidth(),
controllerVisible = controllerVisible,
accountViewModel = accountViewModel,
alwayShowImage = true,
)
} else if (content is MediaLocalVideo) {
val borderModifier =
if (roundedCorner) {
MaterialTheme.colorScheme.imageModifier
} else {
Modifier.fillMaxWidth()
}
content.localFile?.let {
VideoViewInner( VideoViewInner(
videoUri = it.toUri().toString(), videoUri = content.url,
mimeType = content.mimeType, mimeType = content.mimeType,
title = content.description, title = content.description,
artworkUri = content.artworkUri, artworkUri = content.artworkUri,
@@ -480,6 +434,54 @@ private fun RenderImageOrVideo(
accountViewModel = accountViewModel, accountViewModel = accountViewModel,
) )
} }
is MediaLocalImage -> {
val mainModifier =
Modifier
.fillMaxWidth()
.zoomable(
rememberZoomState(),
onTap = {
if (onToggleControllerVisibility != null) {
onToggleControllerVisibility()
}
},
)
LocalImageView(
content = content,
contentScale = contentScale,
mainImageModifier = mainModifier,
loadedImageModifier = Modifier.fillMaxWidth(),
controllerVisible = controllerVisible,
accountViewModel = accountViewModel,
alwayShowImage = true,
)
}
is MediaLocalVideo -> {
val borderModifier =
if (roundedCorner) {
MaterialTheme.colorScheme.imageModifier
} else {
Modifier.fillMaxWidth()
}
content.localFile?.let {
VideoViewInner(
videoUri = it.toUri().toString(),
mimeType = content.mimeType,
title = content.description,
artworkUri = content.artworkUri,
authorName = content.authorName,
borderModifier = borderModifier,
isFiniteHeight = isFiniteHeight,
automaticallyStartPlayback = automaticallyStartPlayback,
onControllerVisibilityChanged = onControllerVisibilityChanged,
accountViewModel = accountViewModel,
)
}
}
} }
} }
} }