1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.managedprovisioning;
18 
19 import static com.android.managedprovisioning.ManagedProvisioningScreens.ADMIN_INTEGRATED_PREPARE;
20 import static com.android.managedprovisioning.ManagedProvisioningScreens.ENCRYPT;
21 import static com.android.managedprovisioning.ManagedProvisioningScreens.FINALIZATION_INSIDE_SUW;
22 import static com.android.managedprovisioning.ManagedProvisioningScreens.FINANCED_DEVICE_LANDING;
23 import static com.android.managedprovisioning.ManagedProvisioningScreens.LANDING;
24 import static com.android.managedprovisioning.ManagedProvisioningScreens.POST_ENCRYPT;
25 import static com.android.managedprovisioning.ManagedProvisioningScreens.PRE_PROVISIONING;
26 import static com.android.managedprovisioning.ManagedProvisioningScreens.PROVISIONING;
27 import static com.android.managedprovisioning.ManagedProvisioningScreens.RESET_AND_RETURN_DEVICE;
28 import static com.android.managedprovisioning.ManagedProvisioningScreens.TERMS;
29 import static com.android.managedprovisioning.ManagedProvisioningScreens.WEB;
30 
31 import android.app.Activity;
32 
33 import com.android.managedprovisioning.finalization.FinalizationInsideSuwActivity;
34 import com.android.managedprovisioning.preprovisioning.EncryptDeviceActivity;
35 import com.android.managedprovisioning.preprovisioning.PostEncryptionActivity;
36 import com.android.managedprovisioning.preprovisioning.PreProvisioningActivity;
37 import com.android.managedprovisioning.preprovisioning.WebActivity;
38 import com.android.managedprovisioning.preprovisioning.terms.TermsActivity;
39 import com.android.managedprovisioning.provisioning.AdminIntegratedFlowPrepareActivity;
40 import com.android.managedprovisioning.provisioning.FinancedDeviceLandingActivity;
41 import com.android.managedprovisioning.provisioning.LandingActivity;
42 import com.android.managedprovisioning.provisioning.ProvisioningActivity;
43 import com.android.managedprovisioning.provisioning.ResetAndReturnDeviceActivity;
44 
45 import java.util.HashMap;
46 import java.util.Map;
47 
48 /**
49  * A manager for the mapping between {@link ManagedProvisioningScreens} and {@link Activity}.
50  *
51  * <p>By default, all {@link ManagedProvisioningScreens} map to the base {@code ManagedProvisioning}
52  * screens. {@code ManagedProvisioning} inheritors can call {@link
53  * #setOverrideActivity(ManagedProvisioningScreens, Class)} if they want the screens to map to
54  * their own {@link Activity} implementations.
55  */
56 final class ScreenManager {
57     static final Map<ManagedProvisioningScreens, Class<? extends Activity>>
58             DEFAULT_SCREEN_TO_ACTIVITY_MAP = createBaseScreenMap();
59 
60     private final Map<ManagedProvisioningScreens, Class<? extends Activity>> mScreenToActivityMap;
61 
ScreenManager(Map<ManagedProvisioningScreens, Class<? extends Activity>> screenToActivityMap)62     ScreenManager(Map<ManagedProvisioningScreens, Class<? extends Activity>> screenToActivityMap) {
63         mScreenToActivityMap = new HashMap<>(screenToActivityMap);
64         validateEachScreenHasMapping();
65     }
66 
67     /**
68      * Maps the provided {@code screen} to the provided {@code activityClass}.
69      *
70      * <p>When ManagedProvisioning wants to launch any of the screens in {@link
71      * ManagedProvisioningScreens}, instead of its base {@link Activity} implementation, it will
72      * launch the class provided here.
73      */
setOverrideActivity(ManagedProvisioningScreens screen, Class<? extends Activity> newClass)74     public void setOverrideActivity(ManagedProvisioningScreens screen,
75             Class<? extends Activity> newClass) {
76         mScreenToActivityMap.put(screen, newClass);
77     }
78 
79     /**
80      * Retrieves the {@link Activity} class associated with the provided {@code screen}.
81      *
82      * <p>If no screens were set via {@link #setOverrideActivity(ManagedProvisioningScreens,
83      * Class)}, the base ManagedProvisioning {@link Activity} implementation will be returned.
84      */
getActivityClassForScreen(ManagedProvisioningScreens screen)85     public Class<? extends Activity> getActivityClassForScreen(ManagedProvisioningScreens screen) {
86         return mScreenToActivityMap.get(screen);
87     }
88 
89     private static Map<ManagedProvisioningScreens, Class<? extends Activity>>
createBaseScreenMap()90             createBaseScreenMap() {
91         Map<ManagedProvisioningScreens, Class<? extends Activity>> map =
92                 new HashMap<>(ManagedProvisioningScreens.values().length);
93         map.put(LANDING, LandingActivity.class);
94         map.put(PRE_PROVISIONING, PreProvisioningActivity.class);
95         map.put(PROVISIONING, ProvisioningActivity.class);
96         map.put(ADMIN_INTEGRATED_PREPARE, AdminIntegratedFlowPrepareActivity.class);
97         map.put(RESET_AND_RETURN_DEVICE, ResetAndReturnDeviceActivity.class);
98         map.put(WEB, WebActivity.class);
99         map.put(ENCRYPT, EncryptDeviceActivity.class);
100         map.put(POST_ENCRYPT, PostEncryptionActivity.class);
101         map.put(FINALIZATION_INSIDE_SUW, FinalizationInsideSuwActivity.class);
102         map.put(TERMS, TermsActivity.class);
103         map.put(FINANCED_DEVICE_LANDING, FinancedDeviceLandingActivity.class);
104         return map;
105     }
106 
107     /**
108      * Makes sure that each entry in {@link ManagedProvisioningScreens} has a corresponding entry
109      * in the map.
110      */
validateEachScreenHasMapping()111     private void validateEachScreenHasMapping() {
112         for (ManagedProvisioningScreens screen : ManagedProvisioningScreens.values()) {
113             if (!mScreenToActivityMap.containsKey(screen)) {
114                 throw new IllegalStateException("Screen " + screen + " has no mapping.");
115             }
116         }
117     }
118 }
119