Home | History | Annotate | Download | only in dialer
      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.dialer;
     18 
     19 import android.content.Context;
     20 import android.content.res.Resources;
     21 import android.provider.CallLog.Calls;
     22 import android.test.AndroidTestCase;
     23 import android.text.Html;
     24 import android.text.Spanned;
     25 import android.view.View;
     26 import android.widget.TextView;
     27 
     28 import com.android.dialer.calllog.CallTypeHelper;
     29 import com.android.dialer.calllog.TestPhoneNumberUtilsWrapper;
     30 import com.android.dialer.util.LocaleTestUtils;
     31 
     32 import java.util.GregorianCalendar;
     33 import java.util.Locale;
     34 
     35 /**
     36  * Unit tests for {@link PhoneCallDetailsHelper}.
     37  */
     38 public class PhoneCallDetailsHelperTest extends AndroidTestCase {
     39     /** The number to be used to access the voicemail. */
     40     private static final String TEST_VOICEMAIL_NUMBER = "125";
     41     /** The date of the call log entry. */
     42     private static final long TEST_DATE =
     43         new GregorianCalendar(2011, 5, 3, 13, 0, 0).getTimeInMillis();
     44     /** A test duration value for phone calls. */
     45     private static final long TEST_DURATION = 62300;
     46     /** The number of the caller/callee in the log entry. */
     47     private static final String TEST_NUMBER = "14125555555";
     48     /** The formatted version of {@link #TEST_NUMBER}. */
     49     private static final String TEST_FORMATTED_NUMBER = "1-412-255-5555";
     50     /** The country ISO name used in the tests. */
     51     private static final String TEST_COUNTRY_ISO = "US";
     52     /** The geocoded location used in the tests. */
     53     private static final String TEST_GEOCODE = "United States";
     54 
     55     /** The object under test. */
     56     private PhoneCallDetailsHelper mHelper;
     57     /** The views to fill. */
     58     private PhoneCallDetailsViews mViews;
     59     private TextView mNameView;
     60     private LocaleTestUtils mLocaleTestUtils;
     61 
     62     @Override
     63     protected void setUp() throws Exception {
     64         super.setUp();
     65         Context context = getContext();
     66         Resources resources = context.getResources();
     67         CallTypeHelper callTypeHelper = new CallTypeHelper(resources);
     68         final TestPhoneNumberUtilsWrapper phoneUtils = new TestPhoneNumberUtilsWrapper(
     69                 TEST_VOICEMAIL_NUMBER);
     70         mHelper = new PhoneCallDetailsHelper(resources, callTypeHelper, phoneUtils);
     71         mHelper.setCurrentTimeForTest(
     72                 new GregorianCalendar(2011, 5, 4, 13, 0, 0).getTimeInMillis());
     73         mViews = PhoneCallDetailsViews.createForTest(context);
     74         mNameView = new TextView(context);
     75         mLocaleTestUtils = new LocaleTestUtils(getContext());
     76         mLocaleTestUtils.setLocale(Locale.US);
     77     }
     78 
     79     @Override
     80     protected void tearDown() throws Exception {
     81         mLocaleTestUtils.restoreLocale();
     82         mNameView = null;
     83         mViews = null;
     84         mHelper = null;
     85         super.tearDown();
     86     }
     87 
     88     public void testSetPhoneCallDetails_Unknown() {
     89         setPhoneCallDetailsWithNumber("", Calls.PRESENTATION_UNKNOWN, "");
     90         assertNameEqualsResource(R.string.unknown);
     91     }
     92 
     93     public void testSetPhoneCallDetails_Private() {
     94         setPhoneCallDetailsWithNumber("", Calls.PRESENTATION_RESTRICTED, "");
     95         assertNameEqualsResource(R.string.private_num);
     96     }
     97 
     98     public void testSetPhoneCallDetails_Payphone() {
     99         setPhoneCallDetailsWithNumber("", Calls.PRESENTATION_PAYPHONE, "");
    100         assertNameEqualsResource(R.string.payphone);
    101     }
    102 
    103     public void testSetPhoneCallDetails_Voicemail() {
    104         setPhoneCallDetailsWithNumber(TEST_VOICEMAIL_NUMBER,
    105                 Calls.PRESENTATION_ALLOWED, TEST_VOICEMAIL_NUMBER);
    106         assertNameEqualsResource(R.string.voicemail);
    107     }
    108 
    109     public void testSetPhoneCallDetails_Normal() {
    110         setPhoneCallDetailsWithNumber("14125551212",
    111                 Calls.PRESENTATION_ALLOWED, "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. */
    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 
    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 
    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 
    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 
    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 
    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         assertLabelEquals("Pennsylvania"); // The geocode is shown as the label.
    181     }
    182 
    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         assertLabelEquals("-"); // The empty geocode is shown as the label.
    187     }
    188 
    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         assertLabelEquals("-"); // The empty geocode is shown as the label.
    193     }
    194 
    195     public void testSetPhoneCallDetails_NoGeocodeForVoicemail() {
    196         setPhoneCallDetailsWithNumberAndGeocode(TEST_VOICEMAIL_NUMBER, "", "United States");
    197         assertLabelEquals("-"); // The empty geocode is shown as the label.
    198     }
    199 
    200     public void testSetPhoneCallDetails_Highlighted() {
    201         setPhoneCallDetailsWithNumber(TEST_VOICEMAIL_NUMBER,
    202                 Calls.PRESENTATION_ALLOWED, "");
    203     }
    204 
    205     public void testSetCallDetailsHeader_NumberOnly() {
    206         setCallDetailsHeaderWithNumber(TEST_NUMBER, Calls.PRESENTATION_ALLOWED);
    207         assertEquals(View.VISIBLE, mNameView.getVisibility());
    208         assertEquals("Add to contacts", mNameView.getText().toString());
    209     }
    210 
    211     public void testSetCallDetailsHeader_UnknownNumber() {
    212         setCallDetailsHeaderWithNumber("", Calls.PRESENTATION_UNKNOWN);
    213         assertEquals(View.VISIBLE, mNameView.getVisibility());
    214         assertEquals("Unknown", mNameView.getText().toString());
    215     }
    216 
    217     public void testSetCallDetailsHeader_PrivateNumber() {
    218         setCallDetailsHeaderWithNumber("", Calls.PRESENTATION_RESTRICTED);
    219         assertEquals(View.VISIBLE, mNameView.getVisibility());
    220         assertEquals("Private number", mNameView.getText().toString());
    221     }
    222 
    223     public void testSetCallDetailsHeader_PayphoneNumber() {
    224         setCallDetailsHeaderWithNumber("", Calls.PRESENTATION_PAYPHONE);
    225         assertEquals(View.VISIBLE, mNameView.getVisibility());
    226         assertEquals("Pay phone", mNameView.getText().toString());
    227     }
    228 
    229     public void testSetCallDetailsHeader_VoicemailNumber() {
    230         setCallDetailsHeaderWithNumber(TEST_VOICEMAIL_NUMBER, Calls.PRESENTATION_ALLOWED);
    231         assertEquals(View.VISIBLE, mNameView.getVisibility());
    232         assertEquals("Voicemail", mNameView.getText().toString());
    233     }
    234 
    235     public void testSetCallDetailsHeader() {
    236         setCallDetailsHeader("John Doe");
    237         assertEquals(View.VISIBLE, mNameView.getVisibility());
    238         assertEquals("John Doe", mNameView.getText().toString());
    239     }
    240 
    241     /** Asserts that the name text field contains the value of the given string resource. */
    242     private void assertNameEqualsResource(int resId) {
    243         assertNameEquals(getContext().getString(resId));
    244     }
    245 
    246     /** Asserts that the name text field contains the given string value. */
    247     private void assertNameEquals(String text) {
    248         assertEquals(text, mViews.nameView.getText().toString());
    249     }
    250 
    251     /** Asserts that the label text field contains the given string value. */
    252     private void assertLabelEquals(String text) {
    253         assertEquals(text, mViews.labelView.getText().toString());
    254     }
    255 
    256     /** Asserts that the date text field contains the given string value. */
    257     private void assertDateEquals(String text) {
    258         assertEquals(text, mViews.callTypeAndDate.getText().toString());
    259     }
    260 
    261     /** Asserts that the call type contains the images with the given drawables. */
    262     private void assertCallTypeIconsEquals(int... ids) {
    263         assertEquals(ids.length, mViews.callTypeIcons.getCount());
    264         for (int index = 0; index < ids.length; ++index) {
    265             int id = ids[index];
    266             assertEquals(id, mViews.callTypeIcons.getCallType(index));
    267         }
    268         assertEquals(View.VISIBLE, mViews.callTypeIcons.getVisibility());
    269         assertEquals("Yesterday", mViews.callTypeAndDate.getText().toString());
    270     }
    271 
    272     /**
    273      * Asserts that the call type contains the images with the given drawables and shows the given
    274      * text next to the icons.
    275      */
    276     private void assertCallTypeIconsEqualsPlusOverflow(String overflowText, int... ids) {
    277         assertEquals(ids.length, mViews.callTypeIcons.getCount());
    278         for (int index = 0; index < ids.length; ++index) {
    279             int id = ids[index];
    280             assertEquals(id, mViews.callTypeIcons.getCallType(index));
    281         }
    282         assertEquals(View.VISIBLE, mViews.callTypeIcons.getVisibility());
    283         assertEquals(overflowText + " Yesterday", mViews.callTypeAndDate.getText().toString());
    284     }
    285 
    286     /** Sets the phone call details with default values and the given number. */
    287     private void setPhoneCallDetailsWithNumber(String number, int presentation,
    288             String formattedNumber) {
    289         mHelper.setPhoneCallDetails(mViews,
    290                 new PhoneCallDetails(number, presentation, formattedNumber,
    291                         TEST_COUNTRY_ISO, TEST_GEOCODE,
    292                         new int[]{ Calls.VOICEMAIL_TYPE }, TEST_DATE, TEST_DURATION),
    293                 true);
    294     }
    295 
    296     /** Sets the phone call details with default values and the given number. */
    297     private void setPhoneCallDetailsWithNumberAndGeocode(String number, String formattedNumber,
    298             String geocodedLocation) {
    299         mHelper.setPhoneCallDetails(mViews,
    300                 new PhoneCallDetails(number, Calls.PRESENTATION_ALLOWED,
    301                         formattedNumber, TEST_COUNTRY_ISO, geocodedLocation,
    302                         new int[]{ Calls.VOICEMAIL_TYPE }, TEST_DATE, TEST_DURATION),
    303                 true);
    304     }
    305 
    306     /** Sets the phone call details with default values and the given date. */
    307     private void setPhoneCallDetailsWithDate(long date) {
    308         mHelper.setPhoneCallDetails(mViews,
    309                 new PhoneCallDetails(TEST_NUMBER, Calls.PRESENTATION_ALLOWED,
    310                         TEST_FORMATTED_NUMBER, TEST_COUNTRY_ISO, TEST_GEOCODE,
    311                         new int[]{ Calls.INCOMING_TYPE }, date, TEST_DURATION),
    312                 false);
    313     }
    314 
    315     /** Sets the phone call details with default values and the given call types using icons. */
    316     private void setPhoneCallDetailsWithCallTypeIcons(int... callTypes) {
    317         mHelper.setPhoneCallDetails(mViews,
    318                 new PhoneCallDetails(TEST_NUMBER, Calls.PRESENTATION_ALLOWED,
    319                         TEST_FORMATTED_NUMBER, TEST_COUNTRY_ISO, TEST_GEOCODE,
    320                         callTypes, TEST_DATE, TEST_DURATION),
    321                 false);
    322     }
    323 
    324     private void setCallDetailsHeaderWithNumber(String number, int presentation) {
    325         mHelper.setCallDetailsHeader(mNameView,
    326                 new PhoneCallDetails(number, presentation,
    327                         TEST_FORMATTED_NUMBER, TEST_COUNTRY_ISO, TEST_GEOCODE,
    328                         new int[]{ Calls.INCOMING_TYPE }, TEST_DATE, TEST_DURATION));
    329     }
    330 
    331     private void setCallDetailsHeader(String name) {
    332         mHelper.setCallDetailsHeader(mNameView,
    333                 new PhoneCallDetails(TEST_NUMBER, Calls.PRESENTATION_ALLOWED,
    334                         TEST_FORMATTED_NUMBER, TEST_COUNTRY_ISO, TEST_GEOCODE,
    335                         new int[]{ Calls.INCOMING_TYPE }, TEST_DATE, TEST_DURATION,
    336                         name, 0, "", null, null));
    337     }
    338 }
    339