Home | History | Annotate | Download | only in calllogutils
      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.preference.ContactsPreferences;
     29 import com.android.contacts.common.util.ContactDisplayUtils;
     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 int 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    */
    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    */
    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    */
    185   public CharSequence getPreferredName() {
    186     if (nameDisplayOrder == ContactsPreferences.DISPLAY_ORDER_PRIMARY
    187         || TextUtils.isEmpty(nameAlternative)) {
    188       return namePrimary;
    189     }
    190     return nameAlternative;
    191   }
    192 
    193   public void updateDisplayNumber(
    194       Context context, CharSequence formattedNumber, boolean isVoicemail) {
    195     displayNumber =
    196         PhoneNumberDisplayUtil.getDisplayNumber(
    197                 context, number, numberPresentation, formattedNumber, postDialDigits, isVoicemail)
    198             .toString();
    199   }
    200 
    201   public boolean hasIncomingCalls() {
    202     for (int i = 0; i < callTypes.length; i++) {
    203       if (callTypes[i] == CallLog.Calls.INCOMING_TYPE
    204           || callTypes[i] == CallLog.Calls.MISSED_TYPE
    205           || callTypes[i] == CallLog.Calls.VOICEMAIL_TYPE
    206           || callTypes[i] == CallLog.Calls.REJECTED_TYPE
    207           || callTypes[i] == CallLog.Calls.BLOCKED_TYPE) {
    208         return true;
    209       }
    210     }
    211     return false;
    212   }
    213 }
    214