summaryrefslogtreecommitdiffstats
path: root/java/com/android/dialer/calllogutils/PhoneCallDetails.java
blob: 13c528ad27a25fed536f803ada5f6ddc007aae2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.dialer.calllogutils;

import android.content.Context;
import android.content.res.Resources;
import android.net.Uri;
import android.provider.CallLog;
import android.provider.CallLog.Calls;
import android.support.annotation.Nullable;
import android.telecom.PhoneAccountHandle;
import android.text.TextUtils;
import com.android.contacts.common.ContactsUtils.UserType;
import com.android.contacts.common.preference.ContactsPreferences;
import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.dialer.logging.ContactSource;
import com.android.dialer.phonenumbercache.ContactInfo;

/** The details of a phone call to be shown in the UI. */
public class PhoneCallDetails {

  // The number of the other party involved in the call.
  public CharSequence number;
  // Post-dial digits associated with the outgoing call.
  public String postDialDigits;
  // The secondary line number the call was received via.
  public String viaNumber;
  // The number presenting rules set by the network, e.g., {@link Calls#PRESENTATION_ALLOWED}
  public int numberPresentation;
  // The country corresponding with the phone number.
  public String countryIso;
  // The geocoded location for the phone number.
  public String geocode;

  /**
   * The type of calls, as defined in the call log table, e.g., {@link Calls#INCOMING_TYPE}.
   *
   * <p>There might be multiple types if this represents a set of entries grouped together.
   */
  public int[] callTypes;

  // The date of the call, in milliseconds since the epoch.
  public long date;
  // The duration of the call in milliseconds, or 0 for missed calls.
  public long duration;
  // The name of the contact, or the empty string.
  public CharSequence namePrimary;
  // The alternative name of the contact, e.g. last name first, or the empty string
  public CharSequence nameAlternative;
  /**
   * The user's preference on name display order, last name first or first time first. {@see
   * ContactsPreferences}
   */
  public int nameDisplayOrder;
  // The type of phone, e.g., {@link Phone#TYPE_HOME}, 0 if not available.
  public int numberType;
  // The custom label associated with the phone number in the contact, or the empty string.
  public CharSequence numberLabel;
  // The URI of the contact associated with this phone call.
  public Uri contactUri;

  /**
   * The photo URI of the picture of the contact that is associated with this phone call or null if
   * there is none.
   *
   * <p>This is meant to store the high-res photo only.
   */
  public Uri photoUri;

  // The source type of the contact associated with this call.
  public ContactSource.Type sourceType;

  // The object id type of the contact associated with this call.
  public String objectId;

  // The unique identifier for the account associated with the call.
  public PhoneAccountHandle accountHandle;

  // Features applicable to this call.
  public int features;

  // Total data usage for this call.
  public Long dataUsage;

  // Voicemail transcription
  public String transcription;

  // The display string for the number.
  public String displayNumber;

  // Whether the contact number is a voicemail number.
  public boolean isVoicemail;

  /** The {@link UserType} of the contact */
  public @UserType long contactUserType;

  /**
   * If this is a voicemail, whether the message is read. For other types of calls, this defaults to
   * {@code true}.
   */
  public boolean isRead = true;

  // If this call is a spam number.
  public boolean isSpam = false;

  // If this call is a blocked number.
  public boolean isBlocked = false;

  // Call location and date text.
  public CharSequence callLocationAndDate;

  // Call description.
  public CharSequence callDescription;
  public String accountComponentName;
  public String accountId;
  public ContactInfo cachedContactInfo;
  public int voicemailId;
  public int previousGroup;

  /**
   * Constructor with required fields for the details of a call with a number associated with a
   * contact.
   */
  public PhoneCallDetails(
      CharSequence number, int numberPresentation, CharSequence postDialDigits) {
    this.number = number;
    this.numberPresentation = numberPresentation;
    this.postDialDigits = postDialDigits.toString();
  }
  /**
   * Construct the "on {accountLabel} via {viaNumber}" accessibility description for the account
   * list item, depending on the existence of the accountLabel and viaNumber.
   *
   * @param viaNumber The number that this call is being placed via.
   * @param accountLabel The {@link PhoneAccount} label that this call is being placed with.
   * @return The description of the account that this call has been placed on.
   */
  public static CharSequence createAccountLabelDescription(
      Resources resources, @Nullable String viaNumber, @Nullable CharSequence accountLabel) {

    if ((!TextUtils.isEmpty(viaNumber)) && !TextUtils.isEmpty(accountLabel)) {
      String msg =
          resources.getString(
              R.string.description_via_number_phone_account, accountLabel, viaNumber);
      CharSequence accountNumberLabel =
          ContactDisplayUtils.getTelephoneTtsSpannable(msg, viaNumber);
      return (accountNumberLabel == null) ? msg : accountNumberLabel;
    } else if (!TextUtils.isEmpty(viaNumber)) {
      CharSequence viaNumberLabel =
          ContactDisplayUtils.getTtsSpannedPhoneNumber(
              resources, R.string.description_via_number, viaNumber);
      return (viaNumberLabel == null) ? viaNumber : viaNumberLabel;
    } else if (!TextUtils.isEmpty(accountLabel)) {
      return TextUtils.expandTemplate(
          resources.getString(R.string.description_phone_account), accountLabel);
    }
    return "";
  }

  /**
   * Returns the preferred name for the call details as specified by the {@link #nameDisplayOrder}
   *
   * @return the preferred name
   */
  public CharSequence getPreferredName() {
    if (nameDisplayOrder == ContactsPreferences.DISPLAY_ORDER_PRIMARY
        || TextUtils.isEmpty(nameAlternative)) {
      return namePrimary;
    }
    return nameAlternative;
  }

  public void updateDisplayNumber(
      Context context, CharSequence formattedNumber, boolean isVoicemail) {
    displayNumber =
        PhoneNumberDisplayUtil.getDisplayNumber(
                context, number, numberPresentation, formattedNumber, postDialDigits, isVoicemail)
            .toString();
  }

  public boolean hasIncomingCalls() {
    for (int i = 0; i < callTypes.length; i++) {
      if (callTypes[i] == CallLog.Calls.INCOMING_TYPE
          || callTypes[i] == CallLog.Calls.MISSED_TYPE
          || callTypes[i] == CallLog.Calls.VOICEMAIL_TYPE
          || callTypes[i] == CallLog.Calls.REJECTED_TYPE
          || callTypes[i] == CallLog.Calls.BLOCKED_TYPE) {
        return true;
      }
    }
    return false;
  }
}