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 @@ -3,7 +3,6 @@ package org.dhis2.usescases.settings
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.dhis2.mobile.commons.featureconfig.model.Feature
import org.dhis2.lazyActivityScenarioRule
import org.dhis2.usescases.BaseTest
import org.dhis2.usescases.main.MainActivity
Expand Down Expand Up @@ -73,29 +72,6 @@ class SettingsTest : BaseTest() {
}
}

//This test covers test case ANDROAPP-7139
@Test
fun shouldNotShowTwoFAOption() {
disableFeatureConfigValue(Feature.TWO_FACTOR_AUTHENTICATION)
startActivity()
settingsRobot(composeTestRule) {
checkTwoFAOptionIsNotDisplayed()
}
}

//This test covers test case ANDROAPP-7139 and ANDROAPP-7140
@Test
fun shouldShowTwoFAOption() {
enableFeatureConfigValue(Feature.TWO_FACTOR_AUTHENTICATION)

startActivity()
settingsRobot(composeTestRule) {
checkTwoFAOptionIsDisplayed()
clickOnTwoFASettings()
checkTwoFAScreenIsDisplayed()
}
}

private fun startActivity() {
val intent = MainActivity.intent(
ApplicationProvider.getApplicationContext(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@ import org.dhis2.commons.prefs.Preference.Companion.TIME_WEEKLY
import org.dhis2.commons.prefs.PreferenceProvider
import org.dhis2.data.service.SyncResult
import org.dhis2.mobile.commons.featureconfig.data.FeatureConfigRepository
import org.dhis2.mobile.commons.featureconfig.model.Feature
import org.dhis2.mobile.sync.data.SyncBackgroundJobAction
import org.dhis2.usescases.settings.models.DataSettingsViewModel
import org.dhis2.usescases.settings.models.MetadataSettingsViewModel
import org.dhis2.usescases.settings.models.ReservedValueSettingsViewModel
import org.dhis2.usescases.settings.models.SMSSettingsViewModel
import org.dhis2.usescases.settings.models.SyncParametersViewModel
import org.hisp.dhis.android.core.D2
import org.hisp.dhis.android.core.common.AuthorizationType
import org.hisp.dhis.android.core.common.State
import org.hisp.dhis.android.core.settings.GeneralSettings
import org.hisp.dhis.android.core.settings.LimitScope
Expand Down Expand Up @@ -355,5 +355,10 @@ class SettingsRepository(

fun getVersionName(): String = BuildConfig.VERSION_NAME

fun isTwoFAConfigured(): Boolean = featureConfigRepository.isFeatureEnable(Feature.TWO_FACTOR_AUTHENTICATION)
fun isTwoFAConfigured(): Boolean =
d2
.userModule()
.accountManager()
.getCurrentAccount()
?.authorizationType == AuthorizationType.OAUTH2
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import org.dhis2.commons.network.NetworkUtils
import org.dhis2.commons.viewmodel.DispatcherProvider
import org.dhis2.mobile.login.authentication.domain.usecase.GetTwoFAStatus
import org.dhis2.usescases.settings.domain.CheckVersionUpdate
import org.dhis2.usescases.settings.domain.DeleteLocalData
import org.dhis2.usescases.settings.domain.ExportDatabase
Expand All @@ -29,6 +30,7 @@ class SettingsViewModelFactory(
private val dispatcherProvider: DispatcherProvider,
private val networkUtils: NetworkUtils,
private val settingsMessages: SettingsMessages,
private val twoFaStatus: GetTwoFAStatus,
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T =
SyncManagerPresenter(
Expand All @@ -44,5 +46,6 @@ class SettingsViewModelFactory(
dispatcherProvider = dispatcherProvider,
networkUtils = networkUtils,
settingsMessages = settingsMessages,
twoFaStatus = twoFaStatus,
) as T
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.dhis2.usescases.settings

import android.content.Context
import dagger.Module
import dagger.Provides
import org.dhis2.R
Expand All @@ -9,8 +10,16 @@ import org.dhis2.commons.prefs.PreferenceProvider
import org.dhis2.commons.resources.ResourceManager
import org.dhis2.commons.viewmodel.DispatcherProvider
import org.dhis2.data.service.VersionRepository
import org.dhis2.mobile.commons.error.DomainErrorMapper
import org.dhis2.mobile.commons.featureconfig.data.FeatureConfigRepository
import org.dhis2.mobile.commons.files.FileHandlerImpl
import org.dhis2.mobile.commons.network.NetworkStatusProvider
import org.dhis2.mobile.commons.network.NetworkStatusProviderImpl
import org.dhis2.mobile.commons.resources.D2ErrorMessageProvider
import org.dhis2.mobile.commons.resources.D2ErrorMessageProviderImpl
import org.dhis2.mobile.login.authentication.data.repository.TwoFARepositoryImpl
import org.dhis2.mobile.login.authentication.domain.repository.TwoFARepository
import org.dhis2.mobile.login.authentication.domain.usecase.GetTwoFAStatus
import org.dhis2.mobile.sync.data.SyncBackgroundJobAction
import org.dhis2.usescases.settings.domain.CheckVersionUpdate
import org.dhis2.usescases.settings.domain.DeleteLocalData
Expand Down Expand Up @@ -46,6 +55,7 @@ class SyncManagerModule(
dispatcherProvider: DispatcherProvider,
networkUtils: NetworkUtils,
settingsMessages: SettingsMessages,
twoFaStatus: GetTwoFAStatus,
) = SettingsViewModelFactory(
getSettingsState,
updateSyncSettings,
Expand All @@ -59,6 +69,7 @@ class SyncManagerModule(
dispatcherProvider,
networkUtils,
settingsMessages,
twoFaStatus,
)

@Provides
Expand Down Expand Up @@ -181,4 +192,34 @@ class SyncManagerModule(
@Provides
@PerFragment
fun providesSettingsMessage(): SettingsMessages = SettingsMessages()

@Provides
@PerFragment
fun providesTwoFAStatus(twoFARepository: TwoFARepository): GetTwoFAStatus = GetTwoFAStatus(twoFARepository)

@Provides
@PerFragment
fun providesTwoRepository(
d2: D2,
domainErrorMapper: DomainErrorMapper,
): TwoFARepository = TwoFARepositoryImpl(d2, domainErrorMapper)

@Provides
@PerFragment
fun provideDomainErrorMapper(
d2ErrorMessageProvider: D2ErrorMessageProvider,
networkStatusProvider: NetworkStatusProvider,
): DomainErrorMapper =
DomainErrorMapper(
d2ErrorMessageProvider,
networkStatusProvider,
)

@Provides
@PerFragment
fun provideD2ErrorMessageProvider(): D2ErrorMessageProvider = D2ErrorMessageProviderImpl()

@Provides
@PerFragment
fun provideNetworkStatusProvider(context: Context): NetworkStatusProvider = NetworkStatusProviderImpl(context)
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import org.dhis2.commons.network.NetworkUtils
import org.dhis2.commons.viewmodel.DispatcherProvider
import org.dhis2.mobile.commons.domain.invoke
import org.dhis2.mobile.commons.extensions.launchUseCase
import org.dhis2.mobile.login.authentication.domain.usecase.GetTwoFAStatus
import org.dhis2.usescases.settings.domain.CheckVersionUpdate
import org.dhis2.usescases.settings.domain.DeleteLocalData
import org.dhis2.usescases.settings.domain.ExportDatabase
Expand Down Expand Up @@ -46,6 +47,7 @@ class SyncManagerPresenter(
private val dispatcherProvider: DispatcherProvider,
private val networkUtils: NetworkUtils,
private val settingsMessages: SettingsMessages,
private val twoFaStatus: GetTwoFAStatus,
) : ViewModel() {
val exporting = exportDatabase.exporting

Expand Down Expand Up @@ -125,7 +127,9 @@ class SyncManagerPresenter(
),
).fold(
onSuccess = { settingsState ->
_settingsState.update { settingsState }
_settingsState
.update { settingsState }
.also { getTwoFAStatus() }
},
onFailure = {
// do nothing
Expand Down Expand Up @@ -385,4 +389,15 @@ class SyncManagerPresenter(
settingsMessages.close()
_errorLogChannel.close()
}

private fun getTwoFAStatus() {
launchUseCase {
val state = twoFaStatus()
_settingsState.update {
it?.copy(
twoFAStatus = state,
)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.dhis2.usescases.settings.models

import org.dhis2.mobile.login.authentication.domain.model.TwoFAStatus
import org.dhis2.usescases.settings.SettingItem

data class SettingsState(
Expand All @@ -13,6 +14,7 @@ data class SettingsState(
val isTwoFAConfigured: Boolean,
val versionName: String,
val deleteDataState: DeleteDataState = DeleteDataState.None,
val twoFAStatus: TwoFAStatus = TwoFAStatus.NoConnection,
) {
fun canInitDataSync() = hasConnection && !dataSettingsViewModel.syncInProgress

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,7 @@ private fun SettingItemList(
if (settingsUIModel.isTwoFAConfigured) {
item {
TwoFASettingItem(
status = settingsUIModel.twoFAStatus,
onClick = { onSettingsUiAction(SettingsUiAction.OnOpenTwoFASettings) },
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,28 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
import org.dhis2.R
import org.dhis2.mobile.login.authentication.domain.model.TwoFAStatus
import org.dhis2.usescases.settings.SettingItem
import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem

@Composable
fun TwoFASettingItem(onClick: () -> Unit) {
fun TwoFASettingItem(
status: TwoFAStatus,
onClick: () -> Unit,
) {
SettingItem(
modifier = Modifier.testTag(SettingItem.TWO_FACTOR_AUTH.name),
title = stringResource(id = R.string.settingTwoFA),
additionalInfoList =
listOf(
// TODO: Replace "Unknown" with actual status when available
AdditionalInfoItem(
key = stringResource(R.string.settingsTwoFAStatus),
value = "Unknown",
value =
when (status) {
is TwoFAStatus.Enabled -> stringResource(R.string.settingsTwoFAEnabled)
is TwoFAStatus.Disabled -> stringResource(R.string.settingsTwoFADisabled)
is TwoFAStatus.NoConnection -> stringResource(R.string.settingsTwoFAStatusError)
},
),
AdditionalInfoItem(
value = stringResource(R.string.settingTwoFADescr),
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,9 @@
<string name="settingsExportDBMessage">Export your database and share it with your administrator</string>
<string name="settingTwoFA">Two factor authentication</string>
<string name="settingsTwoFAStatus">Status</string>
<string name="settingsTwoFAEnabled">Enabled.</string>
<string name="settingsTwoFADisabled">Disabled.</string>
<string name="settingsTwoFAStatusError">Connection error</string>
<string name="settingTwoFADescr">Enable or disable the authentication in two steps.</string>
<!--endregion-->

Expand Down
Loading
Loading