diff --git a/src/android/CHIPTool/app/src/main/AndroidManifest.xml b/src/android/CHIPTool/app/src/main/AndroidManifest.xml index e681e19cf9f54d..9e7ee8657d45e9 100644 --- a/src/android/CHIPTool/app/src/main/AndroidManifest.xml +++ b/src/android/CHIPTool/app/src/main/AndroidManifest.xml @@ -1,8 +1,9 @@ - + @@ -30,12 +31,18 @@ + + + + + + - + diff --git a/src/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/CHIPToolActivity.kt b/src/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/CHIPToolActivity.kt index fa906cbd3c1d48..1168686289d4f6 100644 --- a/src/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/CHIPToolActivity.kt +++ b/src/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/CHIPToolActivity.kt @@ -22,6 +22,7 @@ import android.net.Uri import android.nfc.NdefMessage import android.nfc.NfcAdapter import android.os.Bundle +import android.util.Base64 import android.util.Log import android.widget.Toast import androidx.appcompat.app.AlertDialog @@ -44,6 +45,7 @@ import com.google.chip.chiptool.setuppayloadscanner.BarcodeFragment import com.google.chip.chiptool.setuppayloadscanner.CHIPDeviceDetailsFragment import com.google.chip.chiptool.setuppayloadscanner.CHIPDeviceInfo import com.google.chip.chiptool.setuppayloadscanner.CHIPLedgerDetailsFragment +import org.json.JSONObject class CHIPToolActivity : AppCompatActivity(), @@ -72,6 +74,10 @@ class CHIPToolActivity : if (intent?.action == NfcAdapter.ACTION_NDEF_DISCOVERED) onNfcIntent(intent) + + if (Intent.ACTION_VIEW == intent?.action) { + onReturnIntent(intent) + } } override fun onSaveInstanceState(outState: Bundle) { @@ -222,6 +228,65 @@ class CHIPToolActivity : .show() } + private fun onReturnIntent(intent: Intent) { + val appLinkData = intent.data + // Require URI schema "mt:" + if (!appLinkData?.scheme.equals("mt", true)) { + Log.d(TAG, "Unrecognized URI schema : ${appLinkData?.scheme}") + return + } + // Require URI host "modelinfo" + if (!appLinkData?.host.equals("modelinfo", true)) { + Log.d(TAG, "Unrecognized URI host : ${appLinkData?.host}") + return + } + + // parse payload + try { + val payloadBase64String = appLinkData?.getQueryParameter("payload") + if (payloadBase64String.isNullOrEmpty()) { + Log.d(TAG, "Unrecognized payload") + return + } + + val decodeBytes = Base64.decode(payloadBase64String, Base64.DEFAULT) + val payloadString = String(decodeBytes) + val payload = JSONObject(payloadString) + + // parse payload from JSON + val setupPayload = SetupPayload() + // set defaults + setupPayload.discoveryCapabilities = setOf() + setupPayload.optionalQRCodeInfo = mapOf() + + // read from payload + setupPayload.version = payload.getInt("version") + setupPayload.vendorId = payload.getInt("vendorId") + setupPayload.productId = payload.getInt("productId") + setupPayload.commissioningFlow = payload.getInt("commissioningFlow") + setupPayload.discriminator = payload.getInt("discriminator") + setupPayload.setupPinCode = payload.getLong("setupPinCode") + + val deviceInfo = CHIPDeviceInfo.fromSetupPayload(setupPayload) + val buttons = arrayOf( + getString(R.string.nfc_tag_action_show) + ) + + AlertDialog.Builder(this) + .setTitle(R.string.provision_custom_flow_alert_title) + .setItems(buttons) { _, _ -> + onCHIPDeviceInfoReceived(deviceInfo) + } + .create() + .show() + + } catch (ex: UnrecognizedQrCodeException) { + Log.e(TAG, "Unrecognized Payload", ex) + Toast.makeText(this, "Unrecognized Setup Payload", Toast.LENGTH_SHORT).show() + return + } + } + companion object { private const val TAG = "CHIPToolActivity" private const val ADDRESS_COMMISSIONING_FRAGMENT_TAG = "address_commissioning_fragment" diff --git a/src/android/CHIPTool/app/src/main/res/values/strings.xml b/src/android/CHIPTool/app/src/main/res/values/strings.xml index 99a36d9141d3c2..093940527c9f55 100644 --- a/src/android/CHIPTool/app/src/main/res/values/strings.xml +++ b/src/android/CHIPTool/app/src/main/res/values/strings.xml @@ -141,11 +141,12 @@ Loading... Redirect Not available + Commissioning flow Completed. https://dcl.dev.dsr-corporation.com/api/modelinfo/models result custom - + mt://modelinfo Retrieve Endpoint List Invoke Select a command