From 34536a91905eb3642bd78a7075487e085b4ac477 Mon Sep 17 00:00:00 2001 From: Marten Rebane Date: Tue, 30 Jun 2026 15:28:36 +0300 Subject: [PATCH] Show file added message only with new containers --- .../viewmodel/FileOpeningViewModelTest.kt | 41 ++++++++++++++++++- .../viewmodel/CryptoFileOpeningViewModel.kt | 6 ++- .../DigiDoc/viewmodel/FileOpeningViewModel.kt | 8 +++- .../DigiDoc/cryptolib/CryptoContainerTest.kt | 25 +++++++++++ .../ria/DigiDoc/cryptolib/CryptoContainer.kt | 5 +++ .../libdigidoclib/SignedContainerTest.kt | 8 ++++ 6 files changed, 90 insertions(+), 3 deletions(-) diff --git a/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/FileOpeningViewModelTest.kt b/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/FileOpeningViewModelTest.kt index 14f5c31db..0e6f004d7 100644 --- a/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/FileOpeningViewModelTest.kt +++ b/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/FileOpeningViewModelTest.kt @@ -75,6 +75,7 @@ import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.atLeastOnce import org.mockito.Mockito.mock +import org.mockito.Mockito.never import org.mockito.Mockito.verify import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations @@ -490,6 +491,44 @@ class FileOpeningViewModelTest { verify(signedContainerObserver, atLeastOnce()).onChanged(signedContainer) } + @Test + fun fileOpeningViewModel_handleFiles_openExistingSignedContainer_doesNotEmitFileAdded() = + runTest { + val uri: Uri = mock() + val uris = listOf(uri) + val containerFile = + getResourceFileAsFile(context, "example.asice", ee.ria.DigiDoc.common.R.raw.example) + val isSivaConfirmed = true + + val signedContainer = + runBlocking { + SignedContainer.openOrCreate(context, containerFile, listOf(containerFile), isSivaConfirmed) + } + + `when`( + fileOpeningRepository.uriToFile(context, contentResolver, uri), + ).thenReturn(containerFile) + `when`( + fileOpeningRepository.openOrCreateContainer( + context, + contentResolver, + uris, + isSivaConfirmed, + ), + ).thenReturn(signedContainer) + `when`(sivaRepository.isTimestampedContainer(signedContainer)).thenReturn(false) + + viewModel.handleFiles( + context, + uris, + isSivaConfirmed = isSivaConfirmed, + fileOpeningMethod = FileOpeningMethod.ALL, + ) + + verify(filesAddedObserver, never()).onChanged(listOf(containerFile)) + verify(signedContainerObserver, atLeastOnce()).onChanged(signedContainer) + } + @Test fun fileOpeningViewModel_handleFiles_cryptoFileSuccess() = runTest { @@ -528,7 +567,7 @@ class FileOpeningViewModelTest { fileOpeningMethod = FileOpeningMethod.ALL, ) - verify(filesAddedObserver, atLeastOnce()).onChanged(listOf(file)) + verify(filesAddedObserver, never()).onChanged(listOf(file)) verify(cryptoContainerObserver, atLeastOnce()).onChanged(cryptoContainer) } diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/CryptoFileOpeningViewModel.kt b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/CryptoFileOpeningViewModel.kt index 4209334ef..ac606a730 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/CryptoFileOpeningViewModel.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/CryptoFileOpeningViewModel.kt @@ -160,6 +160,8 @@ class CryptoFileOpeningViewModel } } else { try { + val files = urisToFile(context, contentResolver, uris) + val cryptoContainer = fileOpeningRepository.openOrCreateCryptoContainer( context, @@ -169,7 +171,9 @@ class CryptoFileOpeningViewModel _cryptoContainer.postValue(cryptoContainer) - _filesAdded.postValue(urisToFile(context, contentResolver, uris)) + if (!cryptoContainer.isExistingContainer) { + _filesAdded.postValue(files) + } } catch (e: Exception) { _cryptoContainer.postValue(null) _launchFilePicker.postValue(false) diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/FileOpeningViewModel.kt b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/FileOpeningViewModel.kt index b8a908928..3b6de437b 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/FileOpeningViewModel.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/FileOpeningViewModel.kt @@ -206,6 +206,8 @@ class FileOpeningViewModel uris.size == 1 && file.isCryptoContainer() } == true + val opensExistingContainer: Boolean + if ((fileOpeningMethod == FileOpeningMethod.ALL || isExternalFile) && isCdoc) { val cryptoContainer = fileOpeningRepository.openOrCreateCryptoContainer( @@ -215,6 +217,7 @@ class FileOpeningViewModel ) _cryptoContainer.postValue(cryptoContainer) + opensExistingContainer = cryptoContainer.isExistingContainer } else { val signedContainer = fileOpeningRepository.openOrCreateContainer( @@ -242,9 +245,12 @@ class FileOpeningViewModel } else { _signedContainer.postValue(signedContainer) } + opensExistingContainer = signedContainer.isExistingContainer() } - _filesAdded.postValue(urisToFile(context, contentResolver, uris)) + if (!opensExistingContainer) { + _filesAdded.postValue(files) + } } catch (e: Exception) { _signedContainer.postValue(null) _launchFilePicker.postValue(false) diff --git a/crypto-lib/src/androidTest/kotlin/ee/ria/DigiDoc/cryptolib/CryptoContainerTest.kt b/crypto-lib/src/androidTest/kotlin/ee/ria/DigiDoc/cryptolib/CryptoContainerTest.kt index 59b2e4f3c..ada19a1cb 100644 --- a/crypto-lib/src/androidTest/kotlin/ee/ria/DigiDoc/cryptolib/CryptoContainerTest.kt +++ b/crypto-lib/src/androidTest/kotlin/ee/ria/DigiDoc/cryptolib/CryptoContainerTest.kt @@ -63,6 +63,7 @@ import kotlinx.coroutines.test.runTest import org.apache.commons.io.FileUtils import org.junit.After import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse import org.junit.Assert.assertNotNull import org.junit.Assert.assertTrue import org.junit.Assume.assumeTrue @@ -1281,6 +1282,30 @@ class CryptoContainerTest { } @Suppress("SameParameterValue") + @Test + fun cryptoContainer_isExistingContainer_trueForExistingCdoc() = + runTest { + val cryptoContainer = openOrCreate(context, containerCDOC1, listOf(containerCDOC1), cdoc2Settings) + + assertTrue(cryptoContainer.isExistingContainer) + } + + @Test + fun cryptoContainer_isExistingContainer_falseForPlainFile() = + runTest { + val cryptoContainer = openOrCreate(context, testFile, listOf(testFile), cdoc2Settings) + + assertFalse(cryptoContainer.isExistingContainer) + } + + @Test + fun cryptoContainer_isExistingContainer_falseWhenForced() = + runTest { + val cryptoContainer = openOrCreate(context, containerCDOC1, listOf(containerCDOC1), cdoc2Settings, true) + + assertFalse(cryptoContainer.isExistingContainer) + } + private fun createTempFileWithStringContent( filename: String, content: String, diff --git a/crypto-lib/src/main/kotlin/ee/ria/DigiDoc/cryptolib/CryptoContainer.kt b/crypto-lib/src/main/kotlin/ee/ria/DigiDoc/cryptolib/CryptoContainer.kt index e9e5fdbe1..8f0f85312 100644 --- a/crypto-lib/src/main/kotlin/ee/ria/DigiDoc/cryptolib/CryptoContainer.kt +++ b/crypto-lib/src/main/kotlin/ee/ria/DigiDoc/cryptolib/CryptoContainer.kt @@ -81,6 +81,7 @@ class CryptoContainer val recipients: ArrayList, val decrypted: Boolean, val encrypted: Boolean, + val isExistingContainer: Boolean = false, ) : Container { fun containerMimetype(): String = CONTAINER_MIME_TYPE @@ -225,6 +226,7 @@ class CryptoContainer recipients, decrypted = false, encrypted = true, + isExistingContainer = true, ) } @@ -261,6 +263,7 @@ class CryptoContainer recipients, decrypted = false, encrypted = true, + isExistingContainer = true, ) } @@ -433,6 +436,7 @@ class CryptoContainer recipients: List, decrypted: Boolean, encrypted: Boolean, + isExistingContainer: Boolean = false, ): CryptoContainer = CryptoContainer( context, @@ -441,6 +445,7 @@ class CryptoContainer ArrayList(recipients), decrypted, encrypted, + isExistingContainer, ) @Throws(Exception::class) diff --git a/libdigidoc-lib/src/androidTest/kotlin/ee/ria/DigiDoc/libdigidoclib/SignedContainerTest.kt b/libdigidoc-lib/src/androidTest/kotlin/ee/ria/DigiDoc/libdigidoclib/SignedContainerTest.kt index b9418a5b4..f292dd7f7 100644 --- a/libdigidoc-lib/src/androidTest/kotlin/ee/ria/DigiDoc/libdigidoclib/SignedContainerTest.kt +++ b/libdigidoc-lib/src/androidTest/kotlin/ee/ria/DigiDoc/libdigidoclib/SignedContainerTest.kt @@ -717,6 +717,14 @@ class SignedContainerTest { assertTrue(pdfContainer.getName().endsWith("pdf")) } + @Test + fun signedContainer_isExistingContainer_trueForSignedPdf() = + runTest { + val signedContainer = openOrCreate(context, signedPdfDocument, listOf(signedPdfDocument), true) + + assertTrue(signedContainer.isExistingContainer()) + } + @Suppress("SameParameterValue") private fun createTempFileWithStringContent( filename: String,