From fefbc985e8b1f571ad3387de01d60589d344eb2a Mon Sep 17 00:00:00 2001 From: T8RIN Date: Fri, 3 May 2024 20:15:44 +0300 Subject: [PATCH] improve go back after saving --- .../gif_tools/presentation/GifToolsScreen.kt | 2 +- .../viewModel/GifToolsViewModel.kt | 13 ++++++++++-- .../jxl_tools/presentation/JxlToolsScreen.kt | 2 +- .../viewModel/JxlToolsViewModel.kt | 20 +++++++++++-------- .../pdf_tools/presentation/PdfToolsScreen.kt | 2 +- .../viewModel/PdfToolsViewModel.kt | 17 ++++++++++++---- 6 files changed, 39 insertions(+), 17 deletions(-) diff --git a/feature/gif-tools/src/main/java/ru/tech/imageresizershrinker/feature/gif_tools/presentation/GifToolsScreen.kt b/feature/gif-tools/src/main/java/ru/tech/imageresizershrinker/feature/gif_tools/presentation/GifToolsScreen.kt index 1db8ee7ab9..0e25ea5791 100644 --- a/feature/gif-tools/src/main/java/ru/tech/imageresizershrinker/feature/gif_tools/presentation/GifToolsScreen.kt +++ b/feature/gif-tools/src/main/java/ru/tech/imageresizershrinker/feature/gif_tools/presentation/GifToolsScreen.kt @@ -248,7 +248,7 @@ fun GifToolsScreen( var showExitDialog by rememberSaveable { mutableStateOf(false) } val onBack = { - if (viewModel.type != null) showExitDialog = true + if (viewModel.haveChanges) showExitDialog = true else onGoBack() } diff --git a/feature/gif-tools/src/main/java/ru/tech/imageresizershrinker/feature/gif_tools/presentation/viewModel/GifToolsViewModel.kt b/feature/gif-tools/src/main/java/ru/tech/imageresizershrinker/feature/gif_tools/presentation/viewModel/GifToolsViewModel.kt index 768acdc607..3ab7e4ab2d 100644 --- a/feature/gif-tools/src/main/java/ru/tech/imageresizershrinker/feature/gif_tools/presentation/viewModel/GifToolsViewModel.kt +++ b/feature/gif-tools/src/main/java/ru/tech/imageresizershrinker/feature/gif_tools/presentation/viewModel/GifToolsViewModel.kt @@ -43,6 +43,7 @@ import ru.tech.imageresizershrinker.core.domain.saving.model.FileSaveTarget import ru.tech.imageresizershrinker.core.domain.saving.model.ImageSaveTarget import ru.tech.imageresizershrinker.core.domain.saving.model.SaveResult import ru.tech.imageresizershrinker.core.domain.saving.model.SaveTarget +import ru.tech.imageresizershrinker.core.domain.saving.model.onSuccess import ru.tech.imageresizershrinker.core.domain.utils.smartJob import ru.tech.imageresizershrinker.core.ui.utils.BaseViewModel import ru.tech.imageresizershrinker.core.ui.utils.navigation.Screen @@ -163,10 +164,12 @@ class GifToolsViewModel @Inject constructor( savingJob?.cancel() savingJob = null updateParams(GifParams.Default) + registerChangesCleared() } fun updateGifFrames(imageFrames: ImageFrames) { _imageFrames.update { imageFrames } + registerChanges() } fun clearConvertedImagesSelection() = updateGifFrames(ImageFrames.ManualSelection(emptyList())) @@ -222,7 +225,7 @@ class GifToolsViewModel @Inject constructor( _left.value = gifFrames.getFramePositions(it).size } ).onCompletion { - onResult(results) + onResult(results.onSuccess(::registerSave)) }.collect { uri -> imageGetter.getImage( data = uri, @@ -302,7 +305,7 @@ class GifToolsViewModel @Inject constructor( _done.update { it + 1 } } - onResult(results) + onResult(results.onSuccess(::registerSave)) } null -> Unit @@ -348,6 +351,7 @@ class GifToolsViewModel @Inject constructor( _type.update { Screen.GifTools.Type.ImageToGif(uris) } + registerChanges() } } @@ -359,6 +363,7 @@ class GifToolsViewModel @Inject constructor( Screen.GifTools.Type.ImageToGif(newUris) } + registerChanges() } } @@ -372,11 +377,13 @@ class GifToolsViewModel @Inject constructor( Screen.GifTools.Type.ImageToGif(newUris) } + registerChanges() } } fun setImageFormat(imageFormat: ImageFormat) { _imageFormat.update { imageFormat } + registerChanges() } fun setQuality(quality: Quality) { @@ -385,6 +392,7 @@ class GifToolsViewModel @Inject constructor( fun updateParams(params: GifParams) { _params.update { params } + registerChanges() } fun performSharing(onComplete: () -> Unit) { @@ -461,6 +469,7 @@ class GifToolsViewModel @Inject constructor( _jxlQuality.update { (quality as? Quality.Jxl) ?: Quality.Jxl() } + registerChanges() } } \ No newline at end of file diff --git a/feature/jxl-tools/src/main/java/ru/tech/imageresizershrinker/feature/jxl_tools/presentation/JxlToolsScreen.kt b/feature/jxl-tools/src/main/java/ru/tech/imageresizershrinker/feature/jxl_tools/presentation/JxlToolsScreen.kt index bee228c7c4..6daea99e66 100644 --- a/feature/jxl-tools/src/main/java/ru/tech/imageresizershrinker/feature/jxl_tools/presentation/JxlToolsScreen.kt +++ b/feature/jxl-tools/src/main/java/ru/tech/imageresizershrinker/feature/jxl_tools/presentation/JxlToolsScreen.kt @@ -307,7 +307,7 @@ fun JxlToolsScreen( var showExitDialog by rememberSaveable { mutableStateOf(false) } val onBack = { - if (viewModel.type != null) showExitDialog = true + if (viewModel.haveChanges) showExitDialog = true else onGoBack() } diff --git a/feature/jxl-tools/src/main/java/ru/tech/imageresizershrinker/feature/jxl_tools/presentation/viewModel/JxlToolsViewModel.kt b/feature/jxl-tools/src/main/java/ru/tech/imageresizershrinker/feature/jxl_tools/presentation/viewModel/JxlToolsViewModel.kt index 2077dee6e2..b85131cfac 100644 --- a/feature/jxl-tools/src/main/java/ru/tech/imageresizershrinker/feature/jxl_tools/presentation/viewModel/JxlToolsViewModel.kt +++ b/feature/jxl-tools/src/main/java/ru/tech/imageresizershrinker/feature/jxl_tools/presentation/viewModel/JxlToolsViewModel.kt @@ -42,6 +42,7 @@ import ru.tech.imageresizershrinker.core.domain.saving.model.FileSaveTarget import ru.tech.imageresizershrinker.core.domain.saving.model.ImageSaveTarget import ru.tech.imageresizershrinker.core.domain.saving.model.SaveResult import ru.tech.imageresizershrinker.core.domain.saving.model.SaveTarget +import ru.tech.imageresizershrinker.core.domain.saving.model.onSuccess import ru.tech.imageresizershrinker.core.domain.utils.smartJob import ru.tech.imageresizershrinker.core.ui.utils.BaseViewModel import ru.tech.imageresizershrinker.core.ui.utils.navigation.Screen @@ -114,12 +115,11 @@ class JxlToolsViewModel @Inject constructor( else -> _type.update { type } } + registerChanges() if (_type.value == null) { clearAll() - } else { - if (!_type.value!!::class.isInstance(type)) { - clearAll() - } + } else if (!_type.value!!::class.isInstance(type)) { + clearAll() } } @@ -193,7 +193,7 @@ class JxlToolsViewModel @Inject constructor( _done.update { it + 1 } } - onResult(results) + onResult(results.onSuccess(::registerSave)) } is Screen.JxlTools.Type.JxlToJpeg -> { @@ -219,7 +219,7 @@ class JxlToolsViewModel @Inject constructor( _done.update { it + 1 } } - onResult(results) + onResult(results.onSuccess(::registerSave)) } is Screen.JxlTools.Type.JxlToImage -> { @@ -245,7 +245,7 @@ class JxlToolsViewModel @Inject constructor( _left.value = imageFrames.getFramePositions(it).size } ).onCompletion { - onResult(results) + onResult(results.onSuccess(::registerSave)) }.collect { uri -> imageGetter.getImage( data = uri, @@ -306,7 +306,7 @@ class JxlToolsViewModel @Inject constructor( saveTarget = JxlSaveTarget("", jxlBytes), keepOriginalMetadata = true, oneTimeSaveLocationUri = oneTimeSaveLocationUri - ) + ).onSuccess(::registerSave) onResult(listOf(result)) } } @@ -479,6 +479,7 @@ class JxlToolsViewModel @Inject constructor( savingJob?.cancel() savingJob = null updateParams(AnimatedJxlParams.Default) + registerChangesCleared() } fun removeUri(uri: Uri) { @@ -495,14 +496,17 @@ class JxlToolsViewModel @Inject constructor( fun setImageFormat(imageFormat: ImageFormat) { _imageFormat.update { imageFormat } + registerChanges() } fun updateJxlFrames(imageFrames: ImageFrames) { _imageFrames.update { imageFrames } + registerChanges() } fun updateParams(params: AnimatedJxlParams) { _params.update { params } + registerChanges() } fun clearConvertedImagesSelection() = updateJxlFrames(ImageFrames.ManualSelection(emptyList())) diff --git a/feature/pdf-tools/src/main/java/ru/tech/imageresizershrinker/feature/pdf_tools/presentation/PdfToolsScreen.kt b/feature/pdf-tools/src/main/java/ru/tech/imageresizershrinker/feature/pdf_tools/presentation/PdfToolsScreen.kt index 3437ebebe6..b535301be0 100644 --- a/feature/pdf-tools/src/main/java/ru/tech/imageresizershrinker/feature/pdf_tools/presentation/PdfToolsScreen.kt +++ b/feature/pdf-tools/src/main/java/ru/tech/imageresizershrinker/feature/pdf_tools/presentation/PdfToolsScreen.kt @@ -188,7 +188,7 @@ fun PdfToolsScreen( val onBack = { if (type is Screen.PdfTools.Type.Preview) onGoBack() else { - if (!viewModel.canGoBack()) showExitDialog = true + if (viewModel.haveChanges) showExitDialog = true else if (viewModel.pdfType != null) { viewModel.clearType() } else onGoBack() diff --git a/feature/pdf-tools/src/main/java/ru/tech/imageresizershrinker/feature/pdf_tools/presentation/viewModel/PdfToolsViewModel.kt b/feature/pdf-tools/src/main/java/ru/tech/imageresizershrinker/feature/pdf_tools/presentation/viewModel/PdfToolsViewModel.kt index 1b94d660ed..ab202da3b1 100644 --- a/feature/pdf-tools/src/main/java/ru/tech/imageresizershrinker/feature/pdf_tools/presentation/viewModel/PdfToolsViewModel.kt +++ b/feature/pdf-tools/src/main/java/ru/tech/imageresizershrinker/feature/pdf_tools/presentation/viewModel/PdfToolsViewModel.kt @@ -37,6 +37,7 @@ import ru.tech.imageresizershrinker.core.domain.image.model.Quality import ru.tech.imageresizershrinker.core.domain.saving.FileController import ru.tech.imageresizershrinker.core.domain.saving.model.ImageSaveTarget import ru.tech.imageresizershrinker.core.domain.saving.model.SaveResult +import ru.tech.imageresizershrinker.core.domain.saving.model.onSuccess import ru.tech.imageresizershrinker.core.domain.utils.smartJob import ru.tech.imageresizershrinker.core.ui.utils.BaseViewModel import ru.tech.imageresizershrinker.core.ui.utils.navigation.Screen @@ -119,9 +120,8 @@ class PdfToolsViewModel @Inject constructor( _isSaving.value = false } - fun canGoBack(): Boolean { - return _byteArray.value == null && _imageInfo.value == ImageInfo() - } + override val haveChanges: Boolean + get() = super.haveChanges || _byteArray.value != null fun setType(type: Screen.PdfTools.Type) { when (type) { @@ -129,6 +129,7 @@ class PdfToolsViewModel @Inject constructor( is Screen.PdfTools.Type.PdfToImages -> setPdfToImagesUri(type.pdfUri) is Screen.PdfTools.Type.Preview -> setPdfPreview(type.pdfUri) } + registerChanges() resetCalculatedData() } @@ -187,6 +188,7 @@ class PdfToolsViewModel @Inject constructor( _showOOMWarning.value = false _imageInfo.value = ImageInfo() resetCalculatedData() + registerChangesCleared() } private val _done: MutableState = mutableIntStateOf(0) @@ -239,7 +241,7 @@ class PdfToolsViewModel @Inject constructor( }, onComplete = { _isSaving.value = false - onComplete(results) + onComplete(results.onSuccess(::registerSave)) } ) } @@ -358,6 +360,7 @@ class PdfToolsViewModel @Inject constructor( _imagesToPdfState.update { it?.plus(uris)?.toSet()?.toList() } + registerChanges() } fun removeImageToPdfAt(index: Int) { @@ -365,15 +368,18 @@ class PdfToolsViewModel @Inject constructor( _imagesToPdfState.update { it?.toMutableList()?.apply { removeAt(index) } } + registerChanges() } } fun reorderImagesToPdf(uris: List?) { _imagesToPdfState.update { uris } + registerChanges() } fun toggleScaleSmallImagesToLarge() { _scaleSmallImagesToLarge.update { !it } + registerChanges() } private var presetSelectionJob: Job? by smartJob() @@ -393,6 +399,7 @@ class PdfToolsViewModel @Inject constructor( } }.getOrNull() ?: _showOOMWarning.update { false } } + registerChanges() } fun selectPreset(preset: Preset.Percentage) { @@ -422,12 +429,14 @@ class PdfToolsViewModel @Inject constructor( _imageInfo.update { it.copy(imageFormat = imageFormat) } + registerChanges() } fun setQuality(quality: Quality) { _imageInfo.update { it.copy(quality = quality) } + registerChanges() } } \ No newline at end of file