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 */ 16package com.android.settings.location; 17 18import static com.google.common.truth.Truth.assertThat; 19import static org.mockito.ArgumentMatchers.any; 20import static org.mockito.ArgumentMatchers.anyInt; 21import static org.mockito.Mockito.doReturn; 22import static org.mockito.Mockito.mock; 23import static org.mockito.Mockito.spy; 24import static org.mockito.Mockito.verify; 25import static org.mockito.Mockito.when; 26 27import android.arch.lifecycle.LifecycleOwner; 28import android.content.Context; 29import android.content.pm.UserInfo; 30import android.os.UserHandle; 31import android.os.UserManager; 32import android.provider.Settings; 33import android.support.v7.preference.PreferenceScreen; 34 35import com.android.settings.R; 36import com.android.settings.testutils.SettingsRobolectricTestRunner; 37import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; 38import com.android.settingslib.RestrictedSwitchPreference; 39import com.android.settingslib.core.lifecycle.Lifecycle; 40 41import org.junit.Before; 42import org.junit.Test; 43import org.junit.runner.RunWith; 44import org.mockito.Mock; 45import org.mockito.MockitoAnnotations; 46import org.robolectric.RuntimeEnvironment; 47import org.robolectric.util.ReflectionHelpers; 48 49import java.util.ArrayList; 50import java.util.List; 51 52@RunWith(SettingsRobolectricTestRunner.class) 53public class LocationForWorkPreferenceControllerTest { 54 55 @Mock 56 private RestrictedSwitchPreference mPreference; 57 @Mock 58 private PreferenceScreen mScreen; 59 @Mock 60 private UserManager mUserManager; 61 @Mock 62 private LocationEnabler mEnabler; 63 @Mock 64 private UserHandle mUserHandle; 65 66 private Context mContext; 67 private LocationForWorkPreferenceController mController; 68 private LifecycleOwner mLifecycleOwner; 69 private Lifecycle mLifecycle; 70 71 @Before 72 public void setUp() { 73 MockitoAnnotations.initMocks(this); 74 mContext = spy(RuntimeEnvironment.application); 75 when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); 76 mLifecycleOwner = () -> mLifecycle; 77 mLifecycle = new Lifecycle(mLifecycleOwner); 78 mController = spy(new LocationForWorkPreferenceController(mContext, mLifecycle)); 79 mockManagedProfile(); 80 ReflectionHelpers.setField(mController, "mLocationEnabler", mEnabler); 81 when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); 82 final String key = mController.getPreferenceKey(); 83 when(mPreference.getKey()).thenReturn(key); 84 when(mPreference.isVisible()).thenReturn(true); 85 } 86 87 @Test 88 public void handlePreferenceTreeClick_preferenceChecked_shouldSetRestrictionAndOnSummary() { 89 mController.displayPreference(mScreen); 90 when(mPreference.isChecked()).thenReturn(true); 91 92 mController.handlePreferenceTreeClick(mPreference); 93 94 verify(mUserManager) 95 .setUserRestriction(UserManager.DISALLOW_SHARE_LOCATION, false, mUserHandle); 96 verify(mPreference).setSummary(R.string.switch_on_text); 97 } 98 99 @Test 100 public void handlePreferenceTreeClick_preferenceUnchecked_shouldSetRestritionAndOffSummary() { 101 mController.displayPreference(mScreen); 102 when(mPreference.isChecked()).thenReturn(false); 103 104 mController.handlePreferenceTreeClick(mPreference); 105 106 verify(mUserManager) 107 .setUserRestriction(UserManager.DISALLOW_SHARE_LOCATION, true, mUserHandle); 108 verify(mPreference).setSummary(R.string.switch_off_text); 109 } 110 111 @Test 112 public void isAvailable_noManagedProfile_shouldReturnFalse() { 113 when(mUserManager.getUserProfiles()).thenReturn(new ArrayList<>()); 114 assertThat(mController.isAvailable()).isFalse(); 115 } 116 117 @Test 118 public void isAvailable_hasManagedProfile_shouldReturnTrue() { 119 assertThat(mController.isAvailable()).isTrue(); 120 } 121 122 @Test 123 public void onLocationModeChanged_disabledByAdmin_shouldDisablePreference() { 124 mController.displayPreference(mScreen); 125 final EnforcedAdmin admin = mock(EnforcedAdmin.class); 126 doReturn(admin).when(mEnabler).getShareLocationEnforcedAdmin(anyInt()); 127 doReturn(false).when(mEnabler).isManagedProfileRestrictedByBase(); 128 129 mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false); 130 131 verify(mPreference).setDisabledByAdmin(any()); 132 verify(mPreference).setChecked(false); 133 } 134 135 @Test 136 public void onLocationModeChanged_locationOff_shouldDisablePreference() { 137 mController.displayPreference(mScreen); 138 doReturn(null).when(mEnabler).getShareLocationEnforcedAdmin(anyInt()); 139 doReturn(false).when(mEnabler).isManagedProfileRestrictedByBase(); 140 141 mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_OFF, false); 142 143 verify(mPreference).setEnabled(false); 144 verify(mPreference).setChecked(false); 145 verify(mPreference).setSummary(R.string.switch_off_text); 146 } 147 148 @Test 149 public void onLocationModeChanged_locationOn_shouldEnablePreference() { 150 mController.displayPreference(mScreen); 151 doReturn(null).when(mEnabler).getShareLocationEnforcedAdmin(anyInt()); 152 doReturn(false).when(mEnabler).isManagedProfileRestrictedByBase(); 153 doReturn(true).when(mEnabler).isEnabled(anyInt()); 154 155 mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false); 156 157 verify(mPreference).setEnabled(true); 158 verify(mPreference).setSummary(R.string.switch_on_text); 159 } 160 161 @Test 162 public void onLocationModeChanged_noRestriction_shouldCheckedPreference() { 163 mController.displayPreference(mScreen); 164 doReturn(null).when(mEnabler).getShareLocationEnforcedAdmin(anyInt()); 165 doReturn(false).when(mEnabler).isManagedProfileRestrictedByBase(); 166 doReturn(true).when(mEnabler).isEnabled(anyInt()); 167 168 mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false); 169 170 verify(mPreference).setChecked(true); 171 } 172 173 @Test 174 public void onLocationModeChanged_hasRestriction_shouldCheckedPreference() { 175 mController.displayPreference(mScreen); 176 doReturn(null).when(mEnabler).getShareLocationEnforcedAdmin(anyInt()); 177 doReturn(true).when(mEnabler).isManagedProfileRestrictedByBase(); 178 179 mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false); 180 181 verify(mPreference).setChecked(false); 182 } 183 184 private void mockManagedProfile() { 185 final List<UserHandle> userProfiles = new ArrayList<>(); 186 when(mUserHandle.getIdentifier()).thenReturn(5); 187 userProfiles.add(mUserHandle); 188 when(mUserManager.getUserProfiles()).thenReturn(userProfiles); 189 when(mUserManager.getUserHandle()).thenReturn(1); 190 when(mUserManager.getUserInfo(5)) 191 .thenReturn(new UserInfo(5, "user 5", UserInfo.FLAG_MANAGED_PROFILE)); 192 } 193} 194