Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 888e6b14 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge changes I45978ea4,Ia85b1008,I9e68c561,I9255dd3c

* changes:
  BEGIN_PUBLIC Automated rollback of changelist 172683494
  BEGIN_PUBLIC Automated rollback of changelist 172956409
  Download and play voicemails from server when not locally available.
  Updated writing of PhoneLookup columns in annotated call log.
parents ab544521 75d67f5d
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.text.format.Time;
import com.android.contacts.common.util.DateUtils;
@@ -193,7 +194,7 @@ public class CallLogGroupBuilder {
    if (PhoneNumberHelper.isUriNumber(number1) || PhoneNumberHelper.isUriNumber(number2)) {
      return compareSipAddresses(number1, number2);
    } else {
      return PhoneNumberHelper.compare(number1, number2);
      return PhoneNumberUtils.compare(number1, number2);
    }
  }

+8 −8
Original line number Diff line number Diff line
@@ -42,10 +42,9 @@ public class AnnotatedCallLogContract {
    String TIMESTAMP = "timestamp";

    /**
     * Copied from {@link android.provider.CallLog.Calls#CACHED_NAME}.
     *
     * <p>This is exactly how it should appear to the user. If the user's locale or name display
     * preferences change, this column should be rewritten.
     * The name (which may be a person's name or business name, but not a number) formatted exactly
     * as it should appear to the user. If the user's locale or name display preferences change,
     * this column should be rewritten.
     *
     * <p>Type: TEXT
     */
@@ -61,28 +60,29 @@ public class AnnotatedCallLogContract {
    String NUMBER = "number";

    /**
     * Copied from {@link android.provider.CallLog.Calls#CACHED_FORMATTED_NUMBER}.
     * The number formatted as it should be displayed to the user. Note that it may not always be
     * displayed, for example if the number has a corresponding person or business name.
     *
     * <p>Type: TEXT
     */
    String FORMATTED_NUMBER = "formatted_number";

    /**
     * Copied from {@link android.provider.CallLog.Calls#CACHED_PHOTO_URI}.
     * A photo URI for the contact to display in the call log list view.
     *
     * <p>TYPE: TEXT
     */
    String PHOTO_URI = "photo_uri";

    /**
     * Copied from {@link android.provider.CallLog.Calls#CACHED_PHOTO_ID}.
     * A photo ID (from the contacts provider) for the contact to display in the call log list view.
     *
     * <p>Type: INTEGER (long)
     */
    String PHOTO_ID = "photo_id";

    /**
     * Copied from {@link android.provider.CallLog.Calls#CACHED_LOOKUP_URI}.
     * The contacts provider lookup URI for the contact associated with the call.
     *
     * <p>TYPE: TEXT
     */
+23 −8
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import com.android.dialer.DialerPhoneNumber;
import com.android.dialer.calllog.database.contract.AnnotatedCallLogContract.AnnotatedCallLog;
import com.android.dialer.calllog.datasources.CallLogDataSource;
import com.android.dialer.calllog.datasources.CallLogMutations;
import com.android.dialer.calllog.datasources.util.RowCombiner;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor;
import com.android.dialer.common.concurrent.Annotations.LightweightExecutor;
@@ -260,8 +261,13 @@ public final class PhoneLookupDataSource implements CallLogDataSource {
  @WorkerThread
  @Override
  public ContentValues coalesce(List<ContentValues> individualRowsSortedByTimestampDesc) {
    // TODO(zachh): Implementation.
    return new ContentValues();
    return new RowCombiner(individualRowsSortedByTimestampDesc)
        .useMostRecentString(AnnotatedCallLog.NAME)
        .useMostRecentString(AnnotatedCallLog.NUMBER_TYPE_LABEL)
        .useMostRecentString(AnnotatedCallLog.PHOTO_URI)
        .useMostRecentLong(AnnotatedCallLog.PHOTO_ID)
        .useMostRecentString(AnnotatedCallLog.LOOKUP_URI)
        .combine();
  }

  @MainThread
@@ -434,7 +440,7 @@ public final class PhoneLookupDataSource implements CallLogDataSource {
      PhoneLookupInfo phoneLookupInfo = existingInfo.get(id);
      // Existing info might be missing if data was cleared or for other reasons.
      if (phoneLookupInfo != null) {
        contentValues.put(AnnotatedCallLog.NAME, selectName(phoneLookupInfo));
        updateContentValues(contentValues, phoneLookupInfo);
      }
    }
  }
@@ -474,17 +480,17 @@ public final class PhoneLookupDataSource implements CallLogDataSource {
         * mutations from PhoneLookupHistory; in this case "John" would be copied during
         * populateInserts() and there wouldn't be further updates needed here.
         */
        contentValuesToInsert.put(AnnotatedCallLog.NAME, selectName(phoneLookupInfo));
        updateContentValues(contentValuesToInsert, phoneLookupInfo);
        continue;
      }
      ContentValues contentValuesToUpdate = mutations.getUpdates().get(id);
      if (contentValuesToUpdate != null) {
        contentValuesToUpdate.put(AnnotatedCallLog.NAME, selectName(phoneLookupInfo));
        updateContentValues(contentValuesToUpdate, phoneLookupInfo);
        continue;
      }
      // Else this row is not already scheduled for insert or update and we need to schedule it.
      ContentValues contentValues = new ContentValues();
      contentValues.put(AnnotatedCallLog.NAME, selectName(phoneLookupInfo));
      updateContentValues(contentValues, phoneLookupInfo);
      mutations.getUpdates().put(id, contentValues);
    }
  }
@@ -525,8 +531,17 @@ public final class PhoneLookupDataSource implements CallLogDataSource {
    return normalizedNumbersToDelete;
  }

  private static String selectName(PhoneLookupInfo phoneLookupInfo) {
    return PhoneLookupSelector.selectName(phoneLookupInfo);
  private static void updateContentValues(
      ContentValues contentValues, PhoneLookupInfo phoneLookupInfo) {
    contentValues.put(AnnotatedCallLog.NAME, PhoneLookupSelector.selectName(phoneLookupInfo));
    contentValues.put(
        AnnotatedCallLog.PHOTO_URI, PhoneLookupSelector.selectPhotoUri(phoneLookupInfo));
    contentValues.put(
        AnnotatedCallLog.PHOTO_ID, PhoneLookupSelector.selectPhotoId(phoneLookupInfo));
    contentValues.put(
        AnnotatedCallLog.LOOKUP_URI, PhoneLookupSelector.selectLookupUri(phoneLookupInfo));
    contentValues.put(
        AnnotatedCallLog.NUMBER_TYPE_LABEL, PhoneLookupSelector.selectNumberLabel(phoneLookupInfo));
  }

  private static Uri numberUri(String number) {
+8 −49
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ import android.os.Build;
import android.os.Handler;
import android.provider.CallLog;
import android.provider.CallLog.Calls;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.support.annotation.ColorInt;
import android.support.annotation.MainThread;
import android.support.annotation.Nullable;
@@ -35,6 +34,7 @@ import android.support.annotation.VisibleForTesting;
import android.support.annotation.WorkerThread;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.util.ArraySet;
import com.android.dialer.DialerPhoneNumber;
@@ -174,23 +174,16 @@ public class SystemCallLogDataSource implements CallLogDataSource {

  @Override
  public ContentValues coalesce(List<ContentValues> individualRowsSortedByTimestampDesc) {
    // TODO(zachh): Complete implementation.

    assertNoVoicemailsInRows(individualRowsSortedByTimestampDesc);

    return new RowCombiner(individualRowsSortedByTimestampDesc)
        .useMostRecentLong(AnnotatedCallLog.TIMESTAMP)
        .useMostRecentLong(AnnotatedCallLog.NEW)
        .useMostRecentString(AnnotatedCallLog.NUMBER_TYPE_LABEL)
        .useMostRecentString(AnnotatedCallLog.NAME)
        // Two different DialerPhoneNumbers could be combined if they are different but considered
        // to be an "exact match" by libphonenumber; in this case we arbitrarily select the most
        // recent one.
        .useMostRecentBlob(AnnotatedCallLog.NUMBER)
        .useMostRecentString(AnnotatedCallLog.FORMATTED_NUMBER)
        .useMostRecentString(AnnotatedCallLog.PHOTO_URI)
        .useMostRecentLong(AnnotatedCallLog.PHOTO_ID)
        .useMostRecentString(AnnotatedCallLog.LOOKUP_URI)
        .useMostRecentString(AnnotatedCallLog.GEOCODED_LOCATION)
        .useSingleValueString(AnnotatedCallLog.PHONE_ACCOUNT_COMPONENT_NAME)
        .useSingleValueString(AnnotatedCallLog.PHONE_ACCOUNT_ID)
@@ -233,13 +226,6 @@ public class SystemCallLogDataSource implements CallLogDataSource {
                  Calls.NUMBER,
                  Calls.TYPE,
                  Calls.COUNTRY_ISO,
                  Calls.CACHED_NAME,
                  Calls.CACHED_FORMATTED_NUMBER,
                  Calls.CACHED_PHOTO_URI,
                  Calls.CACHED_PHOTO_ID,
                  Calls.CACHED_LOOKUP_URI,
                  Calls.CACHED_NUMBER_TYPE,
                  Calls.CACHED_NUMBER_LABEL,
                  Calls.DURATION,
                  Calls.DATA_USAGE,
                  Calls.TRANSCRIPTION,
@@ -272,14 +258,6 @@ public class SystemCallLogDataSource implements CallLogDataSource {
        int numberColumn = cursor.getColumnIndexOrThrow(Calls.NUMBER);
        int typeColumn = cursor.getColumnIndexOrThrow(Calls.TYPE);
        int countryIsoColumn = cursor.getColumnIndexOrThrow(Calls.COUNTRY_ISO);
        int cachedNameColumn = cursor.getColumnIndexOrThrow(Calls.CACHED_NAME);
        int cachedFormattedNumberColumn =
            cursor.getColumnIndexOrThrow(Calls.CACHED_FORMATTED_NUMBER);
        int cachedPhotoUriColumn = cursor.getColumnIndexOrThrow(Calls.CACHED_PHOTO_URI);
        int cachedPhotoIdColumn = cursor.getColumnIndexOrThrow(Calls.CACHED_PHOTO_ID);
        int cachedLookupUriColumn = cursor.getColumnIndexOrThrow(Calls.CACHED_LOOKUP_URI);
        int cachedNumberTypeColumn = cursor.getColumnIndexOrThrow(Calls.CACHED_NUMBER_TYPE);
        int cachedNumberLabelColumn = cursor.getColumnIndexOrThrow(Calls.CACHED_NUMBER_LABEL);
        int durationsColumn = cursor.getColumnIndexOrThrow(Calls.DURATION);
        int dataUsageColumn = cursor.getColumnIndexOrThrow(Calls.DATA_USAGE);
        int transcriptionColumn = cursor.getColumnIndexOrThrow(Calls.TRANSCRIPTION);
@@ -301,13 +279,6 @@ public class SystemCallLogDataSource implements CallLogDataSource {
          String numberAsStr = cursor.getString(numberColumn);
          long type = cursor.getInt(typeColumn);
          String countryIso = cursor.getString(countryIsoColumn);
          String cachedName = cursor.getString(cachedNameColumn);
          String formattedNumber = cursor.getString(cachedFormattedNumberColumn);
          String cachedPhotoUri = cursor.getString(cachedPhotoUriColumn);
          long cachedPhotoId = cursor.getLong(cachedPhotoIdColumn);
          String cachedLookupUri = cursor.getString(cachedLookupUriColumn);
          int cachedNumberType = cursor.getInt(cachedNumberTypeColumn);
          String cachedNumberLabel = cursor.getString(cachedNumberLabelColumn);
          int duration = cursor.getInt(durationsColumn);
          int dataUsage = cursor.getInt(dataUsageColumn);
          String transcription = cursor.getString(transcriptionColumn);
@@ -323,31 +294,19 @@ public class SystemCallLogDataSource implements CallLogDataSource {
          contentValues.put(AnnotatedCallLog.TIMESTAMP, date);

          if (!TextUtils.isEmpty(numberAsStr)) {
            byte[] numberAsProtoBytes =
                dialerPhoneNumberUtil.parse(numberAsStr, countryIso).toByteArray();
            DialerPhoneNumber dialerPhoneNumber =
                dialerPhoneNumberUtil.parse(numberAsStr, countryIso);

            contentValues.put(AnnotatedCallLog.NUMBER, dialerPhoneNumber.toByteArray());
            contentValues.put(
                AnnotatedCallLog.FORMATTED_NUMBER,
                PhoneNumberUtils.formatNumber(numberAsStr, countryIso));
            // TODO(zachh): Need to handle post-dial digits; different on N and M.
            contentValues.put(AnnotatedCallLog.NUMBER, numberAsProtoBytes);
          } else {
            contentValues.put(
                AnnotatedCallLog.NUMBER, DialerPhoneNumber.getDefaultInstance().toByteArray());
          }

          contentValues.put(AnnotatedCallLog.CALL_TYPE, type);
          contentValues.put(AnnotatedCallLog.NAME, cachedName);
          // TODO(zachh): Format the number using DialerPhoneNumberUtil here.
          contentValues.put(AnnotatedCallLog.FORMATTED_NUMBER, formattedNumber);
          contentValues.put(AnnotatedCallLog.PHOTO_URI, cachedPhotoUri);
          contentValues.put(AnnotatedCallLog.PHOTO_ID, cachedPhotoId);
          contentValues.put(AnnotatedCallLog.LOOKUP_URI, cachedLookupUri);

          // Phone.getTypeLabel returns "Custom" if given (0, null) which is not of any use. Just
          // omit setting the label if there's no information for it.
          if (cachedNumberType != 0 || cachedNumberLabel != null) {
            contentValues.put(
                AnnotatedCallLog.NUMBER_TYPE_LABEL,
                Phone.getTypeLabel(appContext.getResources(), cachedNumberType, cachedNumberLabel)
                    .toString());
          }
          contentValues.put(AnnotatedCallLog.IS_READ, isRead);
          contentValues.put(AnnotatedCallLog.NEW, isNew);
          contentValues.put(AnnotatedCallLog.GEOCODED_LOCATION, geocodedLocation);
+75 −4
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@
package com.android.dialer.phonelookup;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.android.dialer.phonelookup.PhoneLookupInfo.Cp2Info.Cp2ContactInfo;

/**
 * Prioritizes information from a {@link PhoneLookupInfo}.
@@ -37,11 +39,80 @@ public final class PhoneLookupSelector {
   */
  @NonNull
  public static String selectName(PhoneLookupInfo phoneLookupInfo) {
    if (phoneLookupInfo.getCp2Info().getCp2ContactInfoCount() > 0) {
      // Arbitrarily select the first contact's name. In the future, it may make sense to join the
      // names such as "Mom, Dad" in the case that multiple contacts share the same number.
      return phoneLookupInfo.getCp2Info().getCp2ContactInfo(0).getName();
    Cp2ContactInfo firstLocalContact = firstLocalContact(phoneLookupInfo);
    if (firstLocalContact != null) {
      String name = firstLocalContact.getName();
      if (!name.isEmpty()) {
        return firstLocalContact.getName();
      }
    }
    return "";
  }

  /** Select the photo URI associated with this number. */
  @NonNull
  public static String selectPhotoUri(PhoneLookupInfo phoneLookupInfo) {
    Cp2ContactInfo firstLocalContact = firstLocalContact(phoneLookupInfo);
    if (firstLocalContact != null) {
      String photoUri = firstLocalContact.getPhotoUri();
      if (!photoUri.isEmpty()) {
        return photoUri;
      }
    }
    return "";
  }

  /** Select the photo ID associated with this number, or 0 if there is none. */
  public static long selectPhotoId(PhoneLookupInfo phoneLookupInfo) {
    Cp2ContactInfo firstLocalContact = firstLocalContact(phoneLookupInfo);
    if (firstLocalContact != null) {
      long photoId = firstLocalContact.getPhotoId();
      if (photoId > 0) {
        return photoId;
      }
    }
    return 0;
  }

  /** Select the lookup URI associated with this number. */
  @NonNull
  public static String selectLookupUri(PhoneLookupInfo phoneLookupInfo) {
    Cp2ContactInfo firstLocalContact = firstLocalContact(phoneLookupInfo);
    if (firstLocalContact != null) {
      String lookupUri = firstLocalContact.getLookupUri();
      if (!lookupUri.isEmpty()) {
        return lookupUri;
      }
    }
    return "";
  }

  /**
   * A localized string representing the number type such as "Home" or "Mobile", or a custom value
   * set by the user.
   */
  @NonNull
  public static String selectNumberLabel(PhoneLookupInfo phoneLookupInfo) {
    Cp2ContactInfo firstLocalContact = firstLocalContact(phoneLookupInfo);
    if (firstLocalContact != null) {
      String label = firstLocalContact.getLabel();
      if (!label.isEmpty()) {
        return label;
      }
    }
    return "";
  }

  /**
   * Arbitrarily select the first contact. In the future, it may make sense to display contact
   * information from all contacts with the same number (for example show the name as "Mom, Dad" or
   * show a synthesized photo containing photos of both "Mom" and "Dad").
   */
  @Nullable
  private static Cp2ContactInfo firstLocalContact(PhoneLookupInfo phoneLookupInfo) {
    if (phoneLookupInfo.getCp2Info().getCp2ContactInfoCount() > 0) {
      return phoneLookupInfo.getCp2Info().getCp2ContactInfo(0);
    }
    return null;
  }
}
Loading