From a5adaaea84cf35c2c673ad3a36d17749755712dc Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 7 Nov 2025 13:47:00 +0200 Subject: [PATCH 1/2] [MS-1239] Fragment correctly restores OCR state after being rotated --- .../screens/scanocr/ExternalCredentialScanOcrFragment.kt | 5 ++--- .../screens/scanocr/ExternalCredentialScanOcrViewModel.kt | 7 +++---- .../scanocr/ExternalCredentialScanOcrViewModelTest.kt | 7 +++---- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrFragment.kt b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrFragment.kt index bc5ef22d0c..c1e4f665ec 100644 --- a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrFragment.kt +++ b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrFragment.kt @@ -106,7 +106,6 @@ internal class ExternalCredentialScanOcrFragment : Fragment(R.layout.fragment_ex super.onViewCreated(view, savedInstanceState) applySystemBarInsets(view) Simber.i("ExternalCredentialScanOcrFragment started", tag = MULTI_FACTOR_ID) - initObservers() } override fun onResume() { @@ -147,7 +146,7 @@ internal class ExternalCredentialScanOcrFragment : Fragment(R.layout.fragment_ex } private fun initializeFragment() { - renderInitialState() + initObservers() initCamera(onComplete = { if (viewModel.isOcrActive) { startOcr() @@ -156,7 +155,7 @@ internal class ExternalCredentialScanOcrFragment : Fragment(R.layout.fragment_ex } private fun initObservers() { - viewModel.stateLiveData.observe(viewLifecycleOwner) { state -> + viewModel.scanOcrStateLiveData.observe(viewLifecycleOwner) { state -> when (state) { is ScanOcrState.ScanningInProgress -> { renderProgress(state) diff --git a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModel.kt b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModel.kt index b557c4895e..ed2050fba9 100644 --- a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModel.kt +++ b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModel.kt @@ -24,7 +24,6 @@ import com.simprints.feature.externalcredential.screens.scanocr.usecase.Normaliz import com.simprints.feature.externalcredential.screens.scanocr.usecase.ZoomOntoCredentialUseCase import com.simprints.feature.externalcredential.screens.search.model.ScannedCredential import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.store.models.ExperimentalProjectConfiguration import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.models.experimental import com.simprints.infra.config.store.tokenization.TokenizationProcessor @@ -67,10 +66,10 @@ internal class ExternalCredentialScanOcrViewModel @AssistedInject constructor( private var state: ScanOcrState = ScanOcrState.EMPTY set(value) { field = value - _stateLiveData.postValue(value) + _scanOcrStateLiveData.postValue(value) } - private val _stateLiveData = MutableLiveData() - val stateLiveData: LiveData = _stateLiveData + private val _scanOcrStateLiveData = MutableLiveData(state) + val scanOcrStateLiveData: LiveData = _scanOcrStateLiveData val finishOcrEvent: LiveData> get() = _finishOcrEvent private val _finishOcrEvent = MutableLiveData>() diff --git a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModelTest.kt b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModelTest.kt index 74624f2de2..cec68f27a9 100644 --- a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModelTest.kt +++ b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModelTest.kt @@ -30,7 +30,6 @@ import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule import org.junit.Test -import kotlin.concurrent.timer internal class ExternalCredentialScanOcrViewModelTest { @get:Rule @@ -104,7 +103,7 @@ internal class ExternalCredentialScanOcrViewModelTest { @Test fun `ocrStarted updates state to ScanningInProgress`() { - val observer = viewModel.stateLiveData.test() + val observer = viewModel.scanOcrStateLiveData.test() viewModel.ocrStarted() val state = observer.value() as ScanOcrState.ScanningInProgress @@ -122,7 +121,7 @@ internal class ExternalCredentialScanOcrViewModelTest { coEvery { cropDocumentFromPreviewUseCase(mockNormalizedBitmap, any()) } returns mockCroppedBitmap coEvery { getCredentialCoordinatesUseCase(mockCroppedBitmap, documentType) } returns mockDetectedBlock - val observer = viewModel.stateLiveData.test() + val observer = viewModel.scanOcrStateLiveData.test() viewModel.ocrOnFrameStarted() viewModel.runOcrOnFrame(bitmap, cropConfig) @@ -158,7 +157,7 @@ internal class ExternalCredentialScanOcrViewModelTest { coEvery { credentialImageRepository.saveCredentialScan(mockBitmap, any()) } returns zoomedImagePath val finishObserver = viewModel.finishOcrEvent.test() - val stateObserver = viewModel.stateLiveData.test() + val stateObserver = viewModel.scanOcrStateLiveData.test() viewModel.ocrStarted() // Initialises capture timing viewModel.processOcrResultsAndFinish() From 3ef27def38d4a78c252419bf5267e86d4c3c3777 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 7 Nov 2025 18:55:25 +0200 Subject: [PATCH 2/2] [MS-1239] Renaming 'state' to 'ocrState' for consistency --- .../screens/scanocr/ExternalCredentialScanOcrViewModel.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModel.kt b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModel.kt index ed2050fba9..ff0873f996 100644 --- a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModel.kt +++ b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanocr/ExternalCredentialScanOcrViewModel.kt @@ -63,12 +63,12 @@ internal class ExternalCredentialScanOcrViewModel @AssistedInject constructor( private set val isOcrActive: Boolean get() = detectedBlocks.isNotEmpty() - private var state: ScanOcrState = ScanOcrState.EMPTY + private var ocrState: ScanOcrState = ScanOcrState.EMPTY set(value) { field = value _scanOcrStateLiveData.postValue(value) } - private val _scanOcrStateLiveData = MutableLiveData(state) + private val _scanOcrStateLiveData = MutableLiveData(ocrState) val scanOcrStateLiveData: LiveData = _scanOcrStateLiveData val finishOcrEvent: LiveData> get() = _finishOcrEvent @@ -90,7 +90,7 @@ internal class ExternalCredentialScanOcrViewModel @AssistedInject constructor( } private fun updateState(state: (ScanOcrState) -> ScanOcrState) { - this.state = state(this.state) + this.ocrState = state(this.ocrState) } fun getDocumentTypeRes(): Int = when (ocrDocumentType) {