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.provisioning; 18 19 import static com.android.managedprovisioning.provisioning.ProvisioningActivity.PROVISIONING_MODE_FULLY_MANAGED_DEVICE; 20 import static com.android.managedprovisioning.provisioning.ProvisioningActivity.PROVISIONING_MODE_WORK_PROFILE; 21 import static com.android.managedprovisioning.provisioning.ProvisioningActivity.PROVISIONING_MODE_WORK_PROFILE_ON_ORG_OWNED_DEVICE; 22 23 import static java.util.Objects.requireNonNull; 24 25 import androidx.annotation.StringRes; 26 import androidx.annotation.VisibleForTesting; 27 28 import com.android.managedprovisioning.R; 29 import com.android.managedprovisioning.model.ProvisioningParams; 30 import com.android.managedprovisioning.provisioning.ProvisioningActivity.ProvisioningMode; 31 32 /** 33 * Utility class to get the corresponding wrapper that contains provisioning transition content. 34 */ 35 public class ProvisioningModeWrapperProvider { 36 private final ProvisioningParams mParams; 37 ProvisioningModeWrapperProvider(ProvisioningParams params)38 public ProvisioningModeWrapperProvider(ProvisioningParams params) { 39 mParams = requireNonNull(params); 40 } 41 42 @VisibleForTesting 43 static final ProvisioningModeWrapper WORK_PROFILE_WRAPPER = 44 new ProvisioningModeWrapper(new TransitionScreenWrapper[] { 45 new TransitionScreenWrapper(R.string.work_profile_provisioning_step_1_header, 46 R.raw.separate_work_and_personal_animation), 47 new TransitionScreenWrapper(R.string.work_profile_provisioning_step_2_header, 48 R.raw.pause_work_apps_animation), 49 new TransitionScreenWrapper(R.string.work_profile_provisioning_step_3_header, 50 R.raw.not_private_animation) 51 }, R.string.work_profile_provisioning_summary); 52 53 @VisibleForTesting 54 static final ProvisioningModeWrapper WORK_PROFILE_ON_ORG_OWNED_DEVICE_WRAPPER = 55 new ProvisioningModeWrapper(new TransitionScreenWrapper[] { 56 new TransitionScreenWrapper(R.string.cope_provisioning_step_1_header, 57 R.raw.separate_work_and_personal_animation), 58 new TransitionScreenWrapper(R.string.cope_provisioning_step_2_header, 59 /* description= */ 0, 60 R.raw.personal_apps_separate_hidden_from_work_animation, 61 /* shouldLoop */ false), 62 new TransitionScreenWrapper(R.string.cope_provisioning_step_3_header, 63 R.raw.it_admin_control_device_block_apps_animation) 64 }, R.string.cope_provisioning_summary); 65 66 /** 67 * Return default provisioning mode wrapper depending on provisioning parameter. 68 */ getProvisioningModeWrapper( @rovisioningMode int provisioningMode)69 public ProvisioningModeWrapper getProvisioningModeWrapper( 70 @ProvisioningMode int provisioningMode) { 71 switch (provisioningMode) { 72 case PROVISIONING_MODE_WORK_PROFILE: 73 return WORK_PROFILE_WRAPPER; 74 case PROVISIONING_MODE_FULLY_MANAGED_DEVICE: 75 return getProvisioningModeWrapperForFullyManaged(); 76 case PROVISIONING_MODE_WORK_PROFILE_ON_ORG_OWNED_DEVICE: 77 return WORK_PROFILE_ON_ORG_OWNED_DEVICE_WRAPPER; 78 } 79 throw new IllegalStateException("Unexpected provisioning mode " + provisioningMode); 80 } 81 82 /** Return the provisioning mode wrapper for a fully-managed device. 83 * The second screen, as well as the accessible summary, will be different, depending on whether 84 * the admin can grant sensors-related permissions on this device or not. 85 */ 86 @VisibleForTesting getProvisioningModeWrapperForFullyManaged()87 private ProvisioningModeWrapper getProvisioningModeWrapperForFullyManaged() { 88 final int provisioningSummaryId; 89 TransitionScreenWrapper.Builder secondScreenBuilder = 90 new TransitionScreenWrapper.Builder() 91 .setHeader(R.string.fully_managed_device_provisioning_step_2_header); 92 93 // Admin cannot grant sensors permissions 94 if (!mParams.deviceOwnerPermissionGrantOptOut) { 95 secondScreenBuilder 96 .setSubHeaderTitle( 97 R.string.fully_managed_device_provisioning_permissions_header) 98 .setSubHeader(R.string.fully_managed_device_provisioning_permissions_subheader) 99 .setSubHeaderIcon(R.drawable.ic_history) 100 .setSecondarySubHeaderTitle( 101 R.string.fully_managed_device_provisioning_permissions_secondary_header) 102 .setSecondarySubHeader(R.string 103 .fully_managed_device_provisioning_permissions_secondary_subheader) 104 .setSecondarySubHeaderIcon(R.drawable.ic_perm_device_information) 105 .setShouldLoop(true); 106 provisioningSummaryId = 107 R.string.fully_managed_device_with_permission_control_provisioning_summary; 108 } else { 109 provisioningSummaryId = R.string.fully_managed_device_provisioning_summary; 110 secondScreenBuilder 111 .setDescription(R.string.fully_managed_device_provisioning_step_2_subheader) 112 .setAnimation(R.raw.not_private_animation); 113 } 114 115 TransitionScreenWrapper firstScreen = new TransitionScreenWrapper( 116 R.string.fully_managed_device_provisioning_step_1_header, 117 R.raw.connect_on_the_go_animation); 118 return new ProvisioningModeWrapper(new TransitionScreenWrapper[] { 119 firstScreen, secondScreenBuilder.build()}, provisioningSummaryId); 120 } 121 122 static final class ProvisioningModeWrapper { 123 final TransitionScreenWrapper[] transitions; 124 final @StringRes int summary; 125 ProvisioningModeWrapper(TransitionScreenWrapper[] transitions, @StringRes int summary)126 ProvisioningModeWrapper(TransitionScreenWrapper[] transitions, @StringRes int summary) { 127 this.transitions = requireNonNull(transitions); 128 this.summary = summary; 129 } 130 } 131 } 132