diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0126191..e797acd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,9 +24,14 @@ android:exported="true"> - + + + + + + diff --git a/app/src/main/java/foundation/algorand/demo/MainActivity.kt b/app/src/main/java/foundation/algorand/demo/MainActivity.kt index e4085dc..cde8cd3 100644 --- a/app/src/main/java/foundation/algorand/demo/MainActivity.kt +++ b/app/src/main/java/foundation/algorand/demo/MainActivity.kt @@ -3,6 +3,7 @@ package foundation.algorand.demo import android.R.attr.duration import android.app.Activity import android.content.Intent +import android.net.Uri import android.os.Build import android.os.Bundle import android.os.StrictMode @@ -102,6 +103,23 @@ class MainActivity : AppCompatActivity() { fido2Client = Fido2ApiClient(this@MainActivity) scanner = GmsBarcodeScanning.getClient(this@MainActivity) executor = ContextCompat.getMainExecutor(this) + + // Get Intent Data + val intentUri: Uri? = intent?.data + if (intentUri !== null) { + Log.d(TAG, "Intent Detected: $intentUri") + val msg = AuthMessage.fromUri(intentUri) + viewModel.setMessage(msg) + signalClient = SignalClient(msg.origin, this@MainActivity, httpClient) + lifecycleScope.launch { + if (viewModel.credential.value === null) { + register(msg) + } else { + authenticate(msg, viewModel.credential.value!!) + } + } + } + // View Bindings binding = ActivityMainBinding.inflate(layoutInflater) binding.lifecycleOwner = this diff --git a/auth/src/main/java/foundation/algorand/auth/connect/AuthMessage.kt b/auth/src/main/java/foundation/algorand/auth/connect/AuthMessage.kt index db6cda8..e95e2fa 100644 --- a/auth/src/main/java/foundation/algorand/auth/connect/AuthMessage.kt +++ b/auth/src/main/java/foundation/algorand/auth/connect/AuthMessage.kt @@ -1,18 +1,18 @@ package foundation.algorand.auth.connect +import android.net.Uri import android.util.Log import com.google.mlkit.vision.barcode.common.Barcode import org.json.JSONObject -import java.net.URI import javax.inject.Inject -private fun URI.findParameterValue(parameterName: String): String? { - return query.split('&').map { +private fun Uri.findParameterValue(parameterName: String): String? { + return query?.split('&')?.map { val parts = it.split('=') val name = parts.firstOrNull() ?: "" val value = parts.drop(1).firstOrNull() ?: "" Pair(name, value) - }.firstOrNull{it.first == parameterName}?.second + }?.firstOrNull{it.first == parameterName}?.second } class AuthMessage @Inject constructor( var origin: String, @@ -21,29 +21,41 @@ class AuthMessage @Inject constructor( companion object { const val TAG = "connect.Message" + fun fromUri(uri: Uri): AuthMessage { + Log.d(TAG, "fromUri($uri)") + val origin = "https://${uri.host}" + val requestId = uri.findParameterValue("requestId")!!.toDouble() + return AuthMessage(origin, requestId) + } /** - * Parse the `Barcode` - * - * uses the following url scheme: + * Parse the Uri string * * `liquid:///?requestId=` */ - fun fromBarcode(barcode: Barcode): AuthMessage { - Log.d(TAG, "fromBarcode(${barcode.displayValue})") - val stringContents = barcode.displayValue ?: throw Exception("Barcode does not contain a display value") + fun fromString(stringContents: String): AuthMessage { + Log.d(TAG, "fromString($stringContents)") if(stringContents.startsWith("liquid://")) { - val uri = URI(stringContents) - val origin = "https://${uri.host}" - val requestId = uri.findParameterValue("requestId")!!.toDouble() - return AuthMessage(origin, requestId) + return fromUri(Uri.parse(stringContents)) } else { // Fallback to JSON renderer - val json = JSONObject(barcode.displayValue.toString()) + val json = JSONObject(stringContents) val origin = json.get("origin").toString() val requestId = json.get("requestId").toString().toDouble() return AuthMessage(origin, requestId) } } + /** + * Parse the `Barcode` + * + * uses the following url scheme: + * + * `liquid:///?requestId=` + */ + fun fromBarcode(barcode: Barcode): AuthMessage { + Log.d(TAG, "fromBarcode(${barcode.displayValue})") + val stringContents = barcode.displayValue ?: throw Exception("Barcode does not contain a display value") + return fromString(stringContents) + } } fun toJSON() : JSONObject { val result = JSONObject()