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