diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/domain/service/fileopening/FileOpeningServiceImpl.kt b/app/src/main/kotlin/ee/ria/DigiDoc/domain/service/fileopening/FileOpeningServiceImpl.kt index d0c12627a..132ddc58e 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/domain/service/fileopening/FileOpeningServiceImpl.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/domain/service/fileopening/FileOpeningServiceImpl.kt @@ -29,11 +29,12 @@ import ee.ria.DigiDoc.common.Constant.DEFAULT_FILENAME import ee.ria.DigiDoc.utilsLib.file.FileUtil.getNameFromFileName import ee.ria.DigiDoc.utilsLib.file.FileUtil.normalizeUri import ee.ria.DigiDoc.utilsLib.file.FileUtil.sanitizeString +import ee.ria.DigiDoc.utilsLib.logging.LoggingUtil.Companion.debugLog import ee.ria.DigiDoc.utilsLib.logging.LoggingUtil.Companion.errorLog import java.io.File import java.io.FileNotFoundException +import java.io.IOException import java.io.InputStream -import java.io.OutputStream import javax.inject.Singleton @Singleton @@ -91,14 +92,28 @@ class FileOpeningServiceImpl : FileOpeningService { cursor?.close() - val inputStream: InputStream? = contentResolver.openInputStream(uri) + val uriInfo = "scheme: ${uri.scheme}, authority: ${uri.authority}" + debugLog(logTag, "Opening file: $uriInfo, name: $displayName") + + val inputStream: InputStream = + contentResolver.openInputStream(uri) + ?: run { + errorLog(logTag, "openInputStream returned null for $uriInfo, name: $displayName") + throw IOException("Cannot open input stream for URI: $uriInfo") + } val outputFile = File(context.cacheDir, displayName) - val outputStream: OutputStream = outputFile.outputStream() - inputStream?.use { input -> - outputStream.use { output -> - input.copyTo(output) + try { + inputStream.use { input -> + outputFile.outputStream().use { output -> + input.copyTo(output) + } } + debugLog(logTag, "File copied successfully - name: $displayName, size: ${outputFile.length()}") + } catch (e: Exception) { + errorLog(logTag, "Failed to copy file - $uriInfo name: $displayName", e) + outputFile.delete() + throw e } return outputFile diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/fragment/screen/EncryptRecipientScreen.kt b/app/src/main/kotlin/ee/ria/DigiDoc/fragment/screen/EncryptRecipientScreen.kt index cc4983633..191634bc9 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/fragment/screen/EncryptRecipientScreen.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/fragment/screen/EncryptRecipientScreen.kt @@ -126,7 +126,7 @@ fun EncryptRecipientScreen( val focusManager = LocalFocusManager.current - val cryptoContainer by sharedContainerViewModel.cryptoContainer.asFlow().collectAsState(null) + val cryptoContainer by sharedContainerViewModel.cryptoContainer.collectAsState() val showLoading = remember { mutableStateOf(false) } val isSettingsMenuBottomSheetVisible = rememberSaveable { mutableStateOf(false) } diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/CryptoFileOpeningNavigation.kt b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/CryptoFileOpeningNavigation.kt index 7478742ad..216919c95 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/CryptoFileOpeningNavigation.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/CryptoFileOpeningNavigation.kt @@ -62,7 +62,7 @@ fun CryptoFileOpeningNavigation( ) { val context = LocalContext.current - val cryptoContainer by sharedContainerViewModel.cryptoContainer.asFlow().collectAsState(null) + val cryptoContainer by sharedContainerViewModel.cryptoContainer.collectAsState() val externalFileUris by sharedContainerViewModel.externalFileUris.collectAsState() var isExternalFile by remember { mutableStateOf(false) } var fileUris by remember { mutableStateOf>(emptyList()) } diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/EncryptNavigation.kt b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/EncryptNavigation.kt index d01e1aa6c..67d1f2d6a 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/EncryptNavigation.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/EncryptNavigation.kt @@ -150,7 +150,7 @@ fun EncryptNavigation( encryptViewModel: EncryptViewModel = hiltViewModel(), encryptRecipientViewModel: EncryptRecipientViewModel = hiltViewModel(), ) { - val cryptoContainer by sharedContainerViewModel.cryptoContainer.asFlow().collectAsState(null) + val cryptoContainer by sharedContainerViewModel.cryptoContainer.collectAsState() val shouldResetContainer by encryptViewModel.shouldResetCryptoContainer.asFlow().collectAsState(false) val context = LocalContext.current @@ -503,7 +503,7 @@ fun EncryptNavigation( } LaunchedEffect(sharedContainerViewModel.decryptNFCStatus) { - sharedContainerViewModel.decryptNFCStatus.asFlow().collect { status -> + sharedContainerViewModel.decryptNFCStatus.collect { status -> status?.let { if (status == true) { withContext(Main) { @@ -523,7 +523,7 @@ fun EncryptNavigation( } LaunchedEffect(sharedContainerViewModel.decryptIDCardStatus) { - sharedContainerViewModel.decryptIDCardStatus.asFlow().collect { status -> + sharedContainerViewModel.decryptIDCardStatus.collect { status -> status?.let { if (status == true) { withContext(Main) { @@ -937,8 +937,9 @@ fun EncryptNavigation( onDismissButton = dismissRemoveFileDialog, onConfirmButton = { if ((cryptoContainer?.dataFiles?.size ?: 0) == 1) { - cryptoContainer?.file?.delete() + val containerFile = cryptoContainer?.file sharedContainerViewModel.resetCryptoContainer() + containerFile?.delete() handleBackButtonClick( navController, encryptViewModel, diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/FileOpeningNavigation.kt b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/FileOpeningNavigation.kt index 4f94098a9..f8218dba1 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/FileOpeningNavigation.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/FileOpeningNavigation.kt @@ -70,8 +70,8 @@ fun FileOpeningNavigation( val scope = rememberCoroutineScope() - val signedContainer by sharedContainerViewModel.signedContainer.asFlow().collectAsState(null) - val cryptoContainer by sharedContainerViewModel.cryptoContainer.asFlow().collectAsState(null) + val signedContainer by sharedContainerViewModel.signedContainer.collectAsState() + val cryptoContainer by sharedContainerViewModel.cryptoContainer.collectAsState() val externalFileUris by sharedContainerViewModel.externalFileUris.collectAsState() val showSivaDialog = rememberSaveable { mutableStateOf(false) } var isExternalFile by rememberSaveable { mutableStateOf(false) } diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/MobileIdView.kt b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/MobileIdView.kt index 6fc7d61dc..cc1b81294 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/MobileIdView.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/MobileIdView.kt @@ -118,7 +118,7 @@ fun MobileIdView( ) { val context = LocalContext.current val scope = rememberCoroutineScope() - val signedContainer by sharedContainerViewModel.signedContainer.asFlow().collectAsState(null) + val signedContainer by sharedContainerViewModel.signedContainer.collectAsState() val dialogError by mobileIdViewModel.dialogError.asFlow().collectAsState(0) val getSettingsAskRoleAndAddress = sharedSettingsViewModel.dataStore::getSettingsAskRoleAndAddress diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/NFCView.kt b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/NFCView.kt index 09d8e72cb..b6e4b4a66 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/NFCView.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/NFCView.kt @@ -161,8 +161,8 @@ fun NFCView( ) { val context = LocalContext.current val scope = rememberCoroutineScope() - val signedContainer by sharedContainerViewModel.signedContainer.asFlow().collectAsState(null) - val cryptoContainer by sharedContainerViewModel.cryptoContainer.asFlow().collectAsState(null) + val signedContainer by sharedContainerViewModel.signedContainer.collectAsState() + val cryptoContainer by sharedContainerViewModel.cryptoContainer.collectAsState() var nfcStatus by remember { mutableStateOf(nfcViewModel.getNFCStatus(activity)) } var nfcImage by remember { mutableIntStateOf(R.drawable.ic_icon_nfc) } diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/SigningNavigation.kt b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/SigningNavigation.kt index c01dc659f..c02f20212 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/SigningNavigation.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/SigningNavigation.kt @@ -161,7 +161,7 @@ fun SigningNavigation( signingViewModel: SigningViewModel = hiltViewModel(), encryptViewModel: EncryptViewModel = hiltViewModel(), ) { - val signedContainer by sharedContainerViewModel.signedContainer.asFlow().collectAsState(null) + val signedContainer by sharedContainerViewModel.signedContainer.collectAsState() val shouldResetContainer by signingViewModel.shouldResetSignedContainer.asFlow().collectAsState(false) val context = LocalContext.current @@ -193,7 +193,7 @@ fun SigningNavigation( var isSignaturesCountLoaded by remember { mutableStateOf(false) } - val isParentContainerSivaConfirmed = sharedContainerViewModel.isSivaConfirmed.value == true + val isParentContainerSivaConfirmed = sharedContainerViewModel.isSivaConfirmed.value var isSivaConfirmed by remember { mutableStateOf(isParentContainerSivaConfirmed) } var isTimestampedContainer by remember { mutableStateOf(false) } @@ -490,7 +490,7 @@ fun SigningNavigation( } LaunchedEffect(sharedContainerViewModel.signedMidStatus) { - sharedContainerViewModel.signedMidStatus.asFlow().collect { status -> + sharedContainerViewModel.signedMidStatus.collect { status -> status?.let { if (status == MobileCreateSignatureProcessStatus.OK) { signatures = signedContainer?.getSignatures() ?: emptyList() @@ -507,7 +507,7 @@ fun SigningNavigation( } LaunchedEffect(sharedContainerViewModel.signedSidStatus) { - sharedContainerViewModel.signedSidStatus.asFlow().collect { status -> + sharedContainerViewModel.signedSidStatus.collect { status -> status?.let { if (status == SessionStatusResponseProcessStatus.OK) { signatures = signedContainer?.getSignatures() ?: emptyList() @@ -524,7 +524,7 @@ fun SigningNavigation( } LaunchedEffect(sharedContainerViewModel.signedNFCStatus) { - sharedContainerViewModel.signedNFCStatus.asFlow().collect { status -> + sharedContainerViewModel.signedNFCStatus.collect { status -> status?.let { if (status == true) { signatures = signedContainer?.getSignatures() ?: emptyList() @@ -541,7 +541,7 @@ fun SigningNavigation( } LaunchedEffect(sharedContainerViewModel.signedIDCardStatus) { - sharedContainerViewModel.signedIDCardStatus.asFlow().collect { status -> + sharedContainerViewModel.signedIDCardStatus.collect { status -> status?.let { if (status == true) { signatures = signedContainer?.getSignatures() ?: emptyList() @@ -1096,9 +1096,10 @@ fun SigningNavigation( onDismissButton = dismissRemoveFileDialog, onConfirmButton = { if ((signedContainer?.rawContainer()?.dataFiles()?.size ?: 0) == 1) { - signedContainer?.getContainerFile()?.delete() + val containerFile = signedContainer?.getContainerFile() sharedContainerViewModel.resetSignedContainer() sharedContainerViewModel.resetContainerNotifications() + containerFile?.delete() handleBackButtonClick(navController, signingViewModel, sharedContainerViewModel) } else { scope.launch(IO) { @@ -1283,11 +1284,11 @@ fun SigningNavigation( onConfirmButton = { showContainerCloseConfirmationDialog.value = false val containerFile = signedContainer?.getContainerFile() + sharedContainerViewModel.resetSignedContainer() + sharedContainerViewModel.resetContainerNotifications() if (containerFile?.exists() == true) { containerFile.delete() } - sharedContainerViewModel.resetSignedContainer() - sharedContainerViewModel.resetContainerNotifications() handleBackButtonClick(navController, signingViewModel, sharedContainerViewModel) }, ) diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/SmartIdView.kt b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/SmartIdView.kt index 8e34c42d7..6e5f09f17 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/SmartIdView.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/SmartIdView.kt @@ -131,7 +131,7 @@ fun SmartIdView( ) { val context = LocalContext.current val scope = rememberCoroutineScope() - val signedContainer by sharedContainerViewModel.signedContainer.asFlow().collectAsState(null) + val signedContainer by sharedContainerViewModel.signedContainer.collectAsState() val dialogError by smartIdViewModel.dialogError.asFlow().collectAsState(0) val getSettingsAskRoleAndAddress = sharedSettingsViewModel.dataStore::getSettingsAskRoleAndAddress diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/shared/SharedContainerViewModel.kt b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/shared/SharedContainerViewModel.kt index 7cf5bad77..91e42d8ad 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/shared/SharedContainerViewModel.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/shared/SharedContainerViewModel.kt @@ -27,8 +27,6 @@ import android.net.Uri import android.os.Build import androidx.activity.result.ActivityResult import androidx.compose.runtime.mutableStateListOf -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.google.common.io.ByteStreams import dagger.hilt.android.lifecycle.HiltViewModel @@ -56,6 +54,7 @@ import ee.ria.DigiDoc.utilsLib.logging.LoggingUtil.Companion.errorLog import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow import java.io.File import java.io.FileInputStream import java.io.FileNotFoundException @@ -69,71 +68,71 @@ class SharedContainerViewModel @param:ApplicationContext private val context: Context, private val contentResolver: ContentResolver, ) : ViewModel() { - private val _signedContainer = MutableLiveData() - val signedContainer: LiveData = _signedContainer + private val _signedContainer = MutableStateFlow(null) + val signedContainer: StateFlow = _signedContainer.asStateFlow() - private val _cryptoContainer = MutableLiveData() - val cryptoContainer: LiveData = _cryptoContainer + private val _cryptoContainer = MutableStateFlow(null) + val cryptoContainer: StateFlow = _cryptoContainer.asStateFlow() private val _nestedContainers = mutableStateListOf() val nestedContainers: List get() = _nestedContainers - private val _signedMidStatus = MutableLiveData(null) - val signedMidStatus: LiveData = _signedMidStatus + private val _signedMidStatus = MutableStateFlow(null) + val signedMidStatus: StateFlow = _signedMidStatus.asStateFlow() - private val _signedSidStatus = MutableLiveData(null) - val signedSidStatus: LiveData = _signedSidStatus + private val _signedSidStatus = MutableStateFlow(null) + val signedSidStatus: StateFlow = _signedSidStatus.asStateFlow() - private val _signedNFCStatus = MutableLiveData(null) - val signedNFCStatus: LiveData = _signedNFCStatus + private val _signedNFCStatus = MutableStateFlow(null) + val signedNFCStatus: StateFlow = _signedNFCStatus.asStateFlow() - private val _signedIDCardStatus = MutableLiveData(null) - val signedIDCardStatus: LiveData = _signedIDCardStatus + private val _signedIDCardStatus = MutableStateFlow(null) + val signedIDCardStatus: StateFlow = _signedIDCardStatus.asStateFlow() - private val _decryptNFCStatus = MutableLiveData(null) - val decryptNFCStatus: LiveData = _decryptNFCStatus + private val _decryptNFCStatus = MutableStateFlow(null) + val decryptNFCStatus: StateFlow = _decryptNFCStatus.asStateFlow() - private val _decryptIDCardStatus = MutableLiveData(null) - val decryptIDCardStatus: LiveData = _decryptIDCardStatus + private val _decryptIDCardStatus = MutableStateFlow(null) + val decryptIDCardStatus: StateFlow = _decryptIDCardStatus.asStateFlow() private val _externalFileUris = MutableStateFlow>(listOf()) - val externalFileUris: StateFlow> = _externalFileUris + val externalFileUris: StateFlow> = _externalFileUris.asStateFlow() private val _containerNotifications = MutableStateFlow>(listOf()) - val containerNotifications: StateFlow> = _containerNotifications + val containerNotifications: StateFlow> = _containerNotifications.asStateFlow() - private val _isSivaConfirmed = MutableLiveData(true) - val isSivaConfirmed: LiveData = _isSivaConfirmed + private val _isSivaConfirmed = MutableStateFlow(true) + val isSivaConfirmed: StateFlow = _isSivaConfirmed.asStateFlow() private val _addedFilesCount = MutableStateFlow(0) - val addedFilesCount: StateFlow = _addedFilesCount + val addedFilesCount: StateFlow = _addedFilesCount.asStateFlow() fun setSignedSidStatus(signedStatus: SessionStatusResponseProcessStatus?) { - _signedSidStatus.postValue(signedStatus) + _signedSidStatus.value = signedStatus } fun setSignedMidStatus(signedStatus: MobileCreateSignatureProcessStatus?) { - _signedMidStatus.postValue(signedStatus) + _signedMidStatus.value = signedStatus } fun setSignedNFCStatus(signedStatus: Boolean?) { - _signedNFCStatus.postValue(signedStatus) + _signedNFCStatus.value = signedStatus } fun setDecryptNFCStatus(decryptStatus: Boolean?) { - _decryptNFCStatus.postValue(decryptStatus) + _decryptNFCStatus.value = decryptStatus } fun setSignedIDCardStatus(signedStatus: Boolean?) { - _signedIDCardStatus.postValue(signedStatus) + _signedIDCardStatus.value = signedStatus } fun setDecryptIDCardStatus(decryptStatus: Boolean?) { - _decryptIDCardStatus.postValue(decryptStatus) + _decryptIDCardStatus.value = decryptStatus } fun setSignedContainer(signedContainer: SignedContainer?) { - _signedContainer.postValue(signedContainer) + _signedContainer.value = signedContainer addNestedContainer(signedContainer) } @@ -141,7 +140,7 @@ class SharedContainerViewModel cryptoContainer: CryptoContainer?, overwriteContainer: Boolean = false, ) { - _cryptoContainer.postValue(cryptoContainer) + _cryptoContainer.value = cryptoContainer if (overwriteContainer) { removeLastContainer() } @@ -157,11 +156,11 @@ class SharedContainerViewModel } fun resetSignedContainer() { - _signedContainer.postValue(null) + _signedContainer.value = null } fun resetCryptoContainer() { - _cryptoContainer.postValue(null) + _cryptoContainer.value = null } fun removeLastContainer() { @@ -306,9 +305,9 @@ class SharedContainerViewModel dataFile: File?, ) { dataFile?.let { cryptoContainer?.removeDataFile(it) } - _cryptoContainer.postValue(null) + _cryptoContainer.value = null delay(100L) - _cryptoContainer.postValue(cryptoContainer) + _cryptoContainer.value = cryptoContainer } @Throws(Exception::class) @@ -317,9 +316,9 @@ class SharedContainerViewModel recipient: Addressee?, ) { recipient?.let { cryptoContainer?.removeRecipient(it) } - _cryptoContainer.postValue(null) + _cryptoContainer.value = null delay(100L) - _cryptoContainer.postValue(cryptoContainer) + _cryptoContainer.value = cryptoContainer } @Throws(Exception::class) @@ -343,9 +342,9 @@ class SharedContainerViewModel dataFile: DataFileInterface?, ) { dataFile?.let { signedContainer?.removeDataFile(it) } - _signedContainer.postValue(null) + _signedContainer.value = null delay(100L) - _signedContainer.postValue(signedContainer) + _signedContainer.value = signedContainer } @Throws(FileNotFoundException::class, IOException::class) @@ -370,9 +369,9 @@ class SharedContainerViewModel signature: SignatureInterface?, ) { signature?.let { signedContainer?.removeSignature(it) } - _signedContainer.postValue(null) + _signedContainer.value = null delay(100L) - _signedContainer.postValue(signedContainer) + _signedContainer.value = signedContainer } fun setContainerNotifications(notifications: List) { diff --git a/utils-lib/src/main/kotlin/ee/ria/DigiDoc/utilsLib/container/ContainerUtil.kt b/utils-lib/src/main/kotlin/ee/ria/DigiDoc/utilsLib/container/ContainerUtil.kt index 08d1ef4de..367912c27 100644 --- a/utils-lib/src/main/kotlin/ee/ria/DigiDoc/utilsLib/container/ContainerUtil.kt +++ b/utils-lib/src/main/kotlin/ee/ria/DigiDoc/utilsLib/container/ContainerUtil.kt @@ -42,6 +42,7 @@ import ee.ria.DigiDoc.common.model.FileOpeningMethod import ee.ria.DigiDoc.utilsLib.file.FileUtil import ee.ria.DigiDoc.utilsLib.file.FileUtil.getFileInDirectory import ee.ria.DigiDoc.utilsLib.logging.LoggingUtil.Companion.debugLog +import ee.ria.DigiDoc.utilsLib.logging.LoggingUtil.Companion.errorLog import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.withContext import org.apache.commons.io.FilenameUtils @@ -67,10 +68,21 @@ object ContainerUtil { file: File, ): File { val containerFile = generateSignatureContainerFile(context, file.name) - file.inputStream().use { inputStream -> - containerFile.outputStream().use { outputStream -> - inputStream.copyTo(outputStream) + debugLog( + LOG_TAG, + "Copying to signed_containers: src: ${file.name}, size: ${file.length()}, dst: ${containerFile.name}", + ) + try { + file.inputStream().use { inputStream -> + containerFile.outputStream().use { outputStream -> + inputStream.copyTo(outputStream) + } } + debugLog(LOG_TAG, "Container copy successful: ${containerFile.name}, size: ${containerFile.length()}") + } catch (e: Exception) { + errorLog(LOG_TAG, "Failed to copy to signed_containers: src: ${file.name}", e) + containerFile.delete() + throw e } return containerFile } diff --git a/utils-lib/src/main/kotlin/ee/ria/DigiDoc/utilsLib/extensions/FileExtensions.kt b/utils-lib/src/main/kotlin/ee/ria/DigiDoc/utilsLib/extensions/FileExtensions.kt index e2d6aed02..414f7c03c 100644 --- a/utils-lib/src/main/kotlin/ee/ria/DigiDoc/utilsLib/extensions/FileExtensions.kt +++ b/utils-lib/src/main/kotlin/ee/ria/DigiDoc/utilsLib/extensions/FileExtensions.kt @@ -22,6 +22,7 @@ package ee.ria.DigiDoc.utilsLib.extensions import android.content.Context +import android.util.Log import android.webkit.MimeTypeMap import com.tom_roush.pdfbox.android.PDFBoxResourceLoader import com.tom_roush.pdfbox.pdmodel.PDDocument @@ -53,6 +54,7 @@ private const val FILE_EXTENSIONS_LOG_TAG = "FileExtensions" fun File.isPDF(context: Context): Boolean = PDF_MIMETYPE == mimeType(context) || PDF_EXTENSION == extension fun File.isXades(context: Context): Boolean { + if (!exists()) return false val tempContainerFiles = File(context.filesDir, "tempContainerFiles") try { @@ -70,6 +72,7 @@ fun File.isXades(context: Context): Boolean { } fun File.isCades(context: Context): Boolean { + if (!exists()) return false val tempContainerFiles = File(context.filesDir, "tempContainerFiles") try { @@ -89,6 +92,13 @@ fun File.isCades(context: Context): Boolean { fun File.mimeType(context: Context): String { val extension = extension.lowercase() + if (!exists()) { + return MimeTypeMap + .getSingleton() + .getMimeTypeFromExtension(extension) + ?.takeIf { it.isNotEmpty() } ?: DEFAULT_MIME_TYPE + } + val tempContainerFiles = File(context.filesDir, "tempContainerFiles") try { checkIsZipFile(this) @@ -161,4 +171,4 @@ private fun checkIsZipFile(file: File) { .Builder() .setFile(file) .get() -} +} \ No newline at end of file