Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -614,4 +614,20 @@ class DataStoreTest {

assertFalse(result)
}

@Test
fun dataStore_setDoNotShowWrongCanDialog_success() {
dataStore.setDoNotShowWrongCanDialog(true)

val result = dataStore.getDoNotShowWrongCanDialog()

assertTrue(result)
}

@Test
fun dataStore_getDoNotShowWrongCanDialog_success() {
val result = dataStore.getDoNotShowWrongCanDialog()

assertFalse(result)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ import ee.ria.DigiDoc.common.testfiles.asset.AssetFile
import ee.ria.DigiDoc.configuration.repository.ConfigurationRepository
import ee.ria.DigiDoc.cryptolib.CDOC2Settings
import ee.ria.DigiDoc.domain.model.IdCardData
import ee.ria.DigiDoc.domain.preferences.DataStore
import ee.ria.DigiDoc.domain.service.IdCardService
import ee.ria.DigiDoc.exceptions.NFCError
import ee.ria.DigiDoc.idcard.CodeType
import ee.ria.DigiDoc.libdigidoclib.SignedContainer
import ee.ria.DigiDoc.libdigidoclib.domain.model.ContainerWrapper
Expand All @@ -43,10 +45,16 @@ import ee.ria.DigiDoc.libdigidoclib.init.LibdigidocLibraryLoader
import ee.ria.DigiDoc.smartcardreader.nfc.NfcSmartCardReaderManager
import ee.ria.DigiDoc.smartcardreader.nfc.NfcSmartCardReaderManager.NfcStatus
import kotlinx.coroutines.Dispatchers.Main
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.toList
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.advanceUntilIdle
import kotlinx.coroutines.test.runTest
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Assert.fail
import org.junit.Before
Expand Down Expand Up @@ -90,6 +98,8 @@ class NFCViewModelTest {

private lateinit var configurationRepository: ConfigurationRepository

private lateinit var dataStore: DataStore

@Mock
private lateinit var idCardService: IdCardService

Expand Down Expand Up @@ -118,6 +128,7 @@ class NFCViewModelTest {
containerWrapper = ContainerWrapperImpl()
configurationRepository = mock(ConfigurationRepository::class.java)
cdoc2Settings = CDOC2Settings(context, configurationRepository)
dataStore = DataStore(context)

viewModel =
NFCViewModel(
Expand All @@ -126,6 +137,7 @@ class NFCViewModelTest {
cdoc2Settings,
configurationRepository,
idCardService,
dataStore,
)

scenario = ActivityScenario.launch(ComponentActivity::class.java)
Expand Down Expand Up @@ -181,16 +193,29 @@ class NFCViewModelTest {
viewModel.signStatus.removeObserver(resetSignStatusObserver)
}

@OptIn(ExperimentalCoroutinesApi::class)
@Test
fun nfcViewModel_resetErrorState_success() =
runTest {
val errorStateObserver: Observer<Triple<Int, String?, Int?>?> = mock()
viewModel.errorState.observeForever(errorStateObserver)
val values = mutableListOf<NFCError?>()
val job = launch { viewModel.errorState.toList(values) }

viewModel.performNFCSignWorkRequest(
activity = activity,
context = context,
container = null,
pin2Code = byteArrayOf(),
canNumber = "",
roleData = null,
)

viewModel.resetErrorState()
verify(errorStateObserver, atLeastOnce()).onChanged(null)

viewModel.errorState.removeObserver(errorStateObserver)
advanceUntilIdle()
job.cancel()

assertTrue(values.isNotEmpty())
assertNull(values.last())
}

@Test
Expand Down Expand Up @@ -392,6 +417,9 @@ class NFCViewModelTest {
runTest {
val signedContainer = SignedContainer.openOrCreate(context, container, listOf(container), true)

val values = mutableListOf<NFCError?>()
val job = launch { viewModel.errorState.toList(values) }

viewModel.performNFCSignWorkRequest(
activity,
context,
Expand All @@ -401,10 +429,9 @@ class NFCViewModelTest {
null,
)

val errorStateObserver: Observer<Triple<Int, String?, Int?>?> = mock()
viewModel.errorState.observeForever(errorStateObserver)
verify(errorStateObserver, atLeastOnce()).onChanged(null)
viewModel.errorState.removeObserver(errorStateObserver)
job.cancel()

assertNull(values.last())

val signStatusObserver: Observer<Boolean?> = mock()
viewModel.signStatus.observeForever(signStatusObserver)
Expand All @@ -420,12 +447,17 @@ class NFCViewModelTest {
@Test
fun nfcViewModel_performNFCSignWorkRequest_nullContainer() =
runTest {
val values = mutableListOf<NFCError?>()
val job = launch { viewModel.errorState.toList(values) }

viewModel.performNFCSignWorkRequest(activity, context, null, byteArrayOf(1, 1, 5, 5, 5), "444222", null)

val errorStateObserver: Observer<Triple<Int, String?, Int?>?> = mock()
viewModel.errorState.observeForever(errorStateObserver)
verify(errorStateObserver, atLeastOnce()).onChanged(Triple(R.string.error_general_client, null, null))
viewModel.errorState.removeObserver(errorStateObserver)
job.cancel()

assertTrue(values.isNotEmpty())
val error = values.last()
assertNotNull(error)
assertEquals(R.string.error_general_client, error?.message)
}

@Test
Expand Down Expand Up @@ -469,15 +501,19 @@ class NFCViewModelTest {
viewModel.dialogError.removeObserver(errorStateObserver)
}

@OptIn(ExperimentalCoroutinesApi::class)
@Test
fun nfcViewModel_loadPersonalData_success() =
runTest {
val values = mutableListOf<NFCError?>()
val job = launch { viewModel.errorState.toList(values) }

viewModel.loadPersonalData(activity, "123456")

val errorStateObserver: Observer<Triple<Int, String?, Int?>?> = mock()
viewModel.errorState.observeForever(errorStateObserver)
verify(errorStateObserver, atLeastOnce()).onChanged(null)
viewModel.errorState.removeObserver(errorStateObserver)
advanceUntilIdle()
job.cancel()

assertNull(values.last())

val userDataObserver: Observer<IdCardData?> = mock()
viewModel.userData.observeForever(userDataObserver)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import ee.ria.DigiDoc.common.Constant.Defaults.DEFAULT_UUID_VALUE
import ee.ria.DigiDoc.common.Constant.IS_CRASH_SENDING_ALWAYS_ENABLED
import ee.ria.DigiDoc.common.Constant.KEY_LOCALE
import ee.ria.DigiDoc.common.Constant.MyEID.IDENTIFICATION_METHOD_SETTING
import ee.ria.DigiDoc.common.Constant.NFCConstants.DO_NOT_SHOW_WRONG_CAN_DIALOG
import ee.ria.DigiDoc.common.Constant.Theme.THEME_SETTING
import ee.ria.DigiDoc.common.preferences.EncryptedPreferences
import ee.ria.DigiDoc.domain.model.crypto.DecryptMethodSetting
Expand Down Expand Up @@ -772,6 +773,12 @@ class DataStore
preferences.edit { putString(IDENTIFICATION_METHOD_SETTING, myEidIdentificationMethodSetting.methodName) }
}

fun getDoNotShowWrongCanDialog(): Boolean = preferences.getBoolean(DO_NOT_SHOW_WRONG_CAN_DIALOG, false)

fun setDoNotShowWrongCanDialog(doNotShowAgain: Boolean) {
preferences.edit { putBoolean(DO_NOT_SHOW_WRONG_CAN_DIALOG, doNotShowAgain) }
}

private fun getEncryptedPreferences(context: Context): SharedPreferences? =
try {
EncryptedPreferences.getEncryptedPreferences(context)
Expand Down
81 changes: 81 additions & 0 deletions app/src/main/kotlin/ee/ria/DigiDoc/exceptions/NFCError.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/*
* Copyright 2017 - 2026 Riigi Infosüsteemi Amet
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/

@file:Suppress("PackageName")

package ee.ria.DigiDoc.exceptions

sealed class NFCError {
abstract val message: Int

data class TagLost(
override val message: Int,
) : NFCError()

data class WrongPin(
val pinType: String,
val retriesLeft: Int,
override val message: Int,
) : NFCError()

data class PinBlocked(
val pinType: String,
override val message: Int,
) : NFCError()

data class ApduResponse(
override val message: Int,
) : NFCError()

data class WrongCan(
override val message: Int,
) : NFCError()

data class LimitExceeded(
override val message: Int,
) : NFCError()

data class NoInternetConnection(
override val message: Int,
) : NFCError()

data class NoProxyConnection(
override val message: Int,
) : NFCError()

data class NoLockFound(
override val message: Int,
) : NFCError()

data class CertificateRevoked(
override val message: Int,
) : NFCError()

data class CertificateUnknown(
override val message: Int,
) : NFCError()

data class TechnicalError(
override val message: Int,
) : NFCError()

data class GeneralError(
override val message: Int,
) : NFCError()
}
Original file line number Diff line number Diff line change
Expand Up @@ -664,7 +664,7 @@ fun DiagnosticsScreen(
HrefMessageDialog(
text1 = R.string.main_diagnostics_restart_message,
text2 = R.string.main_diagnostics_restart_message_restart_now,
linkText = R.string.main_diagnostics_restart_message_read_more,
linkText = R.string.read_more_here,
linkUrl = R.string.main_diagnostics_restart_message_href,
newLineBeforeLink = true,
newLineBeforeText2 = true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -389,18 +389,23 @@ fun MyEidPinScreen(
}

BackHandler {
if (showNewRepeatPinField.value) {
newPinRepeatedState.value = byteArrayOf()

showNewRepeatPinField.value = false
showCurrentPinField.value = false
showNewPinField.value = true
} else if (showCurrentPinField.value) {
resetPins()
sharedMyEidViewModel.resetScreenContent()
navController.navigateUp()
} else {
if (showNFCScreen.value) {
showNFCScreen.value = false
resetToBeginning()
} else {
if (showNewRepeatPinField.value) {
newPinRepeatedState.value = byteArrayOf()

showNewRepeatPinField.value = false
showCurrentPinField.value = false
showNewPinField.value = true
} else if (showCurrentPinField.value) {
resetPins()
sharedMyEidViewModel.resetScreenContent()
navController.navigateUp()
} else {
resetToBeginning()
}
}
}

Expand Down Expand Up @@ -434,22 +439,27 @@ fun MyEidPinScreen(
R.string.back
},
onLeftButtonClick = {
if (showNewRepeatPinField.value) {
showNewRepeatPinField.value = false
showCurrentPinField.value = false
showNewPinField.value = true

newPinRepeatedState.value = byteArrayOf()
} else if (showNewPinField.value) {
if (showNFCScreen.value) {
showNFCScreen.value = false
resetToBeginning()
} else {
if (showNewRepeatPinField.value) {
showNewRepeatPinField.value = false
showCurrentPinField.value = false
showNewPinField.value = true

newPinRepeatedState.value = byteArrayOf()
newPinRepeatedState.value = byteArrayOf()
} else if (showNewPinField.value) {
resetToBeginning()

newPinState.value = byteArrayOf()
} else {
resetPins()
sharedMyEidViewModel.resetScreenContent()
navController.navigateUp()
newPinRepeatedState.value = byteArrayOf()

newPinState.value = byteArrayOf()
} else {
resetPins()
sharedMyEidViewModel.resetScreenContent()
navController.navigateUp()
}
}
},
onRightSecondaryButtonClick = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ fun HrefMessageDialogPreview() {
HrefMessageDialog(
text1 = R.string.main_diagnostics_restart_message,
text2 = R.string.main_diagnostics_restart_message_restart_now,
linkText = R.string.main_diagnostics_restart_message_read_more,
linkText = R.string.read_more_here,
linkUrl = R.string.main_diagnostics_restart_message_href,
)
}
Expand Down
Loading
Loading