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 package com.android.settings.accounts; 17 18 import static android.provider.Settings.Secure.MANAGED_PROFILE_CONTACT_REMOTE_SEARCH; 19 20 import static com.google.common.truth.Truth.assertThat; 21 22 import static org.mockito.ArgumentMatchers.any; 23 import static org.mockito.ArgumentMatchers.anyInt; 24 import static org.mockito.Mockito.spy; 25 import static org.mockito.Mockito.verify; 26 import static org.mockito.Mockito.when; 27 28 import android.content.Context; 29 import android.content.pm.UserInfo; 30 import android.os.UserHandle; 31 import android.os.UserManager; 32 import android.provider.Settings; 33 34 import androidx.test.core.app.ApplicationProvider; 35 36 import com.android.settingslib.RestrictedSwitchPreference; 37 38 import org.junit.Before; 39 import org.junit.Test; 40 import org.junit.runner.RunWith; 41 import org.mockito.Mock; 42 import org.mockito.MockitoAnnotations; 43 import org.robolectric.RobolectricTestRunner; 44 45 import java.util.Collections; 46 47 @RunWith(RobolectricTestRunner.class) 48 public class ContactSearchPreferenceControllerTest { 49 50 private static final String PREF_KEY = "contacts_search"; 51 private static final int MANAGED_USER_ID = 10; 52 53 private Context mContext; 54 private ContactSearchPreferenceController mController; 55 private RestrictedSwitchPreference mPreference; 56 57 @Mock 58 private UserHandle mManagedUser; 59 @Mock 60 private UserManager mUserManager; 61 @Mock 62 private UserInfo mUserInfo; 63 64 @Before setUp()65 public void setUp() { 66 MockitoAnnotations.initMocks(this); 67 mContext = spy(ApplicationProvider.getApplicationContext()); 68 when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager); 69 mPreference = spy(new RestrictedSwitchPreference(mContext)); 70 when(mUserInfo.isManagedProfile()).thenReturn(true); 71 when(mUserManager.getUserInfo(anyInt())).thenReturn(mUserInfo); 72 when(mUserManager.getProcessUserId()).thenReturn(0); 73 when(mUserManager.getUserProfiles()).thenReturn(Collections.singletonList(mManagedUser)); 74 when(mManagedUser.getIdentifier()).thenReturn(MANAGED_USER_ID); 75 mController = new ContactSearchPreferenceController(mContext, PREF_KEY); 76 } 77 78 @Test getAvailabilityStatus_noManagedUser_DISABLED()79 public void getAvailabilityStatus_noManagedUser_DISABLED() { 80 when(mUserManager.getProcessUserId()).thenReturn(MANAGED_USER_ID); 81 mController = new ContactSearchPreferenceController(mContext, PREF_KEY); 82 83 assertThat(mController.getAvailabilityStatus()) 84 .isNotEqualTo(ContactSearchPreferenceController.AVAILABLE); 85 } 86 87 @Test getAvailabilityStatus_hasManagedUser_AVAILABLE()88 public void getAvailabilityStatus_hasManagedUser_AVAILABLE() { 89 assertThat(mController.getAvailabilityStatus()) 90 .isEqualTo(ContactSearchPreferenceController.AVAILABLE); 91 } 92 93 @Test updateState_shouldRefreshContent()94 public void updateState_shouldRefreshContent() { 95 Settings.Secure.putIntForUser(mContext.getContentResolver(), 96 MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 0, MANAGED_USER_ID); 97 98 mController.updateState(mPreference); 99 100 assertThat(mPreference.isChecked()).isFalse(); 101 102 Settings.Secure.putIntForUser(mContext.getContentResolver(), 103 MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 1, MANAGED_USER_ID); 104 105 mController.updateState(mPreference); 106 107 assertThat(mPreference.isChecked()).isTrue(); 108 } 109 110 @Test updateState_preferenceShouldBeDisabled()111 public void updateState_preferenceShouldBeDisabled() { 112 mController.updateState(mPreference); 113 114 verify(mPreference).setDisabledByAdmin(any()); 115 } 116 117 @Test onPreferenceChange_shouldUpdateProviderValue()118 public void onPreferenceChange_shouldUpdateProviderValue() { 119 mController.onPreferenceChange(mPreference, false); 120 121 assertThat(Settings.Secure.getIntForUser(mContext.getContentResolver(), 122 MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 1, MANAGED_USER_ID)) 123 .isEqualTo(0); 124 125 mController.onPreferenceChange(mPreference, true); 126 127 assertThat(Settings.Secure.getIntForUser(mContext.getContentResolver(), 128 MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 0, MANAGED_USER_ID)) 129 .isEqualTo(1); 130 } 131 132 @Test onQuietModeDisabled_preferenceEnabled()133 public void onQuietModeDisabled_preferenceEnabled() { 134 when(mUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(false); 135 136 mController.updateState(mPreference); 137 138 assertThat(mPreference.isEnabled()).isTrue(); 139 } 140 141 @Test onQuietModeEnabled_preferenceDisabledAndUnchecked()142 public void onQuietModeEnabled_preferenceDisabledAndUnchecked() { 143 when(mUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(true); 144 145 mController.updateState(mPreference); 146 147 assertThat(mPreference.isEnabled()).isFalse(); 148 assertThat(mPreference.isChecked()).isFalse(); 149 } 150 151 @Test afterQuietModeTurnedOnAndOffWhenPreferenceChecked_toggleCheckedAndEnabled()152 public void afterQuietModeTurnedOnAndOffWhenPreferenceChecked_toggleCheckedAndEnabled() { 153 Settings.Secure.putIntForUser(mContext.getContentResolver(), 154 MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 1, MANAGED_USER_ID); 155 when(mUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(true); 156 157 mController.updateState(mPreference); 158 159 assertThat(mPreference.isEnabled()).isFalse(); 160 assertThat(mPreference.isChecked()).isFalse(); 161 162 when(mUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(false); 163 164 mController.updateState(mPreference); 165 166 assertThat(mPreference.isEnabled()).isTrue(); 167 assertThat(mPreference.isChecked()).isTrue(); 168 } 169 170 @Test afterQuietModeTurnedOnAndOffWhenPreferenceUnchecked_toggleUncheckedAndEnabled()171 public void afterQuietModeTurnedOnAndOffWhenPreferenceUnchecked_toggleUncheckedAndEnabled() { 172 Settings.Secure.putIntForUser(mContext.getContentResolver(), 173 MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 0, MANAGED_USER_ID); 174 when(mUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(true); 175 176 mController.updateState(mPreference); 177 178 assertThat(mPreference.isEnabled()).isFalse(); 179 assertThat(mPreference.isChecked()).isFalse(); 180 181 when(mUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(false); 182 183 mController.updateState(mPreference); 184 185 assertThat(mPreference.isEnabled()).isTrue(); 186 assertThat(mPreference.isChecked()).isFalse(); 187 } 188 } 189