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