/* * Copyright 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.devicediagnostics import android.content.Intent import android.os.Bundle import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import com.android.devicediagnostics.Protos.DeviceReport import com.android.devicediagnostics.trusted.QrCodeDisplayActivity import com.google.android.attestation.ParsedAttestationRecord private const val TAG = "DisplayResultFragment" class DisplayResultFragment( private val report: DeviceReport, private val attestation: AttestationController ) : PreferenceFragmentCompat(), AttestationController.Callbacks { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences_trusted_display_result, rootKey) val tests = report.tests val pass = getString(R.string.pass) val fail = getString(R.string.fail) findPreference("screen")?.summary = if (tests.screenTest) pass else fail findPreference("touch")?.summary = if (tests.touchTest) pass else fail findPreference("battery")!!.setOnPreferenceClickListener { val intent = BatteryActivity.createIntent(activity!!, report.battery, report.launchLevel) activity!!.startActivity(intent) true } findPreference("storage")!!.setOnPreferenceClickListener { val intent = StorageActivity.createIntent(activity!!, report.storage) activity!!.startActivity(intent) true } findPreference("evaluate_another")?.setOnPreferenceClickListener { val intent = Intent(activity, QrCodeDisplayActivity::class.java) intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) activity!!.startActivity(intent) activity!!.finish() true } findPreference("done")?.setOnPreferenceClickListener { val intent = Intent(activity, MainActivity::class.java) intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) activity!!.startActivity(intent) activity!!.finish() true } findPreference("retry_failure")?.also { it.setOnPreferenceClickListener { attestation.verifyAttestation(activity!!, report, this) true } } attestation.verifyAttestation(activity!!, report, this) } override fun onAttestationReceived( attestation: Pair ) { if (activity == null) { return } val attestationRecord = attestation.first // Make invisible in case this is a successful retry attempt. findPreference("retry_failure")?.also { it.isVisible = false } findPreference("imei")?.also { if (attestationRecord.teeEnforced.attestationIdImei.isPresent) { it.summary = attestationRecord.teeEnforced.attestationIdImei.get().toString(Charsets.UTF_8) it.isVisible = true } } findPreference("imei2")?.also { if (attestationRecord.teeEnforced.attestationIdSecondImei.isPresent) { it.summary = attestationRecord.teeEnforced.attestationIdSecondImei .get() .toString(Charsets.UTF_8) it.isVisible = true } } findPreference("serial")?.also { if (attestationRecord.teeEnforced.attestationIdSerial.isPresent) { it.summary = attestationRecord.teeEnforced.attestationIdSerial.get().toString(Charsets.UTF_8) it.isVisible = true } } findPreference("locked")?.also { val rootOfTrust = attestationRecord.teeEnforced.rootOfTrust it.summary = if (rootOfTrust.isPresent && rootOfTrust.get().deviceLocked) { resources.getString(R.string.locked) } else { resources.getString(R.string.not_locked) } it.isVisible = true } findPreference("trustworthy")?.also { if (attestation.second == AttestationResult.VERIFIED) { it.summary = activity!!.resources.getString(getVerifiedBootStateResId(attestationRecord)) } else { it.summary = activity!!.resources.getString(R.string.no) } it.isVisible = true } findPreference("attestation_details")?.also { it.setOnPreferenceClickListener { DisplayAttestationDetailsActivity.attestation = attestation startActivity( Intent(requireActivity(), DisplayAttestationDetailsActivity::class.java) ) true } it.isVisible = true } } override fun onAttestationError() { if (activity == null) { return } findPreference("non_retry_failure")?.also { it.isVisible = true } } override fun onAttestationRetry() { findPreference("retry_failure")?.also { it.setOnPreferenceClickListener { attestation.verifyAttestation(activity!!, report, this) true } it.isVisible = true } } }