blob: e3185f34917d30978b017d8ad6ebcb568eb27999 [file] [log] [blame]
package com.google.chip.chiptool.attestation
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.util.Log
import androidx.activity.result.ActivityResultCaller
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
/** Class for finding and launching external attestation apps */
object AttestationAppLauncher {
/** Registers and returns an [ActivityResultLauncher] for attestation */
fun getLauncher(
caller: ActivityResultCaller,
block: (String?) -> Unit
): ActivityResultLauncher<Intent> {
return caller.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
result ->
val data = result.data
if (result.resultCode == Activity.RESULT_OK && data != null) {
val chipResult = data.getStringExtra(CHIP_RESULT_KEY)
Log.i(TAG, "Attestation result: $chipResult")
block(chipResult)
}
}
}
/** Queries apps which support attestation and returns the first [Intent] */
fun getAttestationIntent(context: Context): Intent? {
val packageManager = context.packageManager as PackageManager
val attestationActivityIntent = Intent(CHIP_ACTION)
val attestationAppInfo =
packageManager.queryIntentActivities(attestationActivityIntent, 0).firstOrNull()
return if (attestationAppInfo != null) {
attestationActivityIntent.setClassName(
attestationAppInfo.activityInfo.packageName,
attestationAppInfo.activityInfo.name
)
attestationActivityIntent
} else {
Log.e(TAG, "No attestation app found")
null
}
}
private const val TAG = "AttestationAppLauncher"
private const val CHIP_ACTION = "chip.intent.action.ATTESTATION"
private const val CHIP_RESULT_KEY = "chip_result_key"
}