1 package com.android.onboarding.tasks.crossApp
2 
3 import android.content.Context
4 import com.android.onboarding.tasks.OnboardingTaskContract
5 import com.android.onboarding.tasks.OnboardingTaskStateManager
6 import com.android.onboarding.tasks.OnboardingTaskToken
7 
8 /**
9  * Manages the execution of cross-process tasks.
10  *
11  * This class facilitates the execution of tasks that need to run in a separate process. It provides
12  * methods for running tasks and query the tasks.
13  */
14 class CrossProcessTaskManager
15 private constructor(
16   private val appContext: Context,
17   private val taskStateManager: OnboardingTaskStateManager,
18 ) {
19 
20   fun <
21     TaskArgsT,
22     TaskResultT,
23     TaskContractT : OnboardingTaskContract<TaskArgsT, TaskResultT>,
runTasknull24   > runTask(contract: TaskContractT, args: TaskArgsT): OnboardingTaskToken {
25     val onboardingTaskServiceItem = OnboardingTaskServiceItem(appContext, taskStateManager)
26 
27     // Trigger cross process task.
28     val taskToken =
29       onboardingTaskServiceItem.runTask(contract as OnboardingTaskContract<Any?, Any?>, args)
30 
31     return taskToken
32   }
33 
34   companion object {
35     @Volatile // Mark as volatile for thread safety
36     private var instance: CrossProcessTaskManager? = null
37 
getInstancenull38     fun getInstance(
39       context: Context,
40       taskStateManager: OnboardingTaskStateManager,
41     ): CrossProcessTaskManager {
42       return instance
43         ?: synchronized(this) {
44           instance ?: CrossProcessTaskManager(context, taskStateManager).also { instance = it }
45         }
46     }
47   }
48 }
49