1 /*
2  * Copyright (C) 2018 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.settings.enterprise;
18 
19 import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED;
20 
21 import static org.junit.Assert.assertEquals;
22 import static org.junit.Assert.assertNotNull;
23 import static org.junit.Assert.assertNull;
24 import static org.mockito.ArgumentMatchers.any;
25 import static org.mockito.ArgumentMatchers.anyInt;
26 import static org.mockito.Mockito.mock;
27 import static org.mockito.Mockito.never;
28 import static org.mockito.Mockito.verify;
29 
30 import android.app.Activity;
31 import android.app.admin.DevicePolicyManager;
32 import android.content.ComponentName;
33 import android.content.pm.UserInfo;
34 import android.os.Process;
35 import android.os.UserHandle;
36 import android.os.UserManager;
37 import android.view.ViewGroup;
38 import android.widget.FrameLayout;
39 import android.widget.TextView;
40 
41 import androidx.appcompat.app.AlertDialog;
42 
43 import com.android.settings.R;
44 import com.android.settings.testutils.CustomActivity;
45 import com.android.settings.testutils.shadow.ShadowActivity;
46 import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
47 import com.android.settings.testutils.shadow.ShadowUserManager;
48 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
49 
50 import org.junit.Before;
51 import org.junit.Ignore;
52 import org.junit.Test;
53 import org.junit.runner.RunWith;
54 import org.robolectric.Robolectric;
55 import org.robolectric.RobolectricTestRunner;
56 import org.robolectric.RuntimeEnvironment;
57 import org.robolectric.Shadows;
58 import org.robolectric.annotation.Config;
59 import org.robolectric.shadow.api.Shadow;
60 import org.robolectric.shadows.ShadowProcess;
61 
62 @RunWith(RobolectricTestRunner.class)
63 @Config(shadows = {
64         ShadowDevicePolicyManager.class,
65         ShadowUserManager.class,
66         ShadowActivity.class
67 })
68 public class ActionDisabledByAdminDialogHelperTest {
69     private static final ComponentName ADMIN_COMPONENT =
70             new ComponentName("some.package.name", "some.package.name.SomeClass");
71     private static final int USER_ID = 123;
72     private static final EnforcedAdmin ENFORCED_ADMIN =
73             new EnforcedAdmin(ADMIN_COMPONENT, new UserHandle(USER_ID));
74     private ActionDisabledByAdminDialogHelper mHelper;
75     private Activity mActivity;
76     private org.robolectric.shadows.ShadowActivity mActivityShadow;
77 
78     @Before
setUp()79     public void setUp() {
80         mActivity = Robolectric.setupActivity(CustomActivity.class);
81         mActivityShadow = Shadow.extract(mActivity);
82         mHelper = new ActionDisabledByAdminDialogHelper(mActivity);
83     }
84 
85     @Ignore
86     @Test
testSetAdminSupportTitle()87     public void testSetAdminSupportTitle() {
88         final ViewGroup view = new FrameLayout(mActivity);
89         final TextView textView = createAdminSupportDialogTitleTextView(view, mActivity);
90 
91         mHelper.setAdminSupportTitle(view, UserManager.DISALLOW_ADJUST_VOLUME);
92         assertEquals(Shadows.shadowOf(textView).innerText(),
93                 mActivity.getString(R.string.disabled_by_policy_title_adjust_volume));
94 
95         mHelper.setAdminSupportTitle(view, UserManager.DISALLOW_OUTGOING_CALLS);
96         assertEquals(Shadows.shadowOf(textView).innerText(),
97                 mActivity.getString(R.string.disabled_by_policy_title_outgoing_calls));
98 
99         mHelper.setAdminSupportTitle(view, UserManager.DISALLOW_SMS);
100         assertEquals(Shadows.shadowOf(textView).innerText(),
101                 mActivity.getString(R.string.disabled_by_policy_title_sms));
102 
103         mHelper.setAdminSupportTitle(view, DevicePolicyManager.POLICY_DISABLE_CAMERA);
104         assertEquals(Shadows.shadowOf(textView).innerText(),
105                 mActivity.getString(R.string.disabled_by_policy_title_camera));
106 
107         mHelper.setAdminSupportTitle(view, DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE);
108         assertEquals(Shadows.shadowOf(textView).innerText(),
109                 mActivity.getString(R.string.disabled_by_policy_title_screen_capture));
110 
111         mHelper.setAdminSupportTitle(view, DevicePolicyManager.POLICY_SUSPEND_PACKAGES);
112         assertEquals(Shadows.shadowOf(textView).innerText(),
113                 mActivity.getString(R.string.disabled_by_policy_title_suspend_packages));
114 
115         mHelper.setAdminSupportTitle(view, "another restriction");
116         assertEquals(Shadows.shadowOf(textView).innerText(),
117                 mActivity.getString(R.string.disabled_by_policy_title));
118 
119         mHelper.setAdminSupportTitle(view, null);
120         assertEquals(Shadows.shadowOf(textView).innerText(),
121                 mActivity.getString(R.string.disabled_by_policy_title));
122     }
123 
124     @Test
testSetAdminSupportTitleForFinancedDevice()125     public void testSetAdminSupportTitleForFinancedDevice() {
126         final ShadowDevicePolicyManager dpmShadow = ShadowDevicePolicyManager.getShadow();
127         final ViewGroup view = new FrameLayout(mActivity);
128         final TextView textView = createAdminSupportDialogTitleTextView(view, mActivity);
129         setupFinancedDevice(dpmShadow);
130         mHelper = new ActionDisabledByAdminDialogHelper(mActivity);
131 
132         mHelper.setAdminSupportTitle(view, null);
133 
134         assertEquals(Shadows.shadowOf(textView).innerText(),
135                 mActivity.getString(R.string.disabled_by_policy_title_financed_device));
136     }
137 
138     @Test
testSetAdminSupportDetails()139     public void testSetAdminSupportDetails() {
140         final ShadowDevicePolicyManager dpmShadow = ShadowDevicePolicyManager.getShadow();
141         final UserManager userManager = RuntimeEnvironment.application.getSystemService(
142                 UserManager.class);
143         final ShadowUserManager userManagerShadow = Shadow.extract(userManager);
144         final ViewGroup view = new FrameLayout(mActivity);
145         final ComponentName component = new ComponentName("some.package.name",
146                 "some.package.name.SomeClass");
147         final EnforcedAdmin admin = new EnforcedAdmin(component, UserHandle.of(123));
148         final TextView textView = createAdminSupportTextView(view, mActivity);
149         dpmShadow.setShortSupportMessageForUser(component, 123, "some message");
150         dpmShadow.setIsAdminActiveAsUser(true);
151         createShadowWorkProfile(userManagerShadow);
152 
153         mHelper.setAdminSupportDetails(mActivity, view, admin);
154 
155         assertNotNull(admin.component);
156         assertEquals("some message", Shadows.shadowOf(textView).innerText());
157     }
158 
159     @Test
testSetAdminSupportDetails_shortSupportMessageIsNull()160     public void testSetAdminSupportDetails_shortSupportMessageIsNull() {
161         final ShadowDevicePolicyManager dpmShadow = ShadowDevicePolicyManager.getShadow();
162         final UserManager userManager = RuntimeEnvironment.application.getSystemService(
163                 UserManager.class);
164         final ShadowUserManager userManagerShadow = Shadow.extract(userManager);
165         final ViewGroup view = new FrameLayout(mActivity);
166         final ComponentName component = new ComponentName("some.package.name",
167                 "some.package.name.SomeClass");
168         final EnforcedAdmin admin = new EnforcedAdmin(component, UserHandle.of(123));
169         final TextView textView = createAdminSupportTextView(view, mActivity);
170         dpmShadow.setShortSupportMessageForUser(component, 123, null);
171         dpmShadow.setIsAdminActiveAsUser(true);
172         createShadowWorkProfile(userManagerShadow);
173 
174         mHelper.setAdminSupportDetails(mActivity, view, admin);
175 
176         assertNotNull(admin.component);
177         assertEquals(mActivity.getString(R.string.default_admin_support_msg),
178                 Shadows.shadowOf(textView).innerText());
179     }
180 
181     @Test
testSetAdminSupportDetailsNotAdmin()182     public void testSetAdminSupportDetailsNotAdmin() {
183         final ShadowDevicePolicyManager dpmShadow = ShadowDevicePolicyManager.getShadow();
184         final UserManager userManager = RuntimeEnvironment.application.getSystemService(
185                 UserManager.class);
186         final ShadowUserManager userManagerShadow = Shadow.extract(userManager);
187         final ViewGroup view = new FrameLayout(mActivity);
188         final ComponentName component = new ComponentName("some.package.name",
189                 "some.package.name.SomeClass");
190         final EnforcedAdmin admin = new EnforcedAdmin(component, UserHandle.of(123));
191         final TextView textView = createAdminSupportTextView(view, mActivity);
192         dpmShadow.setShortSupportMessageForUser(component, 123, "some message");
193         dpmShadow.setIsAdminActiveAsUser(false);
194         userManagerShadow.addProfile(new UserInfo(123, null, 0));
195 
196         mHelper.setAdminSupportDetails(mActivity, textView, admin);
197 
198         assertNull(admin.component);
199         assertEquals(mActivity.getString(R.string.default_admin_support_msg),
200                 Shadows.shadowOf(textView).innerText());
201     }
202 
203     @Ignore
204     @Test
testMaybeSetLearnMoreButton()205     public void testMaybeSetLearnMoreButton() {
206         UserManager userManager = RuntimeEnvironment.application
207                 .getSystemService(UserManager.class);
208         ShadowUserManager userManagerShadow = Shadow.extract(userManager);
209         // Set up for shadow call.
210         userManagerShadow.getSameProfileGroupIds().put(USER_ID, 0);
211 
212         // Test that the button is shown when user IDs are in the same profile group
213         AlertDialog.Builder builder = mock(AlertDialog.Builder.class);
214         mHelper.prepareDialogBuilder(builder, /* restriction= */ null, ENFORCED_ADMIN);
215         verify(builder).setNeutralButton(anyInt(), any());
216 
217         // Test that the button is not shown when user IDs are not in the same profile group
218         userManagerShadow.getSameProfileGroupIds().clear();
219         builder = mock(AlertDialog.Builder.class);
220         mHelper.prepareDialogBuilder(builder, /* restriction= */ null, ENFORCED_ADMIN);
221         verify(builder, never()).setNeutralButton(anyInt(), any());
222     }
223 
createAdminSupportDialogTitleTextView(final ViewGroup view, final Activity activity)224     private static TextView createAdminSupportDialogTitleTextView(final ViewGroup view,
225             final Activity activity) {
226         final TextView textView = new TextView(activity);
227         textView.setId(R.id.admin_support_dialog_title);
228         view.addView(textView);
229         return textView;
230     }
231 
createAdminSupportTextView(final ViewGroup view, final Activity activity)232     private static TextView createAdminSupportTextView(final ViewGroup view,
233             final Activity activity) {
234         final TextView textView = new TextView(activity);
235         textView.setId(R.id.admin_support_msg);
236         view.addView(textView);
237         return textView;
238     }
239 
createShadowWorkProfile(final ShadowUserManager userManagerShadow)240     private static void createShadowWorkProfile(final ShadowUserManager userManagerShadow) {
241         userManagerShadow.addProfile(new UserInfo(123, null, 0));
242         userManagerShadow.addUserProfile(new UserHandle(123));
243         ShadowProcess.setUid(Process.SYSTEM_UID);
244     }
245 
setupFinancedDevice(final ShadowDevicePolicyManager dpmShadow)246     private static void setupFinancedDevice(final ShadowDevicePolicyManager dpmShadow) {
247         final ComponentName component = new ComponentName("some.package.name",
248                 "some.package.name.SomeClass");
249         dpmShadow.setDeviceOwner(component);
250         dpmShadow.setDeviceOwnerComponentOnAnyUser(component);
251         dpmShadow.setDeviceOwnerType(component, DEVICE_OWNER_TYPE_FINANCED);
252         dpmShadow.setShortSupportMessageForUser(component, 123, null);
253         dpmShadow.setIsAdminActiveAsUser(true);
254     }
255 }
256