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