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
17package com.android.dialer.calllog;
18
19import android.content.ComponentName;
20import android.content.Context;
21import android.content.res.Resources;
22import android.provider.CallLog.Calls;
23import android.telecom.PhoneAccountHandle;
24import android.test.AndroidTestCase;
25import android.test.suitebuilder.annotation.MediumTest;
26import android.text.Html;
27import android.text.Spanned;
28import android.view.View;
29import android.widget.TextView;
30
31import com.android.dialer.PhoneCallDetails;
32import com.android.dialer.R;
33import com.android.dialer.calllog.calllogcache.TestTelecomCallLogCache;
34import com.android.dialer.util.AppCompatConstants;
35import com.android.dialer.util.LocaleTestUtils;
36
37import java.util.GregorianCalendar;
38import java.util.Locale;
39import java.util.regex.Matcher;
40import java.util.regex.Pattern;
41
42/**
43 * Unit tests for {@link PhoneCallDetailsHelper}.
44 */
45@MediumTest
46public class PhoneCallDetailsHelperTest extends AndroidTestCase {
47    /** The number to be used to access the voicemail. */
48    private static final String TEST_VOICEMAIL_NUMBER = "125";
49    /** The date of the call log entry. */
50    private static final long TEST_DATE =
51        new GregorianCalendar(2011, 5, 3, 13, 0, 0).getTimeInMillis();
52    private static final long INJECTED_CURRENT_DATE =
53        new GregorianCalendar(2011, 5, 4, 13, 0, 0).getTimeInMillis();
54    /** A test duration value for phone calls. */
55    private static final long TEST_DURATION = 62300;
56    /** The number of the caller/callee in the log entry. */
57    private static final String TEST_NUMBER = "14125555555";
58    /** The formatted version of {@link #TEST_NUMBER}. */
59    private static final String TEST_FORMATTED_NUMBER = "1-412-255-5555";
60    /** The country ISO name used in the tests. */
61    private static final String TEST_COUNTRY_ISO = "US";
62    /** The geocoded location used in the tests. */
63    private static final String TEST_GEOCODE = "United States";
64    /** Empty geocode label */
65    private static final String EMPTY_GEOCODE = "";
66    /** Empty post-dial digits label */
67    private static final String EMPTY_POSTDIAL = "";
68    /** The number that the call was received via */
69    private static final String TEST_VIA_NUMBER = "+16505551234";
70    /** The Phone Account name that the Call was received on */
71    private static final String TEST_ACCOUNT_LABEL = "T-Stationary";
72
73    /** The object under test. */
74    private PhoneCallDetailsHelper mHelper;
75    /** The views to fill. */
76    private PhoneCallDetailsViews mViews;
77    private TextView mNameView;
78    private LocaleTestUtils mLocaleTestUtils;
79    private TestTelecomCallLogCache mPhoneUtils;
80
81    private Context mContext;
82
83    @Override
84    protected void setUp() throws Exception {
85        super.setUp();
86        mContext = getContext();
87        Resources resources = mContext.getResources();
88        mPhoneUtils = new TestTelecomCallLogCache(mContext, TEST_VOICEMAIL_NUMBER,
89                TEST_ACCOUNT_LABEL);
90        mHelper = new PhoneCallDetailsHelper(mContext, resources, mPhoneUtils);
91        mHelper.setCurrentTimeForTest(INJECTED_CURRENT_DATE);
92        mViews = PhoneCallDetailsViews.createForTest(mContext);
93        mNameView = new TextView(mContext);
94        mLocaleTestUtils = new LocaleTestUtils(mContext);
95        mLocaleTestUtils.setLocale(Locale.US);
96    }
97
98    @Override
99    protected void tearDown() throws Exception {
100        mLocaleTestUtils.restoreLocale();
101        mNameView = null;
102        mViews = null;
103        mHelper = null;
104        super.tearDown();
105    }
106
107    public void testSetPhoneCallDetails_Unknown() {
108        setPhoneCallDetailsWithNumber("", Calls.PRESENTATION_UNKNOWN, "");
109        assertNameEqualsResource(R.string.unknown);
110    }
111
112    public void testSetPhoneCallDetails_Private() {
113        setPhoneCallDetailsWithNumber("", Calls.PRESENTATION_RESTRICTED, "");
114        assertNameEqualsResource(R.string.private_num);
115    }
116
117    public void testSetPhoneCallDetails_Payphone() {
118        setPhoneCallDetailsWithNumber("", Calls.PRESENTATION_PAYPHONE, "");
119        assertNameEqualsResource(R.string.payphone);
120    }
121
122    public void testSetPhoneCallDetails_Voicemail() {
123        setPhoneCallDetailsWithNumber(TEST_VOICEMAIL_NUMBER,
124                Calls.PRESENTATION_ALLOWED, TEST_VOICEMAIL_NUMBER);
125        assertNameEqualsResource(R.string.voicemail);
126    }
127
128    public void testSetPhoneCallDetails_ViaNumber() {
129        setPhoneCallDetailsWithViaNumber(TEST_VIA_NUMBER);
130        assertViaNumberEquals(TEST_VIA_NUMBER);
131    }
132
133    public void testSetPhoneCallDetails_NoViaNumber() {
134        setDefaultPhoneCallDetailsNoViaNumber();
135        assertCallAccountInvisible();
136    }
137
138    public void testSetPhoneCallDetails_AccountLabel() {
139        setPhoneCallDetailsWithAccountHandle();
140        assertAccountLabelEquals(TEST_ACCOUNT_LABEL);
141    }
142
143    public void testSetPhoneCallDetails_AccountHandleViaNumber() {
144        setPhoneCallDetailsWithAccountLabelViaNumber(TEST_VIA_NUMBER);
145        assertAccountLabelEquals(TEST_VIA_NUMBER, TEST_ACCOUNT_LABEL);
146    }
147
148    // Voicemail date string has 3 different formats depending on how long ago the call was placed
149    public void testSetVoicemailPhoneCallDetails_Today() {
150        setVoicemailPhoneCallDetailsWithDate(System.currentTimeMillis());
151        assertLocationAndDateContains("Today at");
152    }
153
154    public void testSetVoicemailPhoneCallDetails_WithinCurrentYear() {
155        mHelper.setCurrentTimeForTest(INJECTED_CURRENT_DATE);
156        String formattedTestDate = "Jun 3 at 1:00 PM";
157        setVoicemailPhoneCallDetailsWithDate(TEST_DATE);
158        assertLocationAndDateContains(formattedTestDate);
159    }
160
161    public void testSetVoicemailPhoneCallDetails_OutsideCurrentYear() {
162        mHelper.setCurrentTimeForTest(INJECTED_CURRENT_DATE);
163        long testDate = new GregorianCalendar(2009, 5, 3, 13, 0, 0).getTimeInMillis();
164        String formattedTestDate = "Jun 3, 2009 at 1:00 PM";
165        setVoicemailPhoneCallDetailsWithDate(testDate);
166        assertLocationAndDateContains(formattedTestDate);
167    }
168
169    public void testVoicemailLocationNotShownWithDate() {
170        setVoicemailPhoneCallDetailsWithDate(TEST_DATE);
171        assertLocationAndDateExactEquals("Jun 3 at 1:00 PM • 99:20");
172    }
173
174    public void testVoicemailDuration() {
175        setVoicemailPhoneCallDetailsWithDuration(100);
176        assertDurationExactEquals("01:40");
177    }
178
179    public void testVoicemailDuration_Capped() {
180        setVoicemailPhoneCallDetailsWithDuration(TEST_DURATION);
181        assertDurationExactEquals("99:20");
182    }
183
184    public void testVoicemailDuration_Zero() {
185        setVoicemailPhoneCallDetailsWithDuration(0);
186        assertLocationAndDateExactEquals("Jun 3 at 1:00 PM");
187    }
188
189    public void testVoicemailDuration_EvenMinute() {
190        setVoicemailPhoneCallDetailsWithDuration(60);
191        assertDurationExactEquals("01:00");
192    }
193
194    /** Asserts that a char sequence is actually a Spanned corresponding to the expected HTML. */
195    private void assertEqualsHtml(String expectedHtml, CharSequence actualText) {
196        // In order to contain HTML, the text should actually be a Spanned.
197        assertTrue(actualText instanceof Spanned);
198        Spanned actualSpanned = (Spanned) actualText;
199        // Convert from and to HTML to take care of alternative formatting of HTML.
200        assertEquals(Html.toHtml(Html.fromHtml(expectedHtml)), Html.toHtml(actualSpanned));
201
202    }
203
204    public void testSetPhoneCallDetails_Date() {
205        mHelper.setCurrentTimeForTest(
206                new GregorianCalendar(2011, 5, 3, 13, 0, 0).getTimeInMillis());
207
208        setPhoneCallDetailsWithDate(
209                new GregorianCalendar(2011, 5, 3, 13, 0, 0).getTimeInMillis());
210        assertLocationAndDateContains("0 min. ago");
211
212        setPhoneCallDetailsWithDate(
213                new GregorianCalendar(2011, 5, 3, 12, 0, 0).getTimeInMillis());
214        assertLocationAndDateContains("1 hr. ago");
215
216        setPhoneCallDetailsWithDate(
217                new GregorianCalendar(2011, 5, 2, 13, 0, 0).getTimeInMillis());
218        assertLocationAndDateContains("Yesterday");
219
220        setPhoneCallDetailsWithDate(
221                new GregorianCalendar(2011, 5, 1, 13, 0, 0).getTimeInMillis());
222        assertLocationAndDateContains("2 days ago");
223    }
224
225    public void testSetPhoneCallDetails_CallTypeIcons() {
226        setPhoneCallDetailsWithCallTypeIcons(AppCompatConstants.CALLS_INCOMING_TYPE);
227        assertCallTypeIconsEquals(AppCompatConstants.CALLS_INCOMING_TYPE);
228
229        setPhoneCallDetailsWithCallTypeIcons(AppCompatConstants.CALLS_OUTGOING_TYPE);
230        assertCallTypeIconsEquals(AppCompatConstants.CALLS_OUTGOING_TYPE);
231
232        setPhoneCallDetailsWithCallTypeIcons(AppCompatConstants.CALLS_MISSED_TYPE);
233        assertCallTypeIconsEquals(AppCompatConstants.CALLS_MISSED_TYPE);
234
235        setPhoneCallDetailsWithCallTypeIcons(AppCompatConstants.CALLS_VOICEMAIL_TYPE);
236        assertCallTypeIconsEquals(AppCompatConstants.CALLS_VOICEMAIL_TYPE);
237    }
238
239    /**
240     * Tests a case where the video call feature is present.
241     */
242    public void testSetPhoneCallDetails_Video() {
243        PhoneCallDetails details = getPhoneCallDetails();
244        details.features = Calls.FEATURES_VIDEO;
245        mHelper.setPhoneCallDetails(mViews, details);
246
247        assertIsVideoCall(true);
248    }
249
250    /**
251     * Tests a case where the video call feature is not present.
252     */
253    public void testSetPhoneCallDetails_NoVideo() {
254        PhoneCallDetails details = getPhoneCallDetails();
255        details.features = 0;
256        mHelper.setPhoneCallDetails(mViews, details);
257
258        assertIsVideoCall(false);
259    }
260
261    public void testSetPhoneCallDetails_MultipleCallTypeIcons() {
262        setPhoneCallDetailsWithCallTypeIcons(
263                AppCompatConstants.CALLS_INCOMING_TYPE,
264                AppCompatConstants.CALLS_OUTGOING_TYPE);
265        assertCallTypeIconsEquals(
266                AppCompatConstants.CALLS_INCOMING_TYPE,
267                AppCompatConstants.CALLS_OUTGOING_TYPE);
268
269        setPhoneCallDetailsWithCallTypeIcons(
270                AppCompatConstants.CALLS_MISSED_TYPE,
271                AppCompatConstants.CALLS_MISSED_TYPE);
272        assertCallTypeIconsEquals(
273                AppCompatConstants.CALLS_MISSED_TYPE,
274                AppCompatConstants.CALLS_MISSED_TYPE);
275    }
276
277    public void testSetPhoneCallDetails_MultipleCallTypeIconsLastOneDropped() {
278        setPhoneCallDetailsWithCallTypeIcons(
279                AppCompatConstants.CALLS_MISSED_TYPE,
280                AppCompatConstants.CALLS_MISSED_TYPE,
281                AppCompatConstants.CALLS_INCOMING_TYPE,
282                AppCompatConstants.CALLS_OUTGOING_TYPE);
283        assertCallTypeIconsEqualsPlusOverflow("(4)",
284                AppCompatConstants.CALLS_MISSED_TYPE,
285                AppCompatConstants.CALLS_MISSED_TYPE,
286                AppCompatConstants.CALLS_INCOMING_TYPE);
287    }
288
289    public void testSetPhoneCallDetails_Geocode() {
290        setPhoneCallDetailsWithNumberAndGeocode("+14125555555", "1-412-555-5555", "Pennsylvania");
291        assertNameEquals("1-412-555-5555");  // The phone number is shown as the name.
292        assertLocationAndDateContains("Pennsylvania"); // The geocode is shown as the label.
293    }
294
295    public void testSetPhoneCallDetails_NoGeocode() {
296        setPhoneCallDetailsWithNumberAndGeocode("+14125555555", "1-412-555-5555", null);
297        assertNameEquals("1-412-555-5555");  // The phone number is shown as the name.
298        assertLocationAndDateContains(EMPTY_GEOCODE); // The empty geocode is shown as the label.
299    }
300
301    public void testSetPhoneCallDetails_EmptyGeocode() {
302        setPhoneCallDetailsWithNumberAndGeocode("+14125555555", "1-412-555-5555", "");
303        assertNameEquals("1-412-555-5555");  // The phone number is shown as the name.
304        assertLocationAndDateContains(EMPTY_GEOCODE); // The empty geocode is shown as the label.
305    }
306
307    public void testSetPhoneCallDetails_NoGeocodeForVoicemail() {
308        setPhoneCallDetailsWithNumberAndGeocode(TEST_VOICEMAIL_NUMBER, "", "United States");
309        assertLocationAndDateContains(EMPTY_GEOCODE); // The empty geocode is shown as the label.
310    }
311
312    public void testSetPhoneCallDetails_Highlighted() {
313        setPhoneCallDetailsWithNumber(TEST_VOICEMAIL_NUMBER,
314                Calls.PRESENTATION_ALLOWED, "");
315    }
316
317    public void testSetCallDetailsHeader_NumberOnly() {
318        setCallDetailsHeaderWithNumber(TEST_NUMBER, Calls.PRESENTATION_ALLOWED);
319        assertEquals(View.VISIBLE, mNameView.getVisibility());
320        assertEquals("1-412-255-5555", mNameView.getText().toString());
321    }
322
323    public void testSetCallDetailsHeader_UnknownNumber() {
324        setCallDetailsHeaderWithNumber("", Calls.PRESENTATION_UNKNOWN);
325        assertEquals(View.VISIBLE, mNameView.getVisibility());
326        assertEquals("Unknown", mNameView.getText().toString());
327    }
328
329    public void testSetCallDetailsHeader_PrivateNumber() {
330        setCallDetailsHeaderWithNumber("", Calls.PRESENTATION_RESTRICTED);
331        assertEquals(View.VISIBLE, mNameView.getVisibility());
332        assertEquals("Private number", mNameView.getText().toString());
333    }
334
335    public void testSetCallDetailsHeader_PayphoneNumber() {
336        setCallDetailsHeaderWithNumber("", Calls.PRESENTATION_PAYPHONE);
337        assertEquals(View.VISIBLE, mNameView.getVisibility());
338        assertEquals("Payphone", mNameView.getText().toString());
339    }
340
341    public void testSetCallDetailsHeader_VoicemailNumber() {
342        PhoneCallDetails details = getPhoneCallDetails(
343                TEST_VOICEMAIL_NUMBER,
344                Calls.PRESENTATION_ALLOWED,
345                TEST_FORMATTED_NUMBER);
346        mHelper.setCallDetailsHeader(mNameView, details);
347        assertEquals(View.VISIBLE, mNameView.getVisibility());
348        assertEquals("Voicemail", mNameView.getText().toString());
349    }
350
351    public void testSetCallDetailsHeader() {
352        setCallDetailsHeader("John Doe");
353        assertEquals(View.VISIBLE, mNameView.getVisibility());
354        assertEquals("John Doe", mNameView.getText().toString());
355    }
356
357    public void testGetCallTypeOrLocation_Geocode() {
358        assertEquals(TEST_GEOCODE, mHelper.getCallTypeOrLocation(getPhoneCallDetails()));
359    }
360
361    public void testGetCallTypeOrLocation_CallType() {
362        PhoneCallDetails details = getPhoneCallDetails();
363        details.geocode = null;
364        details.numberType = Calls.INCOMING_TYPE;
365        mHelper.setPhoneTypeLabelForTest("mobile");
366        assertEquals("mobile", mHelper.getCallTypeOrLocation(details));
367    }
368
369    public void testGetCallTypeOrLocation_DisplayNumber() {
370        PhoneCallDetails details = getPhoneCallDetails("", Calls.PRESENTATION_ALLOWED,
371                TEST_FORMATTED_NUMBER);
372        details.namePrimary = "name";
373        assertEquals(TEST_FORMATTED_NUMBER, mHelper.getCallTypeOrLocation(details));
374    }
375
376    /** Asserts that the name text field contains the value of the given string resource. */
377    private void assertNameEqualsResource(int resId) {
378        assertNameEquals(getContext().getString(resId));
379    }
380
381    /** Asserts that the name text field contains the given string value. */
382    private void assertNameEquals(String text) {
383        assertEquals(text, mViews.nameView.getText().toString());
384    }
385
386    /** Asserts that the location and date text field contains the given string value. */
387    private void assertLocationAndDateContains(String text) {
388        assertTrue(mViews.callLocationAndDate.getText().toString().contains(text));
389    }
390
391    /** Asserts that the location and date text field exactly equals the given string value. */
392    private void assertLocationAndDateExactEquals(String text) {
393        assertEquals(text, mViews.callLocationAndDate.getText());
394    }
395
396    /** Asserts that the via number is correct. */
397    private void assertViaNumberEquals(String text) {
398        final String callAccountText =
399                mContext.getResources().getString(R.string.description_via_number, text);
400        assertEquals(callAccountText, mViews.callAccountLabel.getText());
401    }
402
403    /** Asserts that the account label is correct. */
404    private void assertAccountLabelEquals(String text) {
405        assertEquals(text, mViews.callAccountLabel.getText());
406    }
407
408    /** Asserts that the account label is correct when also showing the via number. */
409    private void assertAccountLabelEquals(String viaNumber, String accountLabel) {
410        final String viaNumberText =
411                mContext.getResources().getString(R.string.description_via_number, viaNumber);
412        assertEquals(accountLabel + " " + viaNumberText, mViews.callAccountLabel.getText());
413    }
414
415    /** Asserts that the call account label is invisible. */
416    private void assertCallAccountInvisible() {
417        assertEquals(mViews.callAccountLabel.getVisibility(), View.GONE);
418    }
419
420    /** Asserts that the duration is exactly as included in the location and date text field. */
421    private void assertDurationExactEquals(String text) {
422        Matcher matcher = Pattern.compile("(.*) (\\u2022) (\\d{2}:\\d{2})").matcher(
423                mViews.callLocationAndDate.getText());
424        assertEquals(true, matcher.matches());
425        assertEquals(text, matcher.group(3));
426    }
427
428    /** Asserts that the video icon is shown. */
429    private void assertIsVideoCall(boolean isVideoCall) {
430        assertEquals(isVideoCall, mViews.callTypeIcons.isVideoShown());
431    }
432
433    /** Asserts that the call type contains the images with the given drawables. */
434    private void assertCallTypeIconsEquals(int... ids) {
435        assertEquals(ids.length, mViews.callTypeIcons.getCount());
436        for (int index = 0; index < ids.length; ++index) {
437            int id = ids[index];
438            assertEquals(id, mViews.callTypeIcons.getCallType(index));
439        }
440        assertEquals(View.VISIBLE, mViews.callTypeIcons.getVisibility());
441    }
442
443    /**
444     * Asserts that the call type contains the images with the given drawables and shows the given
445     * text next to the icons.
446     */
447    private void assertCallTypeIconsEqualsPlusOverflow(String overflowText, int... ids) {
448        assertEquals(ids.length, mViews.callTypeIcons.getCount());
449        for (int index = 0; index < ids.length; ++index) {
450            int id = ids[index];
451            assertEquals(id, mViews.callTypeIcons.getCallType(index));
452        }
453        assertEquals(View.VISIBLE, mViews.callTypeIcons.getVisibility());
454        assertTrue(mViews.callLocationAndDate.getText().toString().contains(overflowText));
455        assertTrue(mViews.callLocationAndDate.getText().toString().contains("Yesterday"));
456    }
457
458    /** Sets the phone call details with default values and the given number. */
459    private void setPhoneCallDetailsWithNumber(String number, int presentation,
460            String formattedNumber) {
461        PhoneCallDetails details = getPhoneCallDetails(number, presentation, formattedNumber);
462        details.callTypes = new int[]{ AppCompatConstants.CALLS_VOICEMAIL_TYPE };
463        mHelper.setPhoneCallDetails(mViews, details);
464    }
465
466    /** Sets the phone call details with default values and the given via number. */
467    private void setPhoneCallDetailsWithViaNumber(String viaNumber) {
468        PhoneCallDetails details = getPhoneCallDetails();
469        mPhoneUtils.setAccountLabel("");
470        details.viaNumber = viaNumber;
471        mHelper.setPhoneCallDetails(mViews, details);
472    }
473
474    /** Sets the phone call details with an account handle. */
475    private void setPhoneCallDetailsWithAccountHandle() {
476        PhoneCallDetails details = getPhoneCallDetails();
477        details.accountHandle = new PhoneAccountHandle(new ComponentName("",""), "");
478        mHelper.setPhoneCallDetails(mViews, details);
479    }
480
481    /** Sets the phone call details with an account handle and via number */
482    private void setPhoneCallDetailsWithAccountLabelViaNumber(String viaNumber) {
483        PhoneCallDetails details = getPhoneCallDetails();
484        details.viaNumber = viaNumber;
485        details.accountHandle = new PhoneAccountHandle(new ComponentName("",""), "");
486        mHelper.setPhoneCallDetails(mViews, details);
487    }
488
489    /** Populates the phone call details with the Defaults. */
490    private void setDefaultPhoneCallDetailsNoViaNumber() {
491        PhoneCallDetails details = getPhoneCallDetails();
492        mPhoneUtils.setAccountLabel("");
493        mHelper.setPhoneCallDetails(mViews, details);
494    }
495
496    /** Sets the phone call details with default values and the given number. */
497    private void setPhoneCallDetailsWithNumberAndGeocode(
498            String number, String formattedNumber, String geocodedLocation) {
499        PhoneCallDetails details = getPhoneCallDetails(
500                number, Calls.PRESENTATION_ALLOWED, formattedNumber);
501        details.geocode = geocodedLocation;
502        mHelper.setPhoneCallDetails(mViews, details);
503    }
504
505    /** Sets the phone call details with default values and the given date. */
506    private void setPhoneCallDetailsWithDate(long date) {
507        PhoneCallDetails details = getPhoneCallDetails();
508        details.date = date;
509        mHelper.setPhoneCallDetails(mViews, details);
510    }
511
512    private void setVoicemailPhoneCallDetailsWithDate(long date) {
513        PhoneCallDetails details = getPhoneCallDetails();
514        details.date = date;
515        details.callTypes = new int[] {Calls.VOICEMAIL_TYPE};
516        mHelper.setPhoneCallDetails(mViews, details);
517    }
518
519    /** Sets the voice mail details with default values and the given duration. */
520    private void setVoicemailPhoneCallDetailsWithDuration(long duration) {
521        PhoneCallDetails details = getPhoneCallDetails();
522        details.duration = duration;
523        details.callTypes = new int[] {Calls.VOICEMAIL_TYPE};
524        mHelper.setPhoneCallDetails(mViews, details);
525    }
526
527    /** Sets the phone call details with default values and the given call types using icons. */
528    private void setPhoneCallDetailsWithCallTypeIcons(int... callTypes) {
529        PhoneCallDetails details = getPhoneCallDetails();
530        details.callTypes = callTypes;
531        mHelper.setPhoneCallDetails(mViews, details);
532    }
533
534    private void setCallDetailsHeaderWithNumber(String number, int presentation) {
535        mHelper.setCallDetailsHeader(mNameView,
536                getPhoneCallDetails(number, presentation, TEST_FORMATTED_NUMBER));
537    }
538
539    private void setCallDetailsHeader(String name) {
540        PhoneCallDetails details = getPhoneCallDetails();
541        details.namePrimary = name;
542        mHelper.setCallDetailsHeader(mNameView, details);
543    }
544
545    private PhoneCallDetails getPhoneCallDetails() {
546        PhoneCallDetails details = new PhoneCallDetails(
547                mContext,
548                TEST_NUMBER,
549                Calls.PRESENTATION_ALLOWED,
550                TEST_FORMATTED_NUMBER,
551                EMPTY_POSTDIAL,
552                false /* isVoicemail */);
553        setDefaultDetails(details);
554        return details;
555    }
556
557    private PhoneCallDetails getPhoneCallDetails(
558            String number, int presentation, String formattedNumber) {
559        PhoneCallDetails details = new PhoneCallDetails(
560                mContext,
561                number,
562                presentation,
563                formattedNumber,
564                EMPTY_POSTDIAL,
565                isVoicemail(number));
566        setDefaultDetails(details);
567        return details;
568    }
569
570    private void setDefaultDetails(PhoneCallDetails details) {
571        details.callTypes = new int[]{ AppCompatConstants.CALLS_INCOMING_TYPE };
572        details.countryIso = TEST_COUNTRY_ISO;
573        details.date = TEST_DATE;
574        details.duration = TEST_DURATION;
575        details.geocode = TEST_GEOCODE;
576    }
577
578    private boolean isVoicemail(String number) {
579        return number.equals(TEST_VOICEMAIL_NUMBER);
580    }
581}
582