Start parsing URIs.

Initially just do a placeholder implementation for a more full parsing through librustzcash.
This commit is contained in:
Kevin Gorham 2021-03-16 15:08:33 -04:00
parent dfc6838bdf
commit 3bf1ed1415
No known key found for this signature in database
GPG Key ID: CCA55602DF49FC38
2 changed files with 13 additions and 3 deletions

View File

@ -122,13 +122,14 @@ class ScanFragment : BaseFragment<FragmentScanBinding>() {
private fun onQrScanned(qrContent: String, image: ImageProxy) {
resumedScope.launch {
if (viewModel.isNotValid(qrContent)) {
val parsed = viewModel.parse(qrContent)
if (parsed == null) {
val network = ZcashSdk.NETWORK
binding.textScanError.text = getString(R.string.scan_invalid_address, network, qrContent)
image.close()
} else { /* continue scanning*/
binding.textScanError.text = ""
sendViewModel.toAddress = qrContent
sendViewModel.toAddress = parsed
mainActivity?.safeNavigate(R.id.action_nav_scan_to_nav_send)
}
}

View File

@ -10,7 +10,16 @@ class ScanViewModel @Inject constructor() : ViewModel() {
@Inject
lateinit var synchronizer: Synchronizer
suspend fun isNotValid(address: String) = synchronizer.validateAddress(address).isNotValid
suspend fun parse(qrCode: String): String? {
//temporary parse code to allow both plain addresses and those that start with zcash:
// TODO: replace with more robust ZIP-321 handling of QR codes
val address = if (qrCode.startsWith("zcash:")) {
qrCode.substring(6, qrCode.indexOf("?").takeUnless { it == -1 } ?: qrCode.length)
} else {
qrCode
}
return if (synchronizer.validateAddress(address).isNotValid) null else address
}
override fun onCleared() {
super.onCleared()