1 package com.android.onboarding.bedsteadonboarding.fakes
2 
3 import android.content.ContentValues
4 import android.content.Context
5 import android.os.Build
6 import com.android.onboarding.bedsteadonboarding.contractutils.ContractUtils
7 import com.android.onboarding.bedsteadonboarding.providers.ConfigProviderUtil
8 import com.android.onboarding.contracts.ContractResult
9 import com.android.onboarding.contracts.OnboardingActivityApiContract
10 import com.google.errorprone.annotations.CanIgnoreReturnValue
11 import kotlin.reflect.KClass
12 
13 /** Represents a fake activity node. */
14 class FakeActivityNode<I, O>(
15   val appsStoringFakeNodeConfig: Set<String>,
16   val activityNode: KClass<out OnboardingActivityApiContract<I, O>>,
17   val context: Context,
18 ) {
19 
20   /**
21    * Stores the [ActivityResult] to return when the activity node identified by [this] is faked and
22    * is attempted to be executed for result.
23    *
24    * @param contractResult The [ActivityResult] to return
25    */
26   @CanIgnoreReturnValue
returnsResultnull27   fun returnsResult(contractResult: ContractResult): FakeActivityNode<I, O> {
28     val bundle =
29       when (contractResult) {
30         is ContractResult.Success,
31         is ContractResult.Failure ->
32           FakeActivityNodeHelper.createBundleFromContractResultAndIdentifier(
33             contractResult,
34             ContractUtils.getContractIdentifier(activityNode.java),
35           )
36         else ->
37           error(
38             "Unsupported Contract Result type $contractResult for fake node ${activityNode.simpleName}"
39           )
40       }
41 
42     // Since passing of bundle to [ContentResolver#insert] is supported from API level 30.
43     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
44       error("Faking response of activity node is not supported for Android API level < 30")
45     }
46 
47     // Insert bundle to all packages storing test configurations.
48     for (appStoringConfig in appsStoringFakeNodeConfig) {
49       val uri =
50         ConfigProviderUtil.getFakeActivityNodeConfigInsertionUri(packageName = appStoringConfig)
51       context.contentResolver.insert(uri, ContentValues(), bundle)
52     }
53 
54     return this
55   }
56 }
57