1 /*
2  * Copyright (C) 2017 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 package com.android.managedprovisioning.preprovisioning;
17 
18 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE;
19 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME;
20 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOGO_URI;
21 
22 import static com.android.managedprovisioning.e2eui.ManagedProfileAdminReceiver.COMPONENT_NAME;
23 
24 import static org.mockito.ArgumentMatchers.any;
25 import static org.mockito.Mockito.when;
26 
27 import android.app.Activity;
28 import android.content.Intent;
29 import android.graphics.Color;
30 
31 import androidx.test.filters.SmallTest;
32 import androidx.test.rule.ActivityTestRule;
33 
34 import com.android.managedprovisioning.TestInstrumentationRunner;
35 import com.android.managedprovisioning.TestUtils;
36 import com.android.managedprovisioning.analytics.TimeLogger;
37 import com.android.managedprovisioning.common.CustomizationVerifier;
38 import com.android.managedprovisioning.common.GetProvisioningModeUtils;
39 import com.android.managedprovisioning.common.ManagedProvisioningSharedPreferences;
40 import com.android.managedprovisioning.common.PolicyComplianceUtils;
41 import com.android.managedprovisioning.common.SettingsFacade;
42 import com.android.managedprovisioning.common.ThemeHelper;
43 import com.android.managedprovisioning.common.ThemeHelper.DefaultNightModeChecker;
44 import com.android.managedprovisioning.common.ThemeHelper.DefaultSetupWizardBridge;
45 import com.android.managedprovisioning.common.UriBitmap;
46 import com.android.managedprovisioning.common.Utils;
47 import com.android.managedprovisioning.parser.DisclaimersParserImpl;
48 import com.android.managedprovisioning.parser.MessageParser;
49 import com.android.managedprovisioning.preprovisioning.terms.TermsActivity;
50 
51 import org.junit.AfterClass;
52 import org.junit.Before;
53 import org.junit.Ignore;
54 import org.junit.Rule;
55 import org.junit.Test;
56 import org.junit.runner.RunWith;
57 import org.mockito.Mock;
58 import org.mockito.junit.MockitoJUnitRunner;
59 
60 import java.io.IOException;
61 
62 @SmallTest
63 @RunWith(MockitoJUnitRunner.class)
64 // TODO: Currently only color and logo functionality are covered. Fill in the rest (b/32131665).
65 public class PreProvisioningActivityTest {
66     private static final int DEFAULT_LOGO_COLOR = Color.rgb(99, 99, 99);
67 
68     @Mock
69     private Utils mUtils;
70 
71     @Rule
72     public ActivityTestRule<PreProvisioningActivity> mActivityRule = new ActivityTestRule<>(
73             PreProvisioningActivity.class, true, false);
74 
75     @Before
setup()76     public void setup() {
77         when(mUtils.getAccentColor(any())).thenReturn(DEFAULT_LOGO_COLOR);
78 
79         TestInstrumentationRunner.registerReplacedActivity(PreProvisioningActivity.class,
80                 (classLoader, className, intent) -> new PreProvisioningActivity(
81                         activity -> new PreProvisioningActivityController(
82                                 activity,
83                                 activity,
84                                 mUtils,
85                                 new SettingsFacade(),
86                                 new ManagedProvisioningSharedPreferences(activity),
87                                 new PolicyComplianceUtils(),
88                                 new GetProvisioningModeUtils(),
89                                 new PreProvisioningViewModel(
90                                         new TimeLogger(activity, 0 /* category */),
91                                         new MessageParser(activity),
92                                         TestUtils.createEncryptionController(activity)),
93                                 DisclaimersParserImpl::new
94                         ) {
95                             @Override
96                             protected boolean checkDevicePolicyPreconditions() {
97                                 return true;
98                             }
99 
100                             @Override
101                             protected boolean verifyActionAndCaller(Intent intent,
102                                     String caller) {
103                                 return true;
104                             }
105                         }, null,
106                         mUtils,
107                         new SettingsFacade(),
108                         new ThemeHelper(
109                                 new DefaultNightModeChecker(), new DefaultSetupWizardBridge())));
110     }
111 
112     @AfterClass
tearDownClass()113     public static void tearDownClass() {
114         TestInstrumentationRunner.unregisterReplacedActivity(TermsActivity.class);
115     }
116 
117     @Ignore("b/181323689")
118     @Test
deviceOwnerDefaultLogo()119     public void deviceOwnerDefaultLogo() {
120         Activity activity = mActivityRule.launchActivity(
121                 createIntent(ACTION_PROVISION_MANAGED_DEVICE));
122         CustomizationVerifier v = new CustomizationVerifier(activity);
123 
124         v.assertDefaultLogoCorrect(DEFAULT_LOGO_COLOR);
125     }
126 
127     @Ignore("b/181323689")
128     @Test
deviceOwnerCustomLogo()129     public void deviceOwnerCustomLogo() throws IOException {
130         UriBitmap expectedLogo = UriBitmap.createSimpleInstance();
131 
132         Activity activity = mActivityRule.launchActivity(
133                 createIntent(ACTION_PROVISION_MANAGED_DEVICE)
134                         .putExtra(EXTRA_PROVISIONING_LOGO_URI, expectedLogo.getUri()));
135         CustomizationVerifier v = new CustomizationVerifier(activity);
136 
137         v.assertCustomLogoCorrect(expectedLogo.getBitmap());
138     }
139 
createIntent(String provisioningAction)140     private Intent createIntent(String provisioningAction) {
141         Intent intent = new Intent(provisioningAction).putExtra(
142                 EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, COMPONENT_NAME);
143         return intent;
144     }
145 }