diff --git a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/text/TopAppBarTitle.kt b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/text/TopAppBarTitle.kt index 09437d8038..4e64551e30 100644 --- a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/text/TopAppBarTitle.kt +++ b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/text/TopAppBarTitle.kt @@ -21,12 +21,18 @@ import androidx.compose.animation.AnimatedContent import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.togetherWith +import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.withStyle import ru.tech.imageresizershrinker.core.domain.utils.readableByteCount import ru.tech.imageresizershrinker.core.resources.R +import ru.tech.imageresizershrinker.core.ui.theme.Green +import ru.tech.imageresizershrinker.core.ui.theme.blend +import ru.tech.imageresizershrinker.core.ui.theme.takeColorFromScheme @Composable fun TopAppBarTitle( @@ -34,6 +40,7 @@ fun TopAppBarTitle( input: T?, isLoading: Boolean, size: Long?, + originalSize: Long? = null, updateOnSizeChange: Boolean = true ) { if (updateOnSizeChange) { @@ -55,12 +62,35 @@ fun TopAppBarTitle( Text(it) } } else { - Text( - stringResource( - R.string.size, - readableByteCount(size) + AnimatedContent(originalSize) { originalSize -> + val readableOriginal = readableByteCount(originalSize ?: 0) + val readableCompressed = readableByteCount(size) + val isSizesEqual = + size == originalSize || readableCompressed == readableOriginal + val color = takeColorFromScheme { + when { + isSizesEqual || originalSize == null -> onBackground + size > originalSize -> error.blend(errorContainer) + else -> Green + } + } + Text( + text = buildAnnotatedString { + append( + if (originalSize == null || isSizesEqual) { + stringResource(R.string.size, readableCompressed) + } else "" + ) + originalSize?.takeIf { !isSizesEqual }?.let { + append(readableOriginal) + append(" -> ") + withStyle(LocalTextStyle.current.toSpanStyle().copy(color)) { + append(readableCompressed) + } + } + } ) - ) + } } } } else { @@ -78,11 +108,32 @@ fun TopAppBarTitle( Text(it) } } else { + val readableOriginal = readableByteCount(originalSize ?: 0) + val readableCompressed = readableByteCount(size) + val isSizesEqual = + size == originalSize || readableCompressed == readableOriginal + val color = takeColorFromScheme { + when { + isSizesEqual || originalSize == null -> onBackground + size > originalSize -> error.blend(errorContainer) + else -> Green + } + } Text( - stringResource( - R.string.size, - readableByteCount(size) - ) + text = buildAnnotatedString { + append( + if (originalSize == null || isSizesEqual) { + stringResource(R.string.size, readableCompressed) + } else "" + ) + originalSize?.takeIf { !isSizesEqual }?.let { + append(readableOriginal) + append(" -> ") + withStyle(LocalTextStyle.current.toSpanStyle().copy(color)) { + append(readableCompressed) + } + } + } ) } } diff --git a/feature/format-conversion/src/main/java/ru/tech/imageresizershrinker/feature/format_conversion/presentation/FormatConversionContent.kt b/feature/format-conversion/src/main/java/ru/tech/imageresizershrinker/feature/format_conversion/presentation/FormatConversionContent.kt index a96eaca09c..8d9f8ce652 100644 --- a/feature/format-conversion/src/main/java/ru/tech/imageresizershrinker/feature/format_conversion/presentation/FormatConversionContent.kt +++ b/feature/format-conversion/src/main/java/ru/tech/imageresizershrinker/feature/format_conversion/presentation/FormatConversionContent.kt @@ -44,6 +44,7 @@ import com.t8rin.dynamic.theme.LocalDynamicThemeState import dev.olshevski.navigation.reimagined.hilt.hiltViewModel import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import ru.tech.imageresizershrinker.core.data.utils.fileSize import ru.tech.imageresizershrinker.core.domain.image.model.Preset import ru.tech.imageresizershrinker.core.resources.R import ru.tech.imageresizershrinker.core.settings.presentation.provider.LocalSettingsState @@ -189,7 +190,8 @@ fun FormatConversionContent( title = stringResource(R.string.format_conversion), input = viewModel.bitmap, isLoading = viewModel.isImageLoading, - size = viewModel.imageInfo.sizeInBytes.toLong() + size = viewModel.imageInfo.sizeInBytes.toLong(), + originalSize = viewModel.selectedUri?.fileSize(context) ) }, onGoBack = onBack, diff --git a/feature/resize-convert/src/main/java/ru/tech/imageresizershrinker/feature/resize_convert/presentation/ResizeAndConvertContent.kt b/feature/resize-convert/src/main/java/ru/tech/imageresizershrinker/feature/resize_convert/presentation/ResizeAndConvertContent.kt index 75f2735922..6369c69d29 100644 --- a/feature/resize-convert/src/main/java/ru/tech/imageresizershrinker/feature/resize_convert/presentation/ResizeAndConvertContent.kt +++ b/feature/resize-convert/src/main/java/ru/tech/imageresizershrinker/feature/resize_convert/presentation/ResizeAndConvertContent.kt @@ -50,6 +50,7 @@ import com.t8rin.dynamic.theme.LocalDynamicThemeState import dev.olshevski.navigation.reimagined.hilt.hiltViewModel import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import ru.tech.imageresizershrinker.core.data.utils.fileSize import ru.tech.imageresizershrinker.core.domain.image.model.Preset import ru.tech.imageresizershrinker.core.resources.R import ru.tech.imageresizershrinker.core.resources.icons.ImageReset @@ -209,7 +210,8 @@ fun ResizeAndConvertContent( title = stringResource(R.string.resize_and_convert), input = viewModel.bitmap, isLoading = viewModel.isImageLoading, - size = viewModel.imageInfo.sizeInBytes.toLong() + size = viewModel.imageInfo.sizeInBytes.toLong(), + originalSize = viewModel.selectedUri?.fileSize(context) ) }, onGoBack = onBack, diff --git a/feature/single-edit/src/main/java/ru/tech/imageresizershrinker/feature/single_edit/presentation/SingeEditScreen.kt b/feature/single-edit/src/main/java/ru/tech/imageresizershrinker/feature/single_edit/presentation/SingeEditScreen.kt index f25b60de72..e7e15ef6e4 100644 --- a/feature/single-edit/src/main/java/ru/tech/imageresizershrinker/feature/single_edit/presentation/SingeEditScreen.kt +++ b/feature/single-edit/src/main/java/ru/tech/imageresizershrinker/feature/single_edit/presentation/SingeEditScreen.kt @@ -43,6 +43,7 @@ import com.t8rin.dynamic.theme.LocalDynamicThemeState import dev.olshevski.navigation.reimagined.hilt.hiltViewModel import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import ru.tech.imageresizershrinker.core.data.utils.fileSize import ru.tech.imageresizershrinker.core.domain.image.model.Preset import ru.tech.imageresizershrinker.core.resources.R import ru.tech.imageresizershrinker.core.resources.icons.ImageReset @@ -206,13 +207,17 @@ fun SingleEditContent( var showDrawing by rememberSaveable { mutableStateOf(false) } var showEraseBackground by rememberSaveable { mutableStateOf(false) } + AdaptiveLayoutScreen( title = { + val originalSize = viewModel.uri.fileSize(context) ?: 0 + val compressedSize = viewModel.imageInfo.sizeInBytes.toLong() TopAppBarTitle( title = stringResource(R.string.single_edit), input = viewModel.bitmap, isLoading = viewModel.isImageLoading, - size = viewModel.imageInfo.sizeInBytes.toLong() + size = compressedSize, + originalSize = originalSize ) }, onGoBack = onBack,