• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_FULLY_MANAGED_DEVICE;
22 import static com.android.managedprovisioning.provisioning.ProvisioningActivity.PROVISIONING_MODE_WORK_PROFILE_ON_ORG_OWNED_DEVICE;
23 
24 import static java.util.Objects.requireNonNull;
25 
26 import androidx.annotation.StringRes;
27 import androidx.annotation.VisibleForTesting;
28 
29 import com.android.managedprovisioning.R;
30 import com.android.managedprovisioning.model.ProvisioningParams;
31 import com.android.managedprovisioning.provisioning.ProvisioningActivity.ProvisioningMode;
32 import com.android.managedprovisioning.util.LazyStringResource;
33 
34 import com.google.common.collect.ImmutableList;
35 
36 import java.util.List;
37 
38 /**
39  * Utility class to get the corresponding wrapper that contains provisioning transition content.
40  */
41 public class ProvisioningModeWrapperProvider {
42     private final ProvisioningParams mParams;
43 
ProvisioningModeWrapperProvider(ProvisioningParams params)44     public ProvisioningModeWrapperProvider(ProvisioningParams params) {
45         this.mParams = requireNonNull(params);
46     }
47 
48     @VisibleForTesting
49     static final ProvisioningModeWrapper WORK_PROFILE_WRAPPER =
50             new ProvisioningModeWrapper(
51                     ImmutableList.of(
52                             new TransitionScreenWrapper(
53                                     R.string.work_profile_provisioning_step_1_header,
54                                     R.raw.separate_work_and_personal_animation),
55                             new TransitionScreenWrapper(
56                                     R.string.work_profile_provisioning_step_2_header,
57                                     R.raw.pause_work_apps_animation),
58                             new TransitionScreenWrapper(
59                                     R.string.work_profile_provisioning_step_3_header,
60                                     R.raw.not_private_animation)),
61                     R.string.work_profile_provisioning_summary);
62 
63     /**
64      * Return default provisioning mode wrapper depending on provisioning parameter.
65      */
getProvisioningModeWrapper( @rovisioningMode int provisioningMode, CharSequence deviceName)66     public ProvisioningModeWrapper getProvisioningModeWrapper(
67             @ProvisioningMode int provisioningMode,
68             CharSequence deviceName) {
69         switch (provisioningMode) {
70             case PROVISIONING_MODE_WORK_PROFILE:
71                 return WORK_PROFILE_WRAPPER;
72             case PROVISIONING_MODE_FULLY_MANAGED_DEVICE:
73                 return getProvisioningModeWrapperForFullyManaged(deviceName);
74             case PROVISIONING_MODE_WORK_PROFILE_ON_ORG_OWNED_DEVICE:
75                 return getProvisioningModeWrapperForCope(deviceName);
76             case PROVISIONING_MODE_WORK_PROFILE_ON_FULLY_MANAGED_DEVICE:
77                 // fall through
78         }
79         throw new IllegalStateException("Unexpected provisioning mode " + provisioningMode);
80     }
81 
82     @VisibleForTesting
getProvisioningModeWrapperForCope(CharSequence deviceName)83     private ProvisioningModeWrapper getProvisioningModeWrapperForCope(CharSequence deviceName) {
84         return new ProvisioningModeWrapper(
85                 ImmutableList.of(
86                         new TransitionScreenWrapper(
87                                 R.string.cope_provisioning_step_1_header,
88                                 R.raw.separate_work_and_personal_animation),
89                         new TransitionScreenWrapper(
90                                 R.string.cope_provisioning_step_2_header,
91                                 /* descriptionId= */ 0,
92                                 R.raw.personal_apps_separate_hidden_from_work_animation,
93                                 /* shouldLoop= */ false),
94                         new TransitionScreenWrapper(
95                                 R.string.cope_provisioning_step_3_header,
96                                 R.raw.it_admin_control_device_block_apps_animation)),
97                 LazyStringResource.of(R.string.cope_provisioning_summary, deviceName));
98     }
99 
100     /**
101      * Return the provisioning mode wrapper for a fully-managed device.
102      * The second screen, as well as the accessible summary, will be different, depending on whether
103      * the admin can grant sensors-related permissions on this device or not.
104      */
105     @VisibleForTesting
getProvisioningModeWrapperForFullyManaged( CharSequence deviceName)106     private ProvisioningModeWrapper getProvisioningModeWrapperForFullyManaged(
107             CharSequence deviceName) {
108         final LazyStringResource provisioningSummary;
109         TransitionScreenWrapper.Builder secondScreenBuilder =
110                 new TransitionScreenWrapper.Builder()
111                         .setHeader(
112                                 LazyStringResource.of(
113                                         R.string.fully_managed_device_provisioning_step_2_header,
114                                         deviceName));
115 
116         // Admin cannot grant sensors permissions
117         if (!mParams.deviceOwnerPermissionGrantOptOut) {
118             var subHeader = LazyStringResource.of(
119                     R.string.fully_managed_device_provisioning_permissions_subheader,
120                     deviceName);
121             var secondarySubHeader = LazyStringResource.of(
122                     R.string.fully_managed_device_provisioning_permissions_secondary_subheader,
123                     deviceName);
124             secondScreenBuilder
125                     .setSubHeaderTitle(
126                             R.string.fully_managed_device_provisioning_permissions_header)
127                     .setSubHeader(subHeader)
128                     .setSubHeaderIcon(R.drawable.ic_history)
129                     .setSecondarySubHeaderTitle(
130                             R.string.fully_managed_device_provisioning_permissions_secondary_header)
131                     .setSecondarySubHeader(secondarySubHeader)
132                     .setSecondarySubHeaderIcon(R.drawable.ic_perm_device_information)
133                     .setShouldLoop(true);
134             provisioningSummary = LazyStringResource.of(
135                     R.string.fully_managed_device_with_permission_control_provisioning_summary,
136                     deviceName);
137         } else {
138             provisioningSummary =
139                     LazyStringResource.of(R.string.fully_managed_device_provisioning_summary,
140                             deviceName);
141             secondScreenBuilder
142                     .setDescription(LazyStringResource.of(
143                             R.string.fully_managed_device_provisioning_step_2_subheader,
144                             deviceName))
145                     .setAnimation(R.raw.not_private_animation);
146         }
147 
148         TransitionScreenWrapper firstScreen =
149                 new TransitionScreenWrapper(
150                         R.string.fully_managed_device_provisioning_step_1_header,
151                         R.raw.connect_on_the_go_animation);
152         return new ProvisioningModeWrapper(
153                 ImmutableList.of(firstScreen, secondScreenBuilder.build()), provisioningSummary);
154     }
155 
156     static final class ProvisioningModeWrapper {
157         final List<TransitionScreenWrapper> mTransitions;
158         final LazyStringResource mSummary;
159 
ProvisioningModeWrapper(List<TransitionScreenWrapper> transitions, LazyStringResource summary)160         ProvisioningModeWrapper(List<TransitionScreenWrapper> transitions,
161                                 LazyStringResource summary) {
162             this.mTransitions = requireNonNull(transitions);
163             this.mSummary = summary;
164         }
165 
ProvisioningModeWrapper(List<TransitionScreenWrapper> transitions, @StringRes int summaryId)166         ProvisioningModeWrapper(List<TransitionScreenWrapper> transitions,
167                                 @StringRes int summaryId) {
168             this(transitions, LazyStringResource.of(summaryId));
169         }
170     }
171 }
172