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