1 package com.android.onboarding.tasks
2 
3 import java.util.concurrent.ConcurrentHashMap
4 
5 /**
6  * Manages the states of onboarding tasks in a centralized and thread-safe manner.
7  *
8  * [OnboardingTaskStateManager] allows you to track/update the progress and results of individual
9  * onboarding tasks, identified by unique [OnboardingTaskToken] instances.
10  */
11 class OnboardingTaskStateManager {
12 
13   private val taskStates = ConcurrentHashMap<OnboardingTaskToken, OnboardingTaskState<*>>()
14 
15   /**
16    * Updates the state of an onboarding task.
17    *
18    * @param token The [OnboardingTaskToken] identifying the task.
19    * @param state The updated [OnboardingTaskState] object representing the task's new state. The
20    *   type of the result within the state object is flexible.
21    */
updateTaskStatenull22   fun updateTaskState(token: OnboardingTaskToken, state: OnboardingTaskState<*>) {
23     taskStates[token] = state
24   }
25 
26   /**
27    * Retrieves the current state of an onboarding task.
28    *
29    * @param token The [OnboardingTaskToken] identifying the task.
30    * @return The [OnboardingTaskState] object associated with the task. If no state is found for the
31    *   provided token, a [OnboardingTaskState.Failed] with the error message
32    *   [ERROR_TASK_CANT_BE_FOUND] is returned.
33    */
getTaskStatenull34   fun <ResultT> getTaskState(token: OnboardingTaskToken): OnboardingTaskState<ResultT> {
35     return taskStates[token] as? OnboardingTaskState<ResultT>
36       ?: OnboardingTaskState.Failed<ResultT>(ERROR_TASK_CANT_BE_FOUND)
37   }
38 }
39