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 14f5c31d..0e6f004d 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 4209334e..ac606a73 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 b8a90892..3b6de437 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 59b2e4f3..ada19a1c 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 e9e5fdbe..8f0f8531 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 b9418a5b..f292dd7f 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,