diff --git a/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/controller/ConnectScannerControllerFragment.kt b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/controller/ConnectScannerControllerFragment.kt index b585490a1a..6e598f83e9 100644 --- a/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/controller/ConnectScannerControllerFragment.kt +++ b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/controller/ConnectScannerControllerFragment.kt @@ -10,6 +10,7 @@ import androidx.annotation.RequiresApi import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -48,7 +49,8 @@ internal class ConnectScannerControllerFragment : Fragment(R.layout.fragment_con private var shouldRequestPermissions = true private val args: ConnectScannerControllerFragmentArgs by navArgs() - private val viewModel: ConnectScannerViewModel by activityViewModels() + private val activityViewModel: ConnectScannerViewModel by activityViewModels() + private val fragmentViewModel: ConnectScannerControllerViewModel by viewModels() private val alertHelper = AlertActivityHelper() @@ -72,9 +74,9 @@ internal class ConnectScannerControllerFragment : Fragment(R.layout.fragment_con Simber.i("Bluetooth permission: $permission") when (permission) { - PermissionStatus.Granted -> viewModel.connect() + PermissionStatus.Granted -> activityViewModel.connect() PermissionStatus.Denied -> requestBluetoothPermissions() - PermissionStatus.DeniedNeverAskAgain -> viewModel.handleNoBluetoothPermission() + PermissionStatus.DeniedNeverAskAgain -> activityViewModel.handleNoBluetoothPermission() } } @@ -87,14 +89,15 @@ internal class ConnectScannerControllerFragment : Fragment(R.layout.fragment_con shouldRequestPermissions = savedInstanceState?.getBoolean(KEY_SHOULD_REQUEST_PERMISSIONS) ?: shouldRequestPermissions - if (savedInstanceState == null) { - viewModel.init(args.params) + if (!fragmentViewModel.isInitialized) { + activityViewModel.init(args.params) + fragmentViewModel.isInitialized = true } findNavController().handleResult(this, R.id.connectScannerControllerFragment, ExitFormContract.DESTINATION, ::handleExitForm) findNavController().handleResult(this, R.id.connectScannerControllerFragment, AlertContract.DESTINATION, ::handleResult) - viewModel.showScannerIssueScreen.observe(viewLifecycleOwner, LiveDataEventWithContentObserver { screen -> + activityViewModel.showScannerIssueScreen.observe(viewLifecycleOwner, LiveDataEventWithContentObserver { screen -> when (screen) { ConnectScannerIssueScreen.BluetoothNoPermission -> showAlert(AlertError.BLUETOOTH_NO_PERMISSION) ConnectScannerIssueScreen.BluetoothNotSupported -> showAlert(AlertError.BLUETOOTH_NOT_SUPPORTED) @@ -121,19 +124,19 @@ internal class ConnectScannerControllerFragment : Fragment(R.layout.fragment_con ) } }) - viewModel.scannerConnected.observe(viewLifecycleOwner, LiveDataEventWithContentObserver { isSuccess -> + activityViewModel.scannerConnected.observe(viewLifecycleOwner, LiveDataEventWithContentObserver { isSuccess -> if (isSuccess) { Vibrate.vibrate(requireContext()) - viewModel.finishConnectionFlow(true) + activityViewModel.finishConnectionFlow(true) } }) - viewModel.finish.observe(viewLifecycleOwner, LiveDataEventWithContentObserver { isSuccess -> + activityViewModel.finish.observe(viewLifecycleOwner, LiveDataEventWithContentObserver { isSuccess -> finishWithResult(isSuccess) }) requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) { - viewModel.handleBackPress() + activityViewModel.handleBackPress() } internalNavController()?.setGraph(R.navigation.graph_connect_internal) @@ -150,10 +153,10 @@ internal class ConnectScannerControllerFragment : Fragment(R.layout.fragment_con if (knownScannedDialog == null) { knownScannedDialog = MaterialAlertDialogBuilder(requireContext()) .setPositiveButton(IDR.string.fingerprint_connect_scanner_confirmation_yes) { _, _ -> - viewModel.handleScannerDisconnectedYesClick() + activityViewModel.handleScannerDisconnectedYesClick() } .setNegativeButton(IDR.string.fingerprint_connect_scanner_confirmation_no) { _, _ -> - viewModel.handleScannerDisconnectedNoClick() + activityViewModel.handleScannerDisconnectedNoClick() } .setCancelable(false) .create() @@ -181,7 +184,7 @@ internal class ConnectScannerControllerFragment : Fragment(R.layout.fragment_con } private fun checkBluetoothPermissions() { - if (hasBluetoothPermissions()) viewModel.connect() + if (hasBluetoothPermissions()) activityViewModel.connect() else requestBluetoothPermissions() } diff --git a/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/controller/ConnectScannerControllerViewModel.kt b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/controller/ConnectScannerControllerViewModel.kt new file mode 100644 index 0000000000..c6a2c81af2 --- /dev/null +++ b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/controller/ConnectScannerControllerViewModel.kt @@ -0,0 +1,10 @@ +package com.simprints.fingerprint.connect.screens.controller + +import androidx.lifecycle.ViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +internal class ConnectScannerControllerViewModel @Inject constructor() : ViewModel() { + var isInitialized = false +} \ No newline at end of file diff --git a/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/issues/serialentrypair/SerialEntryPairFragment.kt b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/issues/serialentrypair/SerialEntryPairFragment.kt index 89f79220e3..b42cc59c91 100644 --- a/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/issues/serialentrypair/SerialEntryPairFragment.kt +++ b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/issues/serialentrypair/SerialEntryPairFragment.kt @@ -7,6 +7,7 @@ import android.os.Bundle import android.view.View import android.view.inputmethod.EditorInfo.IME_ACTION_DONE import android.view.inputmethod.InputMethodManager +import androidx.core.widget.addTextChangedListener import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels @@ -63,8 +64,16 @@ internal class SerialEntryPairFragment : Fragment(R.layout.fragment_serial_entry screenReporter.reportSerialEntry() binding.serialEntryOkButton.setOnClickListener { parseTextAndCommencePair() } + viewModel.scannerNumber?.let { binding.serialEntryEditText.setText(it) } + setupDoneButtonForEditText() + binding.serialEntryEditText.addTextChangedListener( + afterTextChanged = { text -> + viewModel.scannerNumber = text?.toString() + } + ) + viewModel.awaitingToPairToMacAddress.observe(viewLifecycleOwner, LiveDataEventWithContentObserver { binding.serialEntryOkButton.visibility = View.INVISIBLE binding.serialEntryPairProgressBar.visibility = View.VISIBLE @@ -128,7 +137,7 @@ internal class SerialEntryPairFragment : Fragment(R.layout.fragment_serial_entry private fun parseTextAndCommencePair() { try { val serialNumber = scannerPairingManager.interpretEnteredTextAsSerialNumber( - binding.serialEntryEditText.text.toString() + viewModel.scannerNumber.orEmpty() ) viewModel.startPairing(serialNumber) } catch (e: NumberFormatException) { diff --git a/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/issues/serialentrypair/SerialEntryPairViewModel.kt b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/issues/serialentrypair/SerialEntryPairViewModel.kt index 78dacf0437..900ad15fb8 100644 --- a/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/issues/serialentrypair/SerialEntryPairViewModel.kt +++ b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/issues/serialentrypair/SerialEntryPairViewModel.kt @@ -16,6 +16,7 @@ internal class SerialEntryPairViewModel @Inject constructor( private val serialNumberConverter: SerialNumberConverter ) : ViewModel() { + var scannerNumber: String? = null val awaitingToPairToMacAddress: LiveData> get() = _awaitingToPairToMacAddress private val _awaitingToPairToMacAddress = MutableLiveData>() diff --git a/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/controller/ConnectScannerControllerViewModelTest.kt b/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/controller/ConnectScannerControllerViewModelTest.kt new file mode 100644 index 0000000000..fb1606ffcd --- /dev/null +++ b/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/controller/ConnectScannerControllerViewModelTest.kt @@ -0,0 +1,25 @@ +package com.simprints.fingerprint.connect.screens.controller + +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test + + +class ConnectScannerControllerViewModelTest { + private lateinit var viewModel: ConnectScannerControllerViewModel + + @Before + fun setUp() { + viewModel = ConnectScannerControllerViewModel() + } + + @Test + fun `when isInitialized is set, it stores the correct value`() { + val initialIsInitialized = false + val expectedIsInitialized = true + + assertThat(viewModel.isInitialized).isEqualTo(initialIsInitialized) + viewModel.isInitialized = expectedIsInitialized + assertThat(viewModel.isInitialized).isEqualTo(expectedIsInitialized) + } +} \ No newline at end of file diff --git a/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/issues/serialentrypair/SerialEntryPairViewModelTest.kt b/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/issues/serialentrypair/SerialEntryPairViewModelTest.kt index d4d7b0c3d3..a75576d93d 100644 --- a/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/issues/serialentrypair/SerialEntryPairViewModelTest.kt +++ b/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/issues/serialentrypair/SerialEntryPairViewModelTest.kt @@ -1,6 +1,7 @@ package com.simprints.fingerprint.connect.screens.issues.serialentrypair import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import com.google.common.truth.Truth.assertThat import com.simprints.fingerprint.infra.scanner.ScannerPairingManager import com.simprints.fingerprint.infra.scanner.tools.SerialNumberConverter import com.simprints.testtools.common.coroutines.TestCoroutineRule @@ -47,6 +48,14 @@ internal class SerialEntryPairViewModelTest { verify { scannerPairViewModel.startPairingToDevice(ADDRESS) } } + @Test + fun `when serial number is set, then its value is stored correctly`() { + assertThat(viewModel.scannerNumber).isNull() + val expected = "12345" + viewModel.scannerNumber = expected + assertThat(viewModel.scannerNumber).isEqualTo(expected) + } + companion object { private const val ADDRESS = "address" }