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
1 change: 1 addition & 0 deletions .github/workflows/pr-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ jobs:
feature:alert
feature:exit-form
feature:select-subject-age-group
feature:external-credential
reportsId: feature1

feature-unit-tests2:
Expand Down
4 changes: 4 additions & 0 deletions feature/external-credential/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,9 @@ android {
}

dependencies {
implementation(project(":infra:config-store"))
implementation(project(":infra:config-sync"))
implementation(project(":infra:ui-base"))
implementation(project(":feature:exit-form"))
implementation(libs.androidX.cameraX.view)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.simprints.feature.externalcredential.ext

import android.content.res.Resources
import androidx.annotation.PluralsRes
import androidx.annotation.StringRes
import com.simprints.core.domain.externalcredential.ExternalCredentialType

fun Resources.getQuantityCredentialString(
@PluralsRes id: Int,
@StringRes specificCredentialRes: Int,
@StringRes multipleCredentialsRes: Int,
credentialTypes: List<ExternalCredentialType>,
): String {
val credentialsAmount = credentialTypes.size
val documentTypeRes = if (credentialsAmount == 1) {
specificCredentialRes
} else {
multipleCredentialsRes
}
return getQuantityString(
id,
credentialsAmount,
getString(documentTypeRes)
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,27 @@ package com.simprints.feature.externalcredential.screens.controller

import android.os.Bundle
import android.view.View
import androidx.activity.addCallback
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.navigation.NavController
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import com.simprints.feature.exitform.ExitFormContract
import com.simprints.feature.exitform.ExitFormResult
import com.simprints.feature.externalcredential.GraphExternalCredentialInternalDirections
import com.simprints.feature.externalcredential.R
import com.simprints.feature.externalcredential.model.ExternalCredentialParams
import com.simprints.infra.uibase.navigation.finishWithResult
import com.simprints.infra.uibase.navigation.handleResult
import com.simprints.infra.uibase.navigation.navigateSafely
import com.simprints.infra.uibase.navigation.navigationParams
import dagger.hilt.android.AndroidEntryPoint
import kotlin.getValue

@AndroidEntryPoint
internal class ExternalCredentialControllerFragment : Fragment(R.layout.fragment_external_credential_controller) {
private val args: ExternalCredentialControllerFragmentArgs by navArgs()
private val params: ExternalCredentialParams by navigationParams()
private val viewModel: ExternalCredentialViewModel by activityViewModels()

private val hostFragment: Fragment?
get() = childFragmentManager.findFragmentById(R.id.external_credential_host_fragment)
Expand All @@ -32,6 +36,8 @@ internal class ExternalCredentialControllerFragment : Fragment(R.layout.fragment
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

viewModel.init(params)

findNavController().handleResult<ExitFormResult>(
this,
R.id.externalCredentialControllerFragment,
Expand All @@ -48,5 +54,29 @@ internal class ExternalCredentialControllerFragment : Fragment(R.layout.fragment
}
}
internalNavController?.setGraph(R.navigation.graph_external_credential_internal)

initObservers()
initListeners()
}

private fun initObservers() {
viewModel.stateLiveData.observe(viewLifecycleOwner) {
}
}

private fun initListeners() {
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
when (internalNavController?.currentDestination?.id) {
R.id.externalCredentialSelectFragment, R.id.externalCredentialSearch -> {
// Exit form navigation
findNavController().navigateSafely(
this@ExternalCredentialControllerFragment,
R.id.action_global_refusalFragment,
)
}

else -> internalNavController?.popBackStack()
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.simprints.feature.externalcredential.screens.controller

import com.simprints.core.domain.common.FlowType
import com.simprints.core.domain.externalcredential.ExternalCredentialType

internal data class ExternalCredentialState(
val subjectId: String?,
val flowType: FlowType,
val credentialValue: String?,
val selectedType: ExternalCredentialType?
) {
companion object {
val EMPTY = ExternalCredentialState(
subjectId = null,
flowType = FlowType.VERIFY,
credentialValue = null,
selectedType = null,
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.simprints.feature.externalcredential.screens.controller

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.simprints.core.domain.externalcredential.ExternalCredentialType
import com.simprints.feature.externalcredential.model.ExternalCredentialParams
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
import com.simprints.infra.resources.R as IDR

@HiltViewModel
internal class ExternalCredentialViewModel @Inject internal constructor() : ViewModel() {

private var isInitialized = false
private var state: ExternalCredentialState = ExternalCredentialState.EMPTY
set(value) {
field = value
_stateLiveData.postValue(value)
}
private val _stateLiveData = MutableLiveData(ExternalCredentialState.EMPTY)
val stateLiveData: LiveData<ExternalCredentialState> = _stateLiveData

private fun updateState(state: (ExternalCredentialState) -> ExternalCredentialState) {
this.state = state(this.state)
}

fun setSelectedExternalCredentialType(selectedType: ExternalCredentialType?) {
updateState { it.copy(selectedType = selectedType) }
}

fun setExternalCredentialValue(value: String) {
updateState { it.copy(credentialValue = value) }
}

fun init(params: ExternalCredentialParams) {
if (!isInitialized) {
isInitialized = true
updateState { ExternalCredentialState.EMPTY.copy(subjectId = params.subjectId, flowType = params.flowType) }
}
}


fun mapTypeToStringResource(type: ExternalCredentialType?) = when (type) {
ExternalCredentialType.NHISCard -> IDR.string.mfid_type_nhis_card
ExternalCredentialType.GhanaIdCard -> IDR.string.mfid_type_ghana_id_card
ExternalCredentialType.QRCode -> IDR.string.mfid_type_qr_code
null -> IDR.string.mfid_type_any_document
}
}
Loading