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
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
Comment thread
meladRaouf marked this conversation as resolved.

private val alertHelper = AlertActivityHelper()

Expand All @@ -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()
}
}

Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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()
Expand Down Expand Up @@ -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()
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ internal class SerialEntryPairViewModel @Inject constructor(
private val serialNumberConverter: SerialNumberConverter
) : ViewModel() {

var scannerNumber: String? = null
val awaitingToPairToMacAddress: LiveData<LiveDataEventWithContent<String>>
get() = _awaitingToPairToMacAddress
private val _awaitingToPairToMacAddress = MutableLiveData<LiveDataEventWithContent<String>>()
Expand Down
Original file line number Diff line number Diff line change
@@ -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)
}
}
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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"
}
Expand Down