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