package com.android.onboarding.nodes.testing.testapp import android.content.Context import android.content.Intent import android.content.Intent.CATEGORY_DEFAULT import android.content.Intent.FLAG_ACTIVITY_FORWARD_RESULT import android.content.pm.PackageManager.ResolveInfoFlags import android.graphics.Color import android.os.Bundle import android.widget.ArrayAdapter import android.widget.Button import android.widget.EditText import android.widget.LinearLayout import android.widget.Spinner import android.widget.TextView import androidx.activity.result.ActivityResult import com.android.onboarding.activity.CompositeOnboardingActivity import com.android.onboarding.common.TEST_APP import com.android.onboarding.contracts.IdentifyExecutingContractByAction import com.android.onboarding.contracts.OnboardingActivityApiContract import com.android.onboarding.contracts.annotations.DiscouragedOnboardingApi import com.android.onboarding.contracts.annotations.InternalOnboardingApi import com.android.onboarding.contracts.annotations.OnboardingNode import com.android.onboarding.contracts.failNode import com.android.onboarding.contracts.registerForActivityLaunch @OptIn(DiscouragedOnboardingApi::class, InternalOnboardingApi::class) class MainActivity : CompositeOnboardingActivity() { private val defaultContract = RedContract() private val contracts = arrayOf(defaultContract, BlueContract(), GreenContract()) override fun selectContract(intent: Intent): ColourContract = contracts.firstOrNull { it.isExecuting(intent.action) } ?: defaultContract override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) if (attachResult.valid) { @Suppress("SetTextI18n") checkNotNull(findViewById(R.id.status)).text = "Received argument: ${argument.arg}" } val processSpinner = checkNotNull(findViewById(R.id.processSpinner)) val packages = packageManager .queryIntentActivities( Intent("com.android.onboarding.nodes.testing.testapp.red"), ResolveInfoFlags.of(0), ) .map { it.activityInfo.packageName } .toSet() .toList() val packageNames = packages .map { packageManager.getApplicationLabel(packageManager.getApplicationInfo(it, 0)) } .toList() processSpinner.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, packageNames) processSpinner.setSelection(packages.indexOf(packageName)) val contractSpinner = checkNotNull(findViewById(R.id.contractSpinner)) contractSpinner.adapter = ArrayAdapter( this, android.R.layout.simple_spinner_dropdown_item, contracts.map(OnboardingActivityApiContract<*, *>::metadata).map(OnboardingNode::name), ) contractSpinner.setSelection(contracts.indexOf(contract)) val noResultLaunchers = contracts.map { registerForActivityLaunch(it) } val resultLaunchers = contracts.map { registerForActivityResult(it, this::onResult) } checkNotNull(findViewById(R.id.packageName)).text = packageManager.getApplicationLabel(packageManager.getApplicationInfo(packageName, 0)) checkNotNull(findViewById(R.id.bg)).setBackgroundColor(contract.colour) when (contract) { is RedContract -> { checkNotNull(findViewById(R.id.bg)).setBackgroundColor(Color.RED) } is BlueContract -> { checkNotNull(findViewById(R.id.bg)).setBackgroundColor(Color.BLUE) } is GreenContract -> { checkNotNull(findViewById(R.id.bg)).setBackgroundColor(Color.GREEN) } } checkNotNull(findViewById