This commit is contained in:
Andrew 2024-03-01 20:23:39 +10:30
parent 673e53e4c7
commit 88f4f219f6
2 changed files with 32 additions and 26 deletions

View File

@ -1,5 +1,6 @@
package org.thoughtcrime.securesms.onboarding package org.thoughtcrime.securesms.onboarding
import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
@ -9,6 +10,8 @@ import androidx.activity.viewModels
import androidx.camera.core.CameraSelector import androidx.camera.core.CameraSelector
import androidx.camera.core.ExperimentalGetImage import androidx.camera.core.ExperimentalGetImage
import androidx.camera.core.ImageAnalysis import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageAnalysis.Analyzer
import androidx.camera.core.ImageProxy
import androidx.camera.core.Preview import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.view.PreviewView import androidx.camera.view.PreviewView
@ -113,7 +116,7 @@ class LinkDeviceActivity : BaseActionBarActivity() {
setContent { setContent {
val state by viewModel.stateFlow.collectAsState() val state by viewModel.stateFlow.collectAsState()
AppTheme { AppTheme {
LoadAccountScreen(state, viewModel::onChange, viewModel::onRecoveryPhrase) LoadAccountScreen(state, viewModel::onChange, viewModel::tryPhrase)
} }
} }
}.let(::setContentView) }.let(::setContentView)
@ -154,7 +157,7 @@ class LinkDeviceActivity : BaseActionBarActivity() {
when (title) { when (title) {
R.string.activity_link_device_scan_qr_code -> { R.string.activity_link_device_scan_qr_code -> {
LocalSoftwareKeyboardController.current?.hide() LocalSoftwareKeyboardController.current?.hide()
cameraProvider.get().bindToLifecycle(LocalLifecycleOwner.current, selector, preview, buildAnalysisUseCase(scanner, viewModel::onQrPhrase)) cameraProvider.get().bindToLifecycle(LocalLifecycleOwner.current, selector, preview, buildAnalysisUseCase(scanner, viewModel::tryPhrase))
} }
else -> cameraProvider.get().unbind(preview) else -> cameraProvider.get().unbind(preview)
} }
@ -271,9 +274,9 @@ fun RecoveryPassword(state: LinkDeviceState, onChange: (String) -> Unit = {}, on
OutlineButton( OutlineButton(
text = stringResource(id = R.string.continue_2), text = stringResource(id = R.string.continue_2),
modifier = Modifier modifier = Modifier
.align(Alignment.CenterHorizontally) .align(Alignment.CenterHorizontally)
.padding(horizontal = 64.dp, vertical = 20.dp) .padding(horizontal = 64.dp, vertical = 20.dp)
.width(200.dp) .width(200.dp)
) { onContinue() } ) { onContinue() }
} }
} }
@ -282,25 +285,34 @@ fun Context.startLinkDeviceActivity() {
Intent(this, LinkDeviceActivity::class.java).let(::startActivity) Intent(this, LinkDeviceActivity::class.java).let(::startActivity)
} }
@SuppressLint("UnsafeOptInUsageError")
private fun buildAnalysisUseCase( private fun buildAnalysisUseCase(
scanner: BarcodeScanner, scanner: BarcodeScanner,
onBarcodeScanned: (String) -> Unit onBarcodeScanned: (String) -> Unit
): ImageAnalysis = ImageAnalysis.Builder() ): ImageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build().apply { .build().apply {
setAnalyzer(Executors.newSingleThreadExecutor()) { imageProxy -> setAnalyzer(Executors.newSingleThreadExecutor(), Analyzer(scanner, onBarcodeScanned))
InputImage.fromMediaImage( }
imageProxy.image!!,
imageProxy.imageInfo.rotationDegrees class Analyzer(
).let(scanner::process).apply { private val scanner: BarcodeScanner,
addOnSuccessListener { barcodes -> private val onBarcodeScanned: (String) -> Unit
barcodes.forEach { ): Analyzer {
it.takeIf { it.valueType == Barcode.TYPE_TEXT }?.rawValue?.let(onBarcodeScanned) @SuppressLint("UnsafeOptInUsageError")
} override fun analyze(image: ImageProxy) {
} InputImage.fromMediaImage(
addOnCompleteListener { image.image!!,
imageProxy.close() image.imageInfo.rotationDegrees
).let(scanner::process).apply {
addOnSuccessListener { barcodes ->
barcodes.forEach {
it.takeIf { it.valueType == Barcode.TYPE_TEXT }?.rawValue?.let(onBarcodeScanned)
} }
} }
addOnCompleteListener {
image.close()
}
} }
} }
}

View File

@ -55,13 +55,7 @@ class LinkDeviceViewModel @Inject constructor(
} }
} }
fun onRecoveryPhrase() { fun tryPhrase(string: String = state.value.recoveryPhrase) {
viewModelScope.launch {
phrases.send(state.value.recoveryPhrase)
}
}
fun onQrPhrase(string: String) {
viewModelScope.launch { viewModelScope.launch {
phrases.send(string) phrases.send(string)
} }