diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/fragment/screen/DiagnosticsScreen.kt b/app/src/main/kotlin/ee/ria/DigiDoc/fragment/screen/DiagnosticsScreen.kt index 853db5ca6..80fbf0b29 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/fragment/screen/DiagnosticsScreen.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/fragment/screen/DiagnosticsScreen.kt @@ -124,7 +124,7 @@ fun DiagnosticsScreen( var enableOneTimeLogGeneration by remember { mutableStateOf(diagnosticsViewModel.dataStore.getIsLogFileGenerationEnabled()) } - val openRestartConfirmationDialog = remember { mutableStateOf(false) } + val openRestartConfirmationDialog = rememberSaveable { mutableStateOf(false) } val settingValueChanged = stringResource(id = R.string.setting_value_changed) val settingValueChangeCancelled = stringResource(id = R.string.setting_value_change_cancelled) 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 87eac51ac..fd0cf6cb8 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 @@ -150,9 +150,9 @@ fun EncryptRecipientScreen( ) } val showRecipientBottomSheet = remember { mutableStateOf(false) } - var actionRecipient by remember { mutableStateOf(null) } - val clickedRecipient = remember { mutableStateOf(null) } - val openRemoveRecipientDialog = remember { mutableStateOf(false) } + var actionRecipient by rememberSaveable { mutableStateOf(null) } + val clickedRecipient = rememberSaveable { mutableStateOf(null) } + val openRemoveRecipientDialog = rememberSaveable { mutableStateOf(false) } val recipientRemoved = stringResource(id = R.string.recipient_removed) val recipientRemovalCancelled = stringResource(id = R.string.recipient_removal_cancelled) diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/fragment/screen/HomeScreen.kt b/app/src/main/kotlin/ee/ria/DigiDoc/fragment/screen/HomeScreen.kt index 9e6045f32..381b2523a 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/fragment/screen/HomeScreen.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/fragment/screen/HomeScreen.kt @@ -98,7 +98,7 @@ fun HomeScreen( homeViewModel: HomeViewModel = hiltViewModel(), ) { val activity = LocalActivity.current - val openCrashDetectorDialog = remember { mutableStateOf(false) } + val openCrashDetectorDialog = rememberSaveable { mutableStateOf(false) } val hasUnsentReports by homeViewModel.hasUnsentReports.asFlow().collectAsState(Tasks.forResult(false)) val isMainMenuBottomSheetVisible = rememberSaveable { mutableStateOf(false) } diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/fragment/screen/RecentDocumentsScreen.kt b/app/src/main/kotlin/ee/ria/DigiDoc/fragment/screen/RecentDocumentsScreen.kt index d637cf6d3..4cca80e1c 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/fragment/screen/RecentDocumentsScreen.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/fragment/screen/RecentDocumentsScreen.kt @@ -132,9 +132,9 @@ fun RecentDocumentsScreen( val messages by SnackBarManager.messages.collectAsState(emptyList()) - val showLoading = remember { mutableStateOf(false) } - val showSivaDialog = remember { mutableStateOf(false) } - val selectedDocument = remember { mutableStateOf(null) } + val showLoading = rememberSaveable { mutableStateOf(false) } + val showSivaDialog = rememberSaveable { mutableStateOf(false) } + val selectedDocument = rememberSaveable { mutableStateOf(null) } val isSettingsMenuBottomSheetVisible = rememberSaveable { mutableStateOf(false) } val handleResult: (Boolean) -> Unit = { confirmed -> @@ -164,13 +164,13 @@ fun RecentDocumentsScreen( } val recentDocumentList = - remember { + rememberSaveable { mutableStateOf( recentDocumentsViewModel.getRecentDocumentList(fileOpeningMethod), ) } - var actionDocument by remember { mutableStateOf(null) } - val openRemoveDocumentDialog = remember { mutableStateOf(false) } + var actionDocument by rememberSaveable { mutableStateOf(null) } + val openRemoveDocumentDialog = rememberSaveable { mutableStateOf(false) } val documentRemoved = stringResource(id = R.string.document_removed) val documentRemovalCancelled = stringResource(id = R.string.document_removal_cancelled) 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 4518ab7b2..94ba83bc2 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 @@ -264,13 +264,13 @@ fun EncryptNavigation( val listState = rememberLazyListState() - val showContainerCloseConfirmationDialog = remember { mutableStateOf(false) } + val showContainerCloseConfirmationDialog = rememberSaveable { mutableStateOf(false) } val showContainerBottomSheet = remember { mutableStateOf(false) } val showDataFileBottomSheet = remember { mutableStateOf(false) } val showRecipientBottomSheet = remember { mutableStateOf(false) } - val showSivaDialog = remember { mutableStateOf(false) } + val showSivaDialog = rememberSaveable { mutableStateOf(false) } val nestedFile = rememberSaveable { mutableStateOf(null) } val openNestedContainer: (nestedContainer: File, isSivaConfirmed: Boolean) -> Unit = diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/myeid/pinandcertificate/MyEidPinAndCertificateView.kt b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/myeid/pinandcertificate/MyEidPinAndCertificateView.kt index b282a26d9..6fa75cf17 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/myeid/pinandcertificate/MyEidPinAndCertificateView.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/myeid/pinandcertificate/MyEidPinAndCertificateView.kt @@ -26,10 +26,7 @@ import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.focusable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.ExperimentalLayoutApi -import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -71,7 +68,7 @@ import ee.ria.DigiDoc.ui.theme.RIADigiDocTheme import ee.ria.DigiDoc.utils.extensions.notAccessible import java.time.LocalDate -@OptIn(ExperimentalComposeUiApi::class, ExperimentalLayoutApi::class) +@OptIn(ExperimentalComposeUiApi::class) @Composable fun MyEidPinAndCertificateView( modifier: Modifier = Modifier, @@ -173,19 +170,19 @@ fun MyEidPinAndCertificateView( } if (showForgotPin && forgotPinText.isNotBlank() && onForgotPinClick != null) { - FlowRow( + Row( modifier = modifier - .padding(SPadding), - verticalArrangement = Arrangement.spacedBy(XSPadding), - horizontalArrangement = Arrangement.Center, + .padding(SPadding) + .fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(XSPadding), + verticalAlignment = Alignment.CenterVertically, ) { OutlinedButton( enabled = !isPukBlocked, onClick = onForgotPinClick, modifier = modifier - .align(Alignment.CenterVertically) .weight(1f) .semantics { testTagsAsResourceId = true @@ -211,12 +208,15 @@ fun MyEidPinAndCertificateView( ) } - Spacer(modifier = modifier.size(XSPadding)) - Button( enabled = !isPinBlocked, onClick = onChangePinClick ?: {}, - modifier = modifier.align(Alignment.CenterVertically), + modifier = + modifier + .weight(1f) + .semantics { + testTagsAsResourceId = true + }.testTag("myEidPinAndCertificateChangePinButton"), colors = ButtonDefaults.buttonColors( containerColor = MaterialTheme.colorScheme.primary, @@ -231,9 +231,10 @@ fun MyEidPinAndCertificateView( .semantics { this.contentDescription = changePinText.lowercase() testTagsAsResourceId = true - }.testTag("myEidPinAndCertificateChangePinButton"), + }.testTag("myEidPinAndCertificateChangePinButtonText"), text = changePinText, style = MaterialTheme.typography.labelLarge, + textAlign = TextAlign.Center, ) } } 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 7b11fb552..61a8d3e3b 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 @@ -33,6 +33,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -79,9 +80,9 @@ fun FileOpeningNavigation( val signedContainer by sharedContainerViewModel.signedContainer.asFlow().collectAsState(null) val cryptoContainer by sharedContainerViewModel.cryptoContainer.asFlow().collectAsState(null) val externalFileUris by sharedContainerViewModel.externalFileUris.collectAsState() - val showSivaDialog = remember { mutableStateOf(false) } - var isExternalFile by remember { mutableStateOf(false) } - var fileUris by remember { mutableStateOf>(emptyList()) } + val showSivaDialog = rememberSaveable { mutableStateOf(false) } + var isExternalFile by rememberSaveable { mutableStateOf(false) } + var fileUris by rememberSaveable { mutableStateOf>(emptyList()) } val handleSivaConfirmation: () -> Unit = { showSivaDialog.value = false 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 76ca5ce83..b262ff2df 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 @@ -26,6 +26,7 @@ import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent import android.content.res.Configuration +import android.util.Log import android.widget.Toast import androidx.activity.compose.BackHandler import androidx.activity.compose.rememberLauncherForActivityResult @@ -172,8 +173,8 @@ fun SigningNavigation( val isSettingsMenuBottomSheetVisible = rememberSaveable { mutableStateOf(false) } - val clickedDataFile = remember { mutableStateOf(null) } - val clickedSignature = remember { mutableStateOf(null) } + val clickedDataFile = rememberSaveable { mutableStateOf(null) } + val clickedSignature = rememberSaveable { mutableStateOf(null) } val signatureAddedSuccess = remember { mutableStateOf(false) } val signatureAddedSuccessText = stringResource(id = R.string.signature_update_signature_add_success) @@ -206,7 +207,7 @@ fun SigningNavigation( val invalidSignaturesText = pluralStringResource(id = R.plurals.signatures_invalid, count = invalidSignaturesCount, invalidSignaturesCount) - val showLoadingScreen = remember { mutableStateOf(false) } + val showLoadingScreen = rememberSaveable { mutableStateOf(false) } val openRemoveFileDialog = rememberSaveable { mutableStateOf(false) } val fileRemoved = stringResource(id = R.string.document_removed) @@ -280,27 +281,27 @@ fun SigningNavigation( } var signatures by remember { mutableStateOf>(emptyList()) } - val showSignaturesLoadingIndicator = remember { mutableStateOf(false) } + val showSignaturesLoadingIndicator = rememberSaveable { mutableStateOf(false) } val signaturesLoading = stringResource(id = R.string.signatures_loading) val signaturesLoaded = stringResource(id = R.string.signatures_loaded) var dataFiles by remember { mutableStateOf>(emptyList()) } - val showDataFilesLoadingIndicator = remember { mutableStateOf(false) } + val showDataFilesLoadingIndicator = rememberSaveable { mutableStateOf(false) } val dataFilesLoading = stringResource(id = R.string.container_files_loading) val filesAdded by sharedContainerViewModel.addedFilesCount.collectAsState(0) val listState = rememberLazyListState() - val showContainerCloseConfirmationDialog = remember { mutableStateOf(false) } + val showContainerCloseConfirmationDialog = rememberSaveable { mutableStateOf(false) } - val showSivaDialog = remember { mutableStateOf(false) } + val showSivaDialog = rememberSaveable { mutableStateOf(false) } val nestedFile = rememberSaveable { mutableStateOf(null) } - val showContainerBottomSheet = remember { mutableStateOf(false) } - val showSignedContainerBottomSheet = remember { mutableStateOf(false) } - val showDataFileBottomSheet = remember { mutableStateOf(false) } - val showSignatureBottomSheet = remember { mutableStateOf(false) } + val showContainerBottomSheet = rememberSaveable { mutableStateOf(false) } + val showSignedContainerBottomSheet = rememberSaveable { mutableStateOf(false) } + val showDataFileBottomSheet = rememberSaveable { mutableStateOf(false) } + val showSignatureBottomSheet = rememberSaveable { mutableStateOf(false) } val openNestedContainer: (nestedContainer: File, isSivaConfirmed: Boolean) -> Unit = { nestedContainer, isSivaConfirmed -> @@ -801,7 +802,7 @@ fun SigningNavigation( testTagsAsResourceId = true }.testTag("signingContainer"), ) { - var actionSignature by remember { mutableStateOf(null) } + var actionSignature by rememberSaveable { mutableStateOf(null) } Column( modifier = @@ -811,7 +812,7 @@ fun SigningNavigation( verticalArrangement = Arrangement.Top, horizontalAlignment = Alignment.Start, ) { - if (signatureAddedSuccess.value == true) { + if (signatureAddedSuccess.value) { // Make sure text is announced when TalkBack is enabled by having its own element if (isTalkBackEnabled(context)) { Box( diff --git a/crypto-lib/src/main/kotlin/ee/ria/DigiDoc/cryptolib/Addressee.kt b/crypto-lib/src/main/kotlin/ee/ria/DigiDoc/cryptolib/Addressee.kt index 7f2392e5b..500246817 100644 --- a/crypto-lib/src/main/kotlin/ee/ria/DigiDoc/cryptolib/Addressee.kt +++ b/crypto-lib/src/main/kotlin/ee/ria/DigiDoc/cryptolib/Addressee.kt @@ -30,6 +30,7 @@ import org.bouncycastle.asn1.x500.style.BCStyle import org.bouncycastle.asn1.x500.style.IETFUtils import org.bouncycastle.asn1.x509.Extension import org.bouncycastle.asn1.x509.PolicyInformation +import java.io.Serializable import java.security.cert.CertificateFactory import java.security.cert.X509Certificate import java.util.Date @@ -43,7 +44,7 @@ class Addressee( var certType: CertType, var validTo: Date?, var concatKDFAlgorithmURI: String?, -) { +): Serializable { constructor(cn: String, sn: String, certType: CertType, validTo: Date?, data: ByteArray) : this( data = data, identifier = "", diff --git a/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/domain/model/DataFileInterface.kt b/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/domain/model/DataFileInterface.kt index 9d3f9e7d4..b86fcc07b 100644 --- a/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/domain/model/DataFileInterface.kt +++ b/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/domain/model/DataFileInterface.kt @@ -21,7 +21,9 @@ package ee.ria.DigiDoc.libdigidoclib.domain.model -interface DataFileInterface { +import java.io.Serializable + +interface DataFileInterface: Serializable { val id: String val fileName: String val fileSize: Long diff --git a/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/domain/model/DataFileWrapper.kt b/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/domain/model/DataFileWrapper.kt index 1de950517..602f1715f 100644 --- a/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/domain/model/DataFileWrapper.kt +++ b/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/domain/model/DataFileWrapper.kt @@ -22,10 +22,11 @@ package ee.ria.DigiDoc.libdigidoclib.domain.model import ee.ria.libdigidocpp.DataFile +import java.io.Serializable class DataFileWrapper( dataFile: DataFile, -) : DataFileInterface { +) : DataFileInterface, Serializable { override val id: String = dataFile.id() override val fileName: String = dataFile.fileName() override val fileSize: Long = dataFile.fileSize() diff --git a/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/domain/model/SignatureInterface.kt b/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/domain/model/SignatureInterface.kt index ea73de4a0..cbe9434f0 100644 --- a/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/domain/model/SignatureInterface.kt +++ b/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/domain/model/SignatureInterface.kt @@ -21,7 +21,9 @@ package ee.ria.DigiDoc.libdigidoclib.domain.model -interface SignatureInterface { +import java.io.Serializable + +interface SignatureInterface: Serializable { val id: String val name: String val claimedSigningTime: String diff --git a/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/domain/model/SignatureWrapper.kt b/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/domain/model/SignatureWrapper.kt index 541721afe..b34b64f29 100644 --- a/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/domain/model/SignatureWrapper.kt +++ b/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/domain/model/SignatureWrapper.kt @@ -27,10 +27,11 @@ import ee.ria.DigiDoc.utilsLib.logging.LoggingUtil.Companion.debugLog import ee.ria.DigiDoc.utilsLib.logging.LoggingUtil.Companion.errorLog import ee.ria.libdigidocpp.Signature import java.io.IOException +import java.io.Serializable class SignatureWrapper( signature: Signature, -) : SignatureInterface { +) : SignatureInterface, Serializable { private val logTag = javaClass.simpleName override val id: String = signature.id()