Skip to content
Merged
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
3 changes: 2 additions & 1 deletion build-logic/build_properties.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ extra.apply {
* Dev version >= 2024.2.2 is required for float quality thresholds
* Dev version >= 2024.3.0 is required to receive configuration ID
* Dev version >= 2025.2.0 is required to support enrolment record updates and SimFace configuration
* Dev version >= 2025.3.0 is required to receive smaples and structured down sync configuration
*/
set("VERSION_NAME", "2025.2.0")
set("VERSION_NAME", "2025.3.0")

/**
* Build type. The version code describes which build type was used for the build.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ import com.simprints.feature.login.LoginContract
import com.simprints.feature.login.LoginResult
import com.simprints.infra.authstore.AuthStore
import com.simprints.infra.config.store.models.DownSynchronizationConfiguration
import com.simprints.infra.config.store.models.Frequency
import com.simprints.infra.config.store.models.ProjectState
import com.simprints.infra.config.store.models.SynchronizationConfiguration
import com.simprints.infra.config.store.models.canSyncDataToSimprints
import com.simprints.infra.config.store.models.isEventDownSyncAllowed
import com.simprints.infra.config.sync.ConfigManager
Expand Down Expand Up @@ -262,14 +262,16 @@ internal class SyncViewModel @Inject constructor(

private suspend fun isModuleSelectionRequired() = isDownSyncAllowed() && isSelectedModulesEmpty() && isModuleSync()

private suspend fun isDownSyncAllowed() = configManager.getProjectConfiguration().synchronization.frequency !=
SynchronizationConfiguration.Frequency.ONLY_PERIODICALLY_UP_SYNC
private suspend fun isDownSyncAllowed() = configManager
.getProjectConfiguration()
.synchronization.down.simprints.frequency !=
Frequency.ONLY_PERIODICALLY_UP_SYNC

private suspend fun isSelectedModulesEmpty() = configManager.getDeviceConfiguration().selectedModules.isEmpty()

private suspend fun isModuleSync() = configManager
.getProjectConfiguration()
.synchronization.down.partitionType == DownSynchronizationConfiguration.PartitionType.MODULE
.synchronization.down.simprints.partitionType == DownSynchronizationConfiguration.PartitionType.MODULE

private fun isConnected() = connectivityTracker.observeIsConnected().value ?: true
}
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ internal class AboutViewModel @Inject constructor(
private fun load() = viewModelScope.launch {
val configuration = configManager.getProjectConfiguration()
val syncAndSearchConfig = SyncAndSearchConfig(
configuration.synchronization.down.partitionType.name,
configuration.synchronization.down.simprints.partitionType.name,
configuration.identification.poolType.name,
)
_syncAndSearchConfig.postValue(syncAndSearchConfig)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -198,10 +198,10 @@ internal class SyncInfoViewModel @Inject constructor(
} == true

private fun isModuleSync(syncConfiguration: DownSynchronizationConfiguration) =
syncConfiguration.partitionType == DownSynchronizationConfiguration.PartitionType.MODULE
syncConfiguration.simprints.partitionType == DownSynchronizationConfiguration.PartitionType.MODULE

fun isModuleSyncAndModuleIdOptionsNotEmpty(synchronizationConfiguration: SynchronizationConfiguration) =
synchronizationConfiguration.down.let { it.moduleOptions.isNotEmpty() && isModuleSync(it) }
synchronizationConfiguration.down.let { it.simprints.moduleOptions.isNotEmpty() && isModuleSync(it) }

private suspend fun getRecordsInLocal(projectId: String): Int = enrolmentRecordRepository.count(SubjectQuery(projectId = projectId))

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,12 @@ internal class ModuleRepositoryImpl @Inject constructor(
private val enrolmentRecordRepository: EnrolmentRecordRepository,
private val eventSyncManager: EventSyncManager,
) : ModuleRepository {
override suspend fun getModules(): List<Module> = configManager.getProjectConfiguration().synchronization.down.moduleOptions.map {
Module(it, isModuleSelected(it.value))
}
override suspend fun getModules(): List<Module> = configManager
.getProjectConfiguration()
.synchronization.down.simprints.moduleOptions
.map {
Module(it, isModuleSelected(it.value))
}

override suspend fun saveModules(modules: List<Module>) {
setSelectedModules(modules.filter { it.isSelected })
Expand All @@ -27,7 +30,7 @@ internal class ModuleRepositoryImpl @Inject constructor(

override suspend fun getMaxNumberOfModules(): Int = configManager
.getProjectConfiguration()
.synchronization.down.maxNbOfModules
.synchronization.down.simprints.maxNbOfModules

private suspend fun isModuleSelected(moduleName: String): Boolean = configManager
.getDeviceConfiguration()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ import com.simprints.feature.login.LoginResult
import com.simprints.infra.authstore.AuthStore
import com.simprints.infra.config.store.models.DeviceConfiguration
import com.simprints.infra.config.store.models.DownSynchronizationConfiguration
import com.simprints.infra.config.store.models.Frequency
import com.simprints.infra.config.store.models.ProjectState
import com.simprints.infra.config.store.models.SynchronizationConfiguration
import com.simprints.infra.config.store.models.UpSynchronizationConfiguration
import com.simprints.infra.config.store.models.UpSynchronizationConfiguration.SimprintsUpSynchronizationConfiguration
import com.simprints.infra.config.store.models.UpSynchronizationConfiguration.UpSynchronizationKind.ALL
Expand Down Expand Up @@ -103,10 +103,11 @@ internal class SyncViewModelTest {
every { up.simprints } returns SimprintsUpSynchronizationConfiguration(
kind = ALL,
batchSizes = UpSynchronizationConfiguration.UpSyncBatchSizes.default(),
false,
imagesRequireUnmeteredConnection = false,
frequency = Frequency.PERIODICALLY_AND_ON_SESSION_START,
)
every { frequency } returns SynchronizationConfiguration.Frequency.PERIODICALLY_AND_ON_SESSION_START
every { down.partitionType } returns DownSynchronizationConfiguration.PartitionType.MODULE
every { down.simprints.frequency } returns Frequency.PERIODICALLY_AND_ON_SESSION_START
every { down.simprints.partitionType } returns DownSynchronizationConfiguration.PartitionType.MODULE
}
every { timeHelper.readableBetweenNowAndTime(any()) } returns DATE
every { authStore.signedInProjectId } returns "projectId"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,14 +180,8 @@ class AboutViewModelTest {
every { poolType } returns POOL_TYPE
}
every { synchronization } returns mockk {
every { down } returns mockk {
every { partitionType } returns PARTITION_TYPE
}
every { up } returns mockk {
every { simprints } returns mockk {
every { kind } returns upSyncKind
}
}
every { down.simprints.partitionType } returns PARTITION_TYPE
every { up.simprints.kind } returns upSyncKind
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@ package com.simprints.feature.dashboard.settings.syncinfo

import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.lifecycle.MutableLiveData
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.*
import com.simprints.core.domain.tokenization.asTokenizableEncrypted
import com.simprints.core.domain.tokenization.asTokenizableRaw
import com.simprints.feature.dashboard.settings.syncinfo.modulecount.ModuleCount
import com.simprints.feature.login.LoginResult
import com.simprints.infra.authstore.AuthStore
import com.simprints.infra.config.store.models.DownSynchronizationConfiguration
import com.simprints.infra.config.store.models.Frequency
import com.simprints.infra.config.store.models.Project
import com.simprints.infra.config.store.models.ProjectConfiguration
import com.simprints.infra.config.store.models.SynchronizationConfiguration
Expand All @@ -30,13 +31,8 @@ import com.simprints.infra.sync.SyncOrchestrator
import com.simprints.testtools.common.coroutines.TestCoroutineRule
import com.simprints.testtools.common.livedata.getOrAwaitValue
import com.simprints.testtools.common.livedata.getOrAwaitValues
import io.mockk.MockKAnnotations
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
import io.mockk.*
import io.mockk.impl.annotations.MockK
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.runTest
import org.junit.Before
Expand Down Expand Up @@ -507,13 +503,13 @@ class SyncInfoViewModelTest {
partitionType: DownSynchronizationConfiguration.PartitionType,
modules: List<String> = emptyList(),
) = mockk<SynchronizationConfiguration> {
every { frequency }.returns(SynchronizationConfiguration.Frequency.PERIODICALLY)
every { down }.returns(
DownSynchronizationConfiguration(
every { down.simprints }.returns(
DownSynchronizationConfiguration.SimprintsDownSynchronizationConfiguration(
partitionType = partitionType,
moduleOptions = modules.map(String::asTokenizableRaw),
maxNbOfModules = 0,
maxAge = "PT24H",
frequency = Frequency.PERIODICALLY,
),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class ModuleRepositoryImplTest {
every { projectConfiguration.synchronization.down } returns downSynchronizationConfiguration
coEvery { configManager.getProjectConfiguration() } returns projectConfiguration

every { downSynchronizationConfiguration.moduleOptions } returns listOf("a", "b", "c", "d").map(String::asTokenizableRaw)
every { downSynchronizationConfiguration.simprints.moduleOptions } returns listOf("a", "b", "c", "d").map(String::asTokenizableRaw)
coEvery {
configManager.getDeviceConfiguration()
} returns DeviceConfiguration("", listOf("b", "c").map(TokenizableString::Tokenized), "")
Expand Down Expand Up @@ -130,7 +130,7 @@ class ModuleRepositoryImplTest {

@Test
fun shouldFetchMaxNumberOfModulesFromRemoteConfig() = runTest {
every { downSynchronizationConfiguration.maxNbOfModules } returns 10
every { downSynchronizationConfiguration.simprints.maxNbOfModules } returns 10

assertThat(repository.getMaxNumberOfModules()).isEqualTo(10)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ internal class ExtractCrashKeysUseCase @Inject constructor(
Simber.setUserProperty(CrashReportingCustomKeys.MODULE_IDS, deviceConfiguration.selectedModules.toString())
Simber.setUserProperty(
CrashReportingCustomKeys.SUBJECTS_DOWN_SYNC_TRIGGERS,
projectConfiguration.synchronization.frequency.toString(),
projectConfiguration.synchronization.down.simprints.frequency
.toString(),
)
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.simprints.feature.logincheck.usecases

import com.simprints.infra.config.store.models.SynchronizationConfiguration
import com.simprints.infra.config.store.models.Frequency
import com.simprints.infra.config.sync.ConfigManager
import com.simprints.infra.sync.SyncOrchestrator
import javax.inject.Inject
Expand All @@ -10,10 +10,12 @@ internal class StartBackgroundSyncUseCase @Inject constructor(
private val configManager: ConfigManager,
) {
suspend operator fun invoke() {
val frequency = configManager.getProjectConfiguration().synchronization.frequency
val frequency = configManager
.getProjectConfiguration()
.synchronization.down.simprints.frequency

syncOrchestrator.scheduleBackgroundWork(
withDelay = frequency != SynchronizationConfiguration.Frequency.PERIODICALLY_AND_ON_SESSION_START,
withDelay = frequency != Frequency.PERIODICALLY_AND_ON_SESSION_START,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,11 @@ package com.simprints.feature.logincheck.usecases

import com.simprints.core.domain.tokenization.asTokenizableRaw
import com.simprints.infra.authstore.AuthStore
import com.simprints.infra.config.store.models.SynchronizationConfiguration
import com.simprints.infra.config.store.models.Frequency
import com.simprints.infra.config.sync.ConfigManager
import com.simprints.infra.logging.Simber
import io.mockk.MockKAnnotations
import io.mockk.coEvery
import io.mockk.every
import io.mockk.*
import io.mockk.impl.annotations.MockK
import io.mockk.mockk
import io.mockk.mockkObject
import io.mockk.unmockkObject
import io.mockk.verify
import kotlinx.coroutines.test.runTest
import org.junit.After
import org.junit.Before
Expand Down Expand Up @@ -43,7 +37,7 @@ class ExtractCrashKeysUseCaseTest {
@Test
fun `Sets values to Simber`() = runTest {
coEvery { configManager.getProjectConfiguration() } returns mockk {
every { synchronization.frequency } returns SynchronizationConfiguration.Frequency.PERIODICALLY
every { synchronization.down.simprints.frequency } returns Frequency.PERIODICALLY
}
coEvery { configManager.getDeviceConfiguration() } returns mockk {
every { selectedModules } returns listOf(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package com.simprints.feature.logincheck.usecases

import com.simprints.infra.config.store.models.SynchronizationConfiguration
import com.simprints.infra.config.store.models.Frequency
import com.simprints.infra.config.sync.ConfigManager
import com.simprints.infra.sync.SyncOrchestrator
import io.mockk.MockKAnnotations
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.*
import io.mockk.impl.annotations.MockK
import kotlinx.coroutines.test.runTest
import org.junit.Before
Expand All @@ -32,8 +30,12 @@ class StartBackgroundSyncUseCaseTest {

@Test
fun `Schedules all syncs when called`() = runTest {
coEvery { configManager.getProjectConfiguration().synchronization.frequency } returns
SynchronizationConfiguration.Frequency.PERIODICALLY
coEvery {
configManager
.getProjectConfiguration()
.synchronization.down.simprints.frequency
} returns
Frequency.PERIODICALLY

useCase.invoke()

Expand All @@ -42,8 +44,12 @@ class StartBackgroundSyncUseCaseTest {

@Test
fun `Starts event sync on start if required`() = runTest {
coEvery { configManager.getProjectConfiguration().synchronization.frequency } returns
SynchronizationConfiguration.Frequency.PERIODICALLY_AND_ON_SESSION_START
coEvery {
configManager
.getProjectConfiguration()
.synchronization.down.simprints.frequency
} returns
Frequency.PERIODICALLY_AND_ON_SESSION_START

useCase.invoke()

Expand All @@ -52,8 +58,12 @@ class StartBackgroundSyncUseCaseTest {

@Test
fun `Does not start event sync on start if not required`() = runTest {
coEvery { configManager.getProjectConfiguration().synchronization.frequency } returns
SynchronizationConfiguration.Frequency.PERIODICALLY
coEvery {
configManager
.getProjectConfiguration()
.synchronization.down.simprints.frequency
} returns
Frequency.PERIODICALLY

useCase.invoke()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ internal class ShouldSuggestSyncUseCase @Inject constructor(
.getProjectConfiguration()
.synchronization
.down
.simprints
.maxAge
.let(Duration.Companion::parse)
.inWholeMilliseconds
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class ShouldSuggestSyncUseCaseTest {
coEvery {
configRepository
.getProjectConfiguration()
.synchronization.down.maxAge
.synchronization.down.simprints.maxAge
} returns "PT24H"

assertThat(usecase()).isTrue()
Expand All @@ -58,7 +58,7 @@ class ShouldSuggestSyncUseCaseTest {
coEvery {
configRepository
.getProjectConfiguration()
.synchronization.down.maxAge
.synchronization.down.simprints.maxAge
} returns "24h0m0s"

assertThat(usecase()).isTrue()
Expand All @@ -71,7 +71,7 @@ class ShouldSuggestSyncUseCaseTest {
coEvery {
configRepository
.getProjectConfiguration()
.synchronization.down.maxAge
.synchronization.down.simprints.maxAge
} returns "PT24H"

assertThat(usecase()).isFalse()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,17 +99,19 @@ internal class ConfigRepositoryImpl @Inject constructor(
return config.copy(
synchronization = config.synchronization.copy(
down = config.synchronization.down.copy(
moduleOptions = config.synchronization.down.moduleOptions.map { moduleId ->
when (moduleId) {
is TokenizableString.Raw -> tokenizationProcessor.encrypt(
decrypted = moduleId,
tokenKeyType = TokenKeyType.ModuleId,
project = project,
)

is TokenizableString.Tokenized -> moduleId
}
},
simprints = config.synchronization.down.simprints.copy(
moduleOptions = config.synchronization.down.simprints.moduleOptions.map { moduleId ->
when (moduleId) {
is TokenizableString.Raw -> tokenizationProcessor.encrypt(
decrypted = moduleId,
tokenKeyType = TokenKeyType.ModuleId,
project = project,
)

is TokenizableString.Tokenized -> moduleId
}
},
),
),
),
)
Expand Down
Loading