1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/*
2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2011 The Android Open Source Project
3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License");
5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License.
6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at
7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *      http://www.apache.org/licenses/LICENSE-2.0
9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software
11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS,
12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and
14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License.
15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */
16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
17d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianpackage com.android.dialer.calllogutils;
18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.Context;
20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.res.Resources;
21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.net.Uri;
22ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.CallLog;
23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.CallLog.Calls;
24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.Nullable;
25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.telecom.PhoneAccountHandle;
26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.text.TextUtils;
27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.ContactsUtils.UserType;
28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.preference.ContactsPreferences;
29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.util.ContactDisplayUtils;
308369df095a73a77b3715f8ae7ba06089cebca4ceEric Erfanianimport com.android.dialer.logging.ContactSource;
31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.phonenumbercache.ContactInfo;
32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/** The details of a phone call to be shown in the UI. */
34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class PhoneCallDetails {
35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // The number of the other party involved in the call.
37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public CharSequence number;
38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // Post-dial digits associated with the outgoing call.
39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public String postDialDigits;
40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // The secondary line number the call was received via.
41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public String viaNumber;
42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // The number presenting rules set by the network, e.g., {@link Calls#PRESENTATION_ALLOWED}
43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public int numberPresentation;
44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // The country corresponding with the phone number.
45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public String countryIso;
46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // The geocoded location for the phone number.
47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public String geocode;
48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /**
50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * The type of calls, as defined in the call log table, e.g., {@link Calls#INCOMING_TYPE}.
51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   *
52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * <p>There might be multiple types if this represents a set of entries grouped together.
53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   */
54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public int[] callTypes;
55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // The date of the call, in milliseconds since the epoch.
57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public long date;
58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // The duration of the call in milliseconds, or 0 for missed calls.
59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public long duration;
60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // The name of the contact, or the empty string.
61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public CharSequence namePrimary;
62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // The alternative name of the contact, e.g. last name first, or the empty string
63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public CharSequence nameAlternative;
64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /**
65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * The user's preference on name display order, last name first or first time first. {@see
66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * ContactsPreferences}
67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   */
68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public int nameDisplayOrder;
69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // The type of phone, e.g., {@link Phone#TYPE_HOME}, 0 if not available.
70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public int numberType;
71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // The custom label associated with the phone number in the contact, or the empty string.
72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public CharSequence numberLabel;
73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // The URI of the contact associated with this phone call.
74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public Uri contactUri;
75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /**
77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * The photo URI of the picture of the contact that is associated with this phone call or null if
78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * there is none.
79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   *
80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * <p>This is meant to store the high-res photo only.
81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   */
82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public Uri photoUri;
83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // The source type of the contact associated with this call.
858369df095a73a77b3715f8ae7ba06089cebca4ceEric Erfanian  public ContactSource.Type sourceType;
86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // The object id type of the contact associated with this call.
88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public String objectId;
89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // The unique identifier for the account associated with the call.
91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public PhoneAccountHandle accountHandle;
92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
93ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // Features applicable to this call.
94ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public int features;
95ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
96ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // Total data usage for this call.
97ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public Long dataUsage;
98ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
99ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // Voicemail transcription
100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public String transcription;
101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // The display string for the number.
103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public String displayNumber;
104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
105ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // Whether the contact number is a voicemail number.
106ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public boolean isVoicemail;
107ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
108ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /** The {@link UserType} of the contact */
109ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public @UserType long contactUserType;
110ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
111ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /**
112ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * If this is a voicemail, whether the message is read. For other types of calls, this defaults to
113ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * {@code true}.
114ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   */
115ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public boolean isRead = true;
116ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
117ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // If this call is a spam number.
118ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public boolean isSpam = false;
119ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
120ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // If this call is a blocked number.
121ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public boolean isBlocked = false;
122ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
123ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // Call location and date text.
124ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public CharSequence callLocationAndDate;
125ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
126ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // Call description.
127ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public CharSequence callDescription;
128ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public String accountComponentName;
129ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public String accountId;
130ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public ContactInfo cachedContactInfo;
131ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public int voicemailId;
132ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public int previousGroup;
133ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
134ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /**
135ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * Constructor with required fields for the details of a call with a number associated with a
136ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * contact.
137ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   */
138ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public PhoneCallDetails(
139ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      CharSequence number, int numberPresentation, CharSequence postDialDigits) {
140ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    this.number = number;
141ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    this.numberPresentation = numberPresentation;
142ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    this.postDialDigits = postDialDigits.toString();
143ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
144ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /**
145ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * Construct the "on {accountLabel} via {viaNumber}" accessibility description for the account
146ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * list item, depending on the existence of the accountLabel and viaNumber.
147ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   *
148ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * @param viaNumber The number that this call is being placed via.
149ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * @param accountLabel The {@link PhoneAccount} label that this call is being placed with.
150ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * @return The description of the account that this call has been placed on.
151ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   */
152ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public static CharSequence createAccountLabelDescription(
153ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      Resources resources, @Nullable String viaNumber, @Nullable CharSequence accountLabel) {
154ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
155ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if ((!TextUtils.isEmpty(viaNumber)) && !TextUtils.isEmpty(accountLabel)) {
156ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      String msg =
157ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          resources.getString(
158ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian              R.string.description_via_number_phone_account, accountLabel, viaNumber);
159ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      CharSequence accountNumberLabel =
160ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          ContactDisplayUtils.getTelephoneTtsSpannable(msg, viaNumber);
161ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return (accountNumberLabel == null) ? msg : accountNumberLabel;
162ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    } else if (!TextUtils.isEmpty(viaNumber)) {
163ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      CharSequence viaNumberLabel =
164ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          ContactDisplayUtils.getTtsSpannedPhoneNumber(
165ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian              resources, R.string.description_via_number, viaNumber);
166ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return (viaNumberLabel == null) ? viaNumber : viaNumberLabel;
167ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    } else if (!TextUtils.isEmpty(accountLabel)) {
168ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return TextUtils.expandTemplate(
169ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          resources.getString(R.string.description_phone_account), accountLabel);
170ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
171ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return "";
172ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
173ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
174ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /**
175ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * Returns the preferred name for the call details as specified by the {@link #nameDisplayOrder}
176ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   *
177ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * @return the preferred name
178ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   */
179ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public CharSequence getPreferredName() {
180ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (nameDisplayOrder == ContactsPreferences.DISPLAY_ORDER_PRIMARY
181ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        || TextUtils.isEmpty(nameAlternative)) {
182ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return namePrimary;
183ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
184ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return nameAlternative;
185ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
186ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
187ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void updateDisplayNumber(
188ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      Context context, CharSequence formattedNumber, boolean isVoicemail) {
189ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    displayNumber =
190ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        PhoneNumberDisplayUtil.getDisplayNumber(
191ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian                context, number, numberPresentation, formattedNumber, postDialDigits, isVoicemail)
192ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            .toString();
193ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
194ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
195ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public boolean hasIncomingCalls() {
196ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    for (int i = 0; i < callTypes.length; i++) {
197ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      if (callTypes[i] == CallLog.Calls.INCOMING_TYPE
198ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          || callTypes[i] == CallLog.Calls.MISSED_TYPE
199ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          || callTypes[i] == CallLog.Calls.VOICEMAIL_TYPE
200ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          || callTypes[i] == CallLog.Calls.REJECTED_TYPE
201ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          || callTypes[i] == CallLog.Calls.BLOCKED_TYPE) {
202ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        return true;
203ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      }
204ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
205ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return false;
206ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
207ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian}
208