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 17 package com.android.settings.deviceinfo; 18 19 import static android.content.Context.CLIPBOARD_SERVICE; 20 21 import static com.google.common.truth.Truth.assertThat; 22 23 import static org.mockito.ArgumentMatchers.anyInt; 24 import static org.mockito.Mockito.doNothing; 25 import static org.mockito.Mockito.doReturn; 26 import static org.mockito.Mockito.spy; 27 import static org.mockito.Mockito.verify; 28 import static org.mockito.Mockito.when; 29 30 import android.content.ClipData; 31 import android.content.ClipboardManager; 32 import android.content.Context; 33 import android.os.Looper; 34 import android.telephony.SubscriptionInfo; 35 import android.telephony.SubscriptionManager; 36 import android.telephony.TelephonyManager; 37 38 import androidx.preference.Preference; 39 import androidx.preference.PreferenceCategory; 40 import androidx.preference.PreferenceManager; 41 import androidx.preference.PreferenceScreen; 42 import androidx.test.annotation.UiThreadTest; 43 import androidx.test.core.app.ApplicationProvider; 44 import androidx.test.ext.junit.runners.AndroidJUnit4; 45 46 import com.android.settings.core.BasePreferenceController; 47 import com.android.settings.testutils.ResourcesUtils; 48 49 import org.junit.Before; 50 import org.junit.Test; 51 import org.junit.runner.RunWith; 52 import org.mockito.ArgumentCaptor; 53 import org.mockito.Mock; 54 import org.mockito.MockitoAnnotations; 55 56 import java.util.ArrayList; 57 import java.util.List; 58 59 @RunWith(AndroidJUnit4.class) 60 public class PhoneNumberPreferenceControllerTest { 61 62 private Preference mPreference; 63 @Mock 64 private Preference mSecondPreference; 65 @Mock 66 private TelephonyManager mTelephonyManager; 67 @Mock 68 private SubscriptionInfo mSubscriptionInfo; 69 @Mock 70 private SubscriptionManager mSubscriptionManager; 71 private PreferenceScreen mScreen; 72 private PreferenceCategory mCategory; 73 74 private Context mContext; 75 private PhoneNumberPreferenceController mController; 76 private ClipboardManager mClipboardManager; 77 78 @Before setup()79 public void setup() { 80 MockitoAnnotations.initMocks(this); 81 mContext = spy(ApplicationProvider.getApplicationContext()); 82 mClipboardManager = (ClipboardManager) spy(mContext.getSystemService(CLIPBOARD_SERVICE)); 83 doReturn(mClipboardManager).when(mContext).getSystemService(CLIPBOARD_SERVICE); 84 when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager); 85 when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); 86 mController = spy(new PhoneNumberPreferenceController(mContext, "phone_number")); 87 88 if (Looper.myLooper() == null) { 89 Looper.prepare(); 90 } 91 final PreferenceManager preferenceManager = new PreferenceManager(mContext); 92 mScreen = preferenceManager.createPreferenceScreen(mContext); 93 mPreference = spy(new Preference(mContext)); 94 mPreference.setKey(mController.getPreferenceKey()); 95 mPreference.setVisible(true); 96 mScreen.addPreference(mPreference); 97 final String categoryKey = "basic_info_category"; 98 mCategory = new PreferenceCategory(mContext); 99 mCategory.setKey(categoryKey); 100 mScreen.addPreference(mCategory); 101 102 doReturn(mSubscriptionInfo).when(mController).getSubscriptionInfo(anyInt()); 103 doReturn(mSecondPreference).when(mController).createNewPreference(mContext); 104 } 105 106 @Test getAvailabilityStatus_isVoiceCapable_shouldBeAVAILABLE()107 public void getAvailabilityStatus_isVoiceCapable_shouldBeAVAILABLE() { 108 when(mTelephonyManager.isVoiceCapable()).thenReturn(true); 109 110 assertThat(mController.getAvailabilityStatus()).isEqualTo( 111 BasePreferenceController.AVAILABLE); 112 } 113 114 @Test getAvailabilityStatus_isNotVoiceCapable_shouldBeUNSUPPORTED_ON_DEVICE()115 public void getAvailabilityStatus_isNotVoiceCapable_shouldBeUNSUPPORTED_ON_DEVICE() { 116 when(mTelephonyManager.isVoiceCapable()).thenReturn(false); 117 118 assertThat(mController.getAvailabilityStatus()).isEqualTo( 119 BasePreferenceController.UNSUPPORTED_ON_DEVICE); 120 } 121 122 @Test displayPreference_multiSim_shouldAddSecondPreference()123 public void displayPreference_multiSim_shouldAddSecondPreference() { 124 when(mTelephonyManager.getPhoneCount()).thenReturn(2); 125 126 final Preference sim1Preference = new Preference(mContext); 127 mCategory.addItemFromInflater(sim1Preference); 128 mController.displayPreference(mScreen); 129 130 assertThat(mCategory.getPreferenceCount()).isEqualTo(2); 131 } 132 133 @Test updateState_singleSim_shouldUpdateTitleAndPhoneNumber()134 public void updateState_singleSim_shouldUpdateTitleAndPhoneNumber() { 135 final String phoneNumber = "1111111111"; 136 doReturn(phoneNumber).when(mController).getFormattedPhoneNumber(mSubscriptionInfo); 137 when(mTelephonyManager.getPhoneCount()).thenReturn(1); 138 mController.displayPreference(mScreen); 139 140 mController.updateState(mPreference); 141 142 verify(mPreference).setTitle(ResourcesUtils.getResourcesString(mContext, "status_number")); 143 verify(mPreference).setSummary(phoneNumber); 144 } 145 146 @Test updateState_multiSim_shouldUpdateTitleAndPhoneNumberOfMultiplePreferences()147 public void updateState_multiSim_shouldUpdateTitleAndPhoneNumberOfMultiplePreferences() { 148 final String phoneNumber = "1111111111"; 149 doReturn(phoneNumber).when(mController).getFormattedPhoneNumber(mSubscriptionInfo); 150 when(mTelephonyManager.getPhoneCount()).thenReturn(2); 151 mController.displayPreference(mScreen); 152 153 mController.updateState(mPreference); 154 155 verify(mPreference).setTitle(ResourcesUtils.getResourcesString( 156 mContext, "status_number_sim_slot", 1 /* sim slot */)); 157 verify(mPreference).setSummary(phoneNumber); 158 verify(mSecondPreference).setTitle(ResourcesUtils.getResourcesString( 159 mContext, "status_number_sim_slot", 2 /* sim slot */)); 160 verify(mSecondPreference).setSummary(phoneNumber); 161 } 162 163 @Test getSummary_cannotGetActiveSubscriptionInfo_shouldShowUnknown()164 public void getSummary_cannotGetActiveSubscriptionInfo_shouldShowUnknown() { 165 when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(null); 166 167 CharSequence primaryNumber = mController.getSummary(); 168 169 assertThat(primaryNumber).isNotNull(); 170 assertThat(primaryNumber).isEqualTo(ResourcesUtils.getResourcesString( 171 mContext, "device_info_default")); 172 } 173 174 @Test getSummary_getEmptySubscriptionInfo_shouldShowUnknown()175 public void getSummary_getEmptySubscriptionInfo_shouldShowUnknown() { 176 List<SubscriptionInfo> infos = new ArrayList<>(); 177 when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(infos); 178 179 CharSequence primaryNumber = mController.getSummary(); 180 181 assertThat(primaryNumber).isEqualTo(ResourcesUtils.getResourcesString( 182 mContext, "device_info_default")); 183 } 184 185 @Test 186 @UiThreadTest copy_shouldCopyPhoneNumberToClipboard()187 public void copy_shouldCopyPhoneNumberToClipboard() { 188 final List<SubscriptionInfo> list = new ArrayList<>(); 189 list.add(mSubscriptionInfo); 190 when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(list); 191 final String phoneNumber = "1111111111"; 192 doReturn(phoneNumber).when(mController).getFormattedPhoneNumber(mSubscriptionInfo); 193 ArgumentCaptor<ClipData> captor = ArgumentCaptor.forClass(ClipData.class); 194 doNothing().when(mClipboardManager).setPrimaryClip(captor.capture()); 195 196 mController.copy(); 197 198 final CharSequence data = captor.getValue().getItemAt(0).getText(); 199 assertThat(phoneNumber.contentEquals(data)).isTrue(); 200 } 201 } 202