• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 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.contacts;
18 
19 import com.android.contacts.calllog.CallTypeHelper;
20 import com.android.contacts.calllog.PhoneNumberHelper;
21 import com.android.contacts.util.LocaleTestUtils;
22 import com.android.internal.telephony.CallerInfo;
23 
24 import android.content.Context;
25 import android.content.res.Resources;
26 import android.provider.CallLog.Calls;
27 import android.test.AndroidTestCase;
28 import android.text.Html;
29 import android.text.Spanned;
30 import android.view.View;
31 import android.widget.TextView;
32 
33 import java.util.GregorianCalendar;
34 import java.util.Locale;
35 
36 /**
37  * Unit tests for {@link PhoneCallDetailsHelper}.
38  */
39 public class PhoneCallDetailsHelperTest extends AndroidTestCase {
40     /** The number to be used to access the voicemail. */
41     private static final String TEST_VOICEMAIL_NUMBER = "125";
42     /** The date of the call log entry. */
43     private static final long TEST_DATE =
44         new GregorianCalendar(2011, 5, 3, 13, 0, 0).getTimeInMillis();
45     /** A test duration value for phone calls. */
46     private static final long TEST_DURATION = 62300;
47     /** The number of the caller/callee in the log entry. */
48     private static final String TEST_NUMBER = "14125555555";
49     /** The formatted version of {@link #TEST_NUMBER}. */
50     private static final String TEST_FORMATTED_NUMBER = "1-412-255-5555";
51     /** The country ISO name used in the tests. */
52     private static final String TEST_COUNTRY_ISO = "US";
53     /** The geocoded location used in the tests. */
54     private static final String TEST_GEOCODE = "United States";
55 
56     /** The object under test. */
57     private PhoneCallDetailsHelper mHelper;
58     /** The views to fill. */
59     private PhoneCallDetailsViews mViews;
60     private TextView mNameView;
61     private PhoneNumberHelper mPhoneNumberHelper;
62     private LocaleTestUtils mLocaleTestUtils;
63 
64     @Override
setUp()65     protected void setUp() throws Exception {
66         super.setUp();
67         Context context = getContext();
68         Resources resources = context.getResources();
69         CallTypeHelper callTypeHelper = new CallTypeHelper(resources);
70         mPhoneNumberHelper = new PhoneNumberHelper(resources, TEST_VOICEMAIL_NUMBER);
71         mHelper = new PhoneCallDetailsHelper(resources, callTypeHelper, mPhoneNumberHelper);
72         mHelper.setCurrentTimeForTest(
73                 new GregorianCalendar(2011, 5, 4, 13, 0, 0).getTimeInMillis());
74         mViews = PhoneCallDetailsViews.createForTest(context);
75         mNameView = new TextView(context);
76         mLocaleTestUtils = new LocaleTestUtils(getContext());
77         mLocaleTestUtils.setLocale(Locale.US);
78     }
79 
80     @Override
tearDown()81     protected void tearDown() throws Exception {
82         mLocaleTestUtils.restoreLocale();
83         mNameView = null;
84         mViews = null;
85         mHelper = null;
86         mPhoneNumberHelper = null;
87         super.tearDown();
88     }
89 
testSetPhoneCallDetails_Unknown()90     public void testSetPhoneCallDetails_Unknown() {
91         setPhoneCallDetailsWithNumber(CallerInfo.UNKNOWN_NUMBER, CallerInfo.UNKNOWN_NUMBER);
92         assertNameEqualsResource(R.string.unknown);
93     }
94 
testSetPhoneCallDetails_Private()95     public void testSetPhoneCallDetails_Private() {
96         setPhoneCallDetailsWithNumber(CallerInfo.PRIVATE_NUMBER, CallerInfo.PRIVATE_NUMBER);
97         assertNameEqualsResource(R.string.private_num);
98     }
99 
testSetPhoneCallDetails_Payphone()100     public void testSetPhoneCallDetails_Payphone() {
101         setPhoneCallDetailsWithNumber(CallerInfo.PAYPHONE_NUMBER, CallerInfo.PAYPHONE_NUMBER);
102         assertNameEqualsResource(R.string.payphone);
103     }
104 
testSetPhoneCallDetails_Voicemail()105     public void testSetPhoneCallDetails_Voicemail() {
106         setPhoneCallDetailsWithNumber(TEST_VOICEMAIL_NUMBER, TEST_VOICEMAIL_NUMBER);
107         assertNameEqualsResource(R.string.voicemail);
108     }
109 
testSetPhoneCallDetails_Normal()110     public void testSetPhoneCallDetails_Normal() {
111         setPhoneCallDetailsWithNumber("14125551212", "1-412-555-1212");
112         assertEquals("yesterday", mViews.callTypeAndDate.getText().toString());
113         assertEqualsHtml("<font color='#33b5e5'><b>yesterday</b></font>",
114                 mViews.callTypeAndDate.getText());
115     }
116 
117     /** Asserts that a char sequence is actually a Spanned corresponding to the expected HTML. */
assertEqualsHtml(String expectedHtml, CharSequence actualText)118     private void assertEqualsHtml(String expectedHtml, CharSequence actualText) {
119         // In order to contain HTML, the text should actually be a Spanned.
120         assertTrue(actualText instanceof Spanned);
121         Spanned actualSpanned = (Spanned) actualText;
122         // Convert from and to HTML to take care of alternative formatting of HTML.
123         assertEquals(Html.toHtml(Html.fromHtml(expectedHtml)), Html.toHtml(actualSpanned));
124 
125     }
126 
testSetPhoneCallDetails_Date()127     public void testSetPhoneCallDetails_Date() {
128         mHelper.setCurrentTimeForTest(
129                 new GregorianCalendar(2011, 5, 3, 13, 0, 0).getTimeInMillis());
130 
131         setPhoneCallDetailsWithDate(
132                 new GregorianCalendar(2011, 5, 3, 13, 0, 0).getTimeInMillis());
133         assertDateEquals("0 mins ago");
134 
135         setPhoneCallDetailsWithDate(
136                 new GregorianCalendar(2011, 5, 3, 12, 0, 0).getTimeInMillis());
137         assertDateEquals("1 hour ago");
138 
139         setPhoneCallDetailsWithDate(
140                 new GregorianCalendar(2011, 5, 2, 13, 0, 0).getTimeInMillis());
141         assertDateEquals("yesterday");
142 
143         setPhoneCallDetailsWithDate(
144                 new GregorianCalendar(2011, 5, 1, 13, 0, 0).getTimeInMillis());
145         assertDateEquals("2 days ago");
146     }
147 
testSetPhoneCallDetails_CallTypeIcons()148     public void testSetPhoneCallDetails_CallTypeIcons() {
149         setPhoneCallDetailsWithCallTypeIcons(Calls.INCOMING_TYPE);
150         assertCallTypeIconsEquals(Calls.INCOMING_TYPE);
151 
152         setPhoneCallDetailsWithCallTypeIcons(Calls.OUTGOING_TYPE);
153         assertCallTypeIconsEquals(Calls.OUTGOING_TYPE);
154 
155         setPhoneCallDetailsWithCallTypeIcons(Calls.MISSED_TYPE);
156         assertCallTypeIconsEquals(Calls.MISSED_TYPE);
157 
158         setPhoneCallDetailsWithCallTypeIcons(Calls.VOICEMAIL_TYPE);
159         assertCallTypeIconsEquals(Calls.VOICEMAIL_TYPE);
160     }
161 
testSetPhoneCallDetails_MultipleCallTypeIcons()162     public void testSetPhoneCallDetails_MultipleCallTypeIcons() {
163         setPhoneCallDetailsWithCallTypeIcons(Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE);
164         assertCallTypeIconsEquals(Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE);
165 
166         setPhoneCallDetailsWithCallTypeIcons(Calls.MISSED_TYPE, Calls.MISSED_TYPE);
167         assertCallTypeIconsEquals(Calls.MISSED_TYPE, Calls.MISSED_TYPE);
168     }
169 
testSetPhoneCallDetails_MultipleCallTypeIconsLastOneDropped()170     public void testSetPhoneCallDetails_MultipleCallTypeIconsLastOneDropped() {
171         setPhoneCallDetailsWithCallTypeIcons(Calls.MISSED_TYPE, Calls.MISSED_TYPE,
172                 Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE);
173         assertCallTypeIconsEqualsPlusOverflow("(4)",
174                 Calls.MISSED_TYPE, Calls.MISSED_TYPE, Calls.INCOMING_TYPE);
175     }
176 
testSetPhoneCallDetails_Geocode()177     public void testSetPhoneCallDetails_Geocode() {
178         setPhoneCallDetailsWithNumberAndGeocode("+14125555555", "1-412-555-5555", "Pennsylvania");
179         assertNameEquals("1-412-555-5555");  // The phone number is shown as the name.
180         assertNumberEquals("Pennsylvania");  // The geocode is shown as the number.
181     }
182 
testSetPhoneCallDetails_NoGeocode()183     public void testSetPhoneCallDetails_NoGeocode() {
184         setPhoneCallDetailsWithNumberAndGeocode("+14125555555", "1-412-555-5555", null);
185         assertNameEquals("1-412-555-5555");  // The phone number is shown as the name.
186         assertNumberEquals("-");  // The empty geocode is shown as the number.
187     }
188 
testSetPhoneCallDetails_EmptyGeocode()189     public void testSetPhoneCallDetails_EmptyGeocode() {
190         setPhoneCallDetailsWithNumberAndGeocode("+14125555555", "1-412-555-5555", "");
191         assertNameEquals("1-412-555-5555");  // The phone number is shown as the name.
192         assertNumberEquals("-");  // The empty geocode is shown as the number.
193     }
194 
testSetPhoneCallDetails_NoGeocodeForVoicemail()195     public void testSetPhoneCallDetails_NoGeocodeForVoicemail() {
196         setPhoneCallDetailsWithNumberAndGeocode(TEST_VOICEMAIL_NUMBER, "", "United States");
197         assertNumberEquals("-");  // The empty geocode is shown as the number.
198     }
199 
testSetPhoneCallDetails_Highlighted()200     public void testSetPhoneCallDetails_Highlighted() {
201         setPhoneCallDetailsWithNumber(TEST_VOICEMAIL_NUMBER, "");
202     }
203 
testSetCallDetailsHeader_NumberOnly()204     public void testSetCallDetailsHeader_NumberOnly() {
205         setCallDetailsHeaderWithNumberOnly(TEST_NUMBER);
206         assertEquals(View.VISIBLE, mNameView.getVisibility());
207         assertEquals("Add to contacts", mNameView.getText().toString());
208     }
209 
testSetCallDetailsHeader_UnknownNumber()210     public void testSetCallDetailsHeader_UnknownNumber() {
211         setCallDetailsHeaderWithNumberOnly(CallerInfo.UNKNOWN_NUMBER);
212         assertEquals(View.VISIBLE, mNameView.getVisibility());
213         assertEquals("Unknown", mNameView.getText().toString());
214     }
215 
testSetCallDetailsHeader_PrivateNumber()216     public void testSetCallDetailsHeader_PrivateNumber() {
217         setCallDetailsHeaderWithNumberOnly(CallerInfo.PRIVATE_NUMBER);
218         assertEquals(View.VISIBLE, mNameView.getVisibility());
219         assertEquals("Private number", mNameView.getText().toString());
220     }
221 
testSetCallDetailsHeader_PayphoneNumber()222     public void testSetCallDetailsHeader_PayphoneNumber() {
223         setCallDetailsHeaderWithNumberOnly(CallerInfo.PAYPHONE_NUMBER);
224         assertEquals(View.VISIBLE, mNameView.getVisibility());
225         assertEquals("Pay phone", mNameView.getText().toString());
226     }
227 
testSetCallDetailsHeader_VoicemailNumber()228     public void testSetCallDetailsHeader_VoicemailNumber() {
229         setCallDetailsHeaderWithNumberOnly(TEST_VOICEMAIL_NUMBER);
230         assertEquals(View.VISIBLE, mNameView.getVisibility());
231         assertEquals("Voicemail", mNameView.getText().toString());
232     }
233 
testSetCallDetailsHeader()234     public void testSetCallDetailsHeader() {
235         setCallDetailsHeader("John Doe");
236         assertEquals(View.VISIBLE, mNameView.getVisibility());
237         assertEquals("John Doe", mNameView.getText().toString());
238     }
239 
240     /** Asserts that the name text field contains the value of the given string resource. */
assertNameEqualsResource(int resId)241     private void assertNameEqualsResource(int resId) {
242         assertNameEquals(getContext().getString(resId));
243     }
244 
245     /** Asserts that the name text field contains the given string value. */
assertNameEquals(String text)246     private void assertNameEquals(String text) {
247         assertEquals(text, mViews.nameView.getText().toString());
248     }
249 
250     /** Asserts that the number text field contains the given string value. */
assertNumberEquals(String text)251     private void assertNumberEquals(String text) {
252         assertEquals(text, mViews.numberView.getText().toString());
253     }
254 
255     /** Asserts that the date text field contains the given string value. */
assertDateEquals(String text)256     private void assertDateEquals(String text) {
257         assertEquals(text, mViews.callTypeAndDate.getText().toString());
258     }
259 
260     /** Asserts that the call type contains the images with the given drawables. */
assertCallTypeIconsEquals(int... ids)261     private void assertCallTypeIconsEquals(int... ids) {
262         assertEquals(ids.length, mViews.callTypeIcons.getCount());
263         for (int index = 0; index < ids.length; ++index) {
264             int id = ids[index];
265             assertEquals(id, mViews.callTypeIcons.getCallType(index));
266         }
267         assertEquals(View.VISIBLE, mViews.callTypeIcons.getVisibility());
268         assertEquals("yesterday", mViews.callTypeAndDate.getText().toString());
269     }
270 
271     /**
272      * Asserts that the call type contains the images with the given drawables and shows the given
273      * text next to the icons.
274      */
assertCallTypeIconsEqualsPlusOverflow(String overflowText, int... ids)275     private void assertCallTypeIconsEqualsPlusOverflow(String overflowText, int... ids) {
276         assertEquals(ids.length, mViews.callTypeIcons.getCount());
277         for (int index = 0; index < ids.length; ++index) {
278             int id = ids[index];
279             assertEquals(id, mViews.callTypeIcons.getCallType(index));
280         }
281         assertEquals(View.VISIBLE, mViews.callTypeIcons.getVisibility());
282         assertEquals(overflowText + " yesterday", mViews.callTypeAndDate.getText().toString());
283     }
284 
285     /** Sets the phone call details with default values and the given number. */
setPhoneCallDetailsWithNumber(String number, String formattedNumber)286     private void setPhoneCallDetailsWithNumber(String number, String formattedNumber) {
287         setPhoneCallDetailsWithNumberAndGeocode(number, formattedNumber, TEST_GEOCODE);
288     }
289 
290     /** Sets the phone call details with default values and the given number. */
setPhoneCallDetailsWithNumberAndGeocode(String number, String formattedNumber, String geocodedLocation)291     private void setPhoneCallDetailsWithNumberAndGeocode(String number, String formattedNumber,
292             String geocodedLocation) {
293         mHelper.setPhoneCallDetails(mViews,
294                 new PhoneCallDetails(number, formattedNumber, TEST_COUNTRY_ISO, geocodedLocation,
295                         new int[]{ Calls.VOICEMAIL_TYPE }, TEST_DATE, TEST_DURATION),
296                 true);
297     }
298 
299     /** Sets the phone call details with default values and the given date. */
setPhoneCallDetailsWithDate(long date)300     private void setPhoneCallDetailsWithDate(long date) {
301         mHelper.setPhoneCallDetails(mViews,
302                 new PhoneCallDetails(TEST_NUMBER, TEST_FORMATTED_NUMBER, TEST_COUNTRY_ISO,
303                         TEST_GEOCODE, new int[]{ Calls.INCOMING_TYPE }, date, TEST_DURATION),
304                 false);
305     }
306 
307     /** Sets the phone call details with default values and the given call types using icons. */
setPhoneCallDetailsWithCallTypeIcons(int... callTypes)308     private void setPhoneCallDetailsWithCallTypeIcons(int... callTypes) {
309         mHelper.setPhoneCallDetails(mViews,
310                 new PhoneCallDetails(TEST_NUMBER, TEST_FORMATTED_NUMBER, TEST_COUNTRY_ISO,
311                         TEST_GEOCODE, callTypes, TEST_DATE, TEST_DURATION),
312                 false);
313     }
314 
setCallDetailsHeaderWithNumberOnly(String number)315     private void setCallDetailsHeaderWithNumberOnly(String number) {
316         mHelper.setCallDetailsHeader(mNameView,
317                 new PhoneCallDetails(number, TEST_FORMATTED_NUMBER, TEST_COUNTRY_ISO,
318                         TEST_GEOCODE, new int[]{ Calls.INCOMING_TYPE }, TEST_DATE, TEST_DURATION));
319     }
320 
setCallDetailsHeader(String name)321     private void setCallDetailsHeader(String name) {
322         mHelper.setCallDetailsHeader(mNameView,
323                 new PhoneCallDetails(TEST_NUMBER, TEST_FORMATTED_NUMBER, TEST_COUNTRY_ISO,
324                         TEST_GEOCODE, new int[]{ Calls.INCOMING_TYPE }, TEST_DATE, TEST_DURATION,
325                         name, 0, "", null, null));
326     }
327 }
328