summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/calllogutils/CallLogEntryText.java
blob: a7a6bba9a741417695ea530c11b3e07da9170b78 (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
/*
 * Copyright (C) 2017 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.provider.CallLog.Calls;
import android.text.TextUtils;
import com.android.dialer.calllog.model.CoalescedRow;
import com.android.dialer.time.Clock;

/**
 * Computes the primary text and secondary text for call log entries.
 *
 * <p>These text values are shown in the main call log list or in the top item of the bottom sheet
 * menu.
 */
public final class CallLogEntryText {

  /**
   * The primary text for bottom sheets is the same as shown in the entry list.
   *
   * <p>(In the entry list, the number of calls and additional icons are displayed as images
   * following the primary text.)
   */
  public static CharSequence buildPrimaryText(Context context, CoalescedRow row) {
    StringBuilder primaryText = new StringBuilder();
    if (!TextUtils.isEmpty(row.numberAttributes().getName())) {
      primaryText.append(row.numberAttributes().getName());
    } else if (!TextUtils.isEmpty(row.formattedNumber())) {
      primaryText.append(row.formattedNumber());
    } else {
      // TODO(zachh): Handle CallLog.Calls.PRESENTATION_*, including Verizon restricted numbers.
      primaryText.append(context.getText(R.string.new_call_log_unknown));
    }
    return primaryText.toString();
  }

  /**
   * The secondary text to show in the main call log entry list.
   *
   * <p>Rules: (Duo video, )?$Label|$Location • Date
   *
   * <p>Examples:
   *
   * <ul>
   *   <li>Duo Video, Mobile • Now
   *   <li>Duo Video • 10 min ago
   *   <li>Mobile • 11:45 PM
   *   <li>Mobile • Sun
   *   <li>Brooklyn, NJ • Jan 15
   * </ul>
   *
   * <p>See {@link CallLogDates#newCallLogTimestampLabel(Context, long, long)} for date rules.
   */
  public static CharSequence buildSecondaryTextForEntries(
      Context context, Clock clock, CoalescedRow row) {
    StringBuilder secondaryText = secondaryTextPrefix(context, row);

    if (secondaryText.length() > 0) {
      secondaryText.append(" • ");
    }
    secondaryText.append(
        CallLogDates.newCallLogTimestampLabel(context, clock.currentTimeMillis(), row.timestamp()));
    return secondaryText.toString();
  }

  /**
   * The secondary text to show in the top item of the bottom sheet.
   *
   * <p>This is basically the same as {@link #buildSecondaryTextForEntries(Context, Clock,
   * CoalescedRow)} except that instead of suffixing with the time of the call, we suffix with the
   * formatted number.
   */
  public static String buildSecondaryTextForBottomSheet(Context context, CoalescedRow row) {
    /*
     * Rules: (Duo video, )?$Label|$Location [• NumberIfNoName]?
     *
     * The number is shown at the end if there is no name for the entry. (It is shown in primary
     * text otherwise.)
     *
     * Examples:
     *   Duo Video, Mobile • 555-1234
     *   Duo Video • 555-1234
     *   Mobile • 555-1234
     *   Mobile • 555-1234
     *   Brooklyn, NJ
     */
    StringBuilder secondaryText = secondaryTextPrefix(context, row);

    if (TextUtils.isEmpty(row.numberAttributes().getName())) {
      // If the name is empty the number is shown as the primary text and there's nothing to add.
      return secondaryText.toString();
    }
    if (TextUtils.isEmpty(row.formattedNumber())) {
      // If there's no number, don't append anything.
      return secondaryText.toString();
    }
    // Otherwise append the number.
    if (secondaryText.length() > 0) {
      secondaryText.append(" • ");
    }
    secondaryText.append(row.formattedNumber());
    return secondaryText.toString();
  }

  /**
   * Returns a value such as "Duo Video, Mobile" without the time of the call or formatted number
   * appended.
   *
   * <p>When the secondary text is shown in call log entry list, this prefix is suffixed with the
   * time of the call, and when it is shown in a bottom sheet, it is suffixed with the formatted
   * number.
   */
  private static StringBuilder secondaryTextPrefix(Context context, CoalescedRow row) {
    StringBuilder secondaryText = new StringBuilder();
    if ((row.features() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO) {
      // TODO(zachh): Add "Duo" prefix?
      secondaryText.append(context.getText(R.string.new_call_log_video));
    }
    String numberTypeLabel = row.numberAttributes().getNumberTypeLabel();
    if (!TextUtils.isEmpty(numberTypeLabel)) {
      if (secondaryText.length() > 0) {
        secondaryText.append(", ");
      }
      secondaryText.append(numberTypeLabel);
    } else { // If there's a number type label, don't show the location.
      String location = row.geocodedLocation();
      if (!TextUtils.isEmpty(location)) {
        if (secondaryText.length() > 0) {
          secondaryText.append(", ");
        }
        secondaryText.append(location);
      }
    }
    return secondaryText;
  }
}