summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java219
1 files changed, 124 insertions, 95 deletions
diff --git a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
index aa4260cba..df4e66e8b 100644
--- a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
+++ b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
@@ -51,6 +51,7 @@ import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor;
import com.android.dialer.compat.android.provider.VoicemailCompat;
+import com.android.dialer.duo.DuoConstants;
import com.android.dialer.inject.ApplicationContext;
import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil;
import com.android.dialer.storage.Unencrypted;
@@ -277,111 +278,139 @@ public class SystemCallLogDataSource implements CallLogDataSource {
return;
}
+ if (!cursor.moveToFirst()) {
+ LogUtil.i("SystemCallLogDataSource.handleInsertsAndUpdates", "no entries to insert/update");
+ return;
+ }
+
LogUtil.i(
"SystemCallLogDataSource.handleInsertsAndUpdates",
"found %d entries to insert/update",
cursor.getCount());
- if (cursor.moveToFirst()) {
- int idColumn = cursor.getColumnIndexOrThrow(Calls._ID);
- int dateColumn = cursor.getColumnIndexOrThrow(Calls.DATE);
- int lastModifiedColumn = cursor.getColumnIndexOrThrow(Calls.LAST_MODIFIED);
- int numberColumn = cursor.getColumnIndexOrThrow(Calls.NUMBER);
- int presentationColumn = cursor.getColumnIndexOrThrow(Calls.NUMBER_PRESENTATION);
- int typeColumn = cursor.getColumnIndexOrThrow(Calls.TYPE);
- int countryIsoColumn = cursor.getColumnIndexOrThrow(Calls.COUNTRY_ISO);
- int durationsColumn = cursor.getColumnIndexOrThrow(Calls.DURATION);
- int dataUsageColumn = cursor.getColumnIndexOrThrow(Calls.DATA_USAGE);
- int transcriptionColumn = cursor.getColumnIndexOrThrow(Calls.TRANSCRIPTION);
- int voicemailUriColumn = cursor.getColumnIndexOrThrow(Calls.VOICEMAIL_URI);
- int isReadColumn = cursor.getColumnIndexOrThrow(Calls.IS_READ);
- int newColumn = cursor.getColumnIndexOrThrow(Calls.NEW);
- int geocodedLocationColumn = cursor.getColumnIndexOrThrow(Calls.GEOCODED_LOCATION);
- int phoneAccountComponentColumn =
- cursor.getColumnIndexOrThrow(Calls.PHONE_ACCOUNT_COMPONENT_NAME);
- int phoneAccountIdColumn = cursor.getColumnIndexOrThrow(Calls.PHONE_ACCOUNT_ID);
- int featuresColumn = cursor.getColumnIndexOrThrow(Calls.FEATURES);
- int postDialDigitsColumn = cursor.getColumnIndexOrThrow(Calls.POST_DIAL_DIGITS);
-
- // The cursor orders by LAST_MODIFIED DESC, so the first result is the most recent timestamp
- // processed.
- lastTimestampProcessed = cursor.getLong(lastModifiedColumn);
- do {
- long id = cursor.getLong(idColumn);
- long date = cursor.getLong(dateColumn);
- String numberAsStr = cursor.getString(numberColumn);
- int type;
- if (cursor.isNull(typeColumn) || (type = cursor.getInt(typeColumn)) == 0) {
- // CallLog.Calls#TYPE lists the allowed values, which are non-null and non-zero.
- throw new IllegalStateException("call type is missing");
- }
- int presentation;
- if (cursor.isNull(presentationColumn)
- || (presentation = cursor.getInt(presentationColumn)) == 0) {
- // CallLog.Calls#NUMBER_PRESENTATION lists the allowed values, which are non-null and
- // non-zero.
- throw new IllegalStateException("presentation is missing");
- }
- String countryIso = cursor.getString(countryIsoColumn);
- int duration = cursor.getInt(durationsColumn);
- int dataUsage = cursor.getInt(dataUsageColumn);
- String transcription = cursor.getString(transcriptionColumn);
- String voicemailUri = cursor.getString(voicemailUriColumn);
- int isRead = cursor.getInt(isReadColumn);
- int isNew = cursor.getInt(newColumn);
- String geocodedLocation = cursor.getString(geocodedLocationColumn);
- String phoneAccountComponentName = cursor.getString(phoneAccountComponentColumn);
- String phoneAccountId = cursor.getString(phoneAccountIdColumn);
- int features = cursor.getInt(featuresColumn);
- String postDialDigits = cursor.getString(postDialDigitsColumn);
-
- ContentValues contentValues = new ContentValues();
- contentValues.put(AnnotatedCallLog.TIMESTAMP, date);
-
- if (!TextUtils.isEmpty(numberAsStr)) {
- String numberWithPostDialDigits =
- postDialDigits == null ? numberAsStr : numberAsStr + postDialDigits;
- DialerPhoneNumber dialerPhoneNumber =
- dialerPhoneNumberUtil.parse(numberWithPostDialDigits, countryIso);
-
- contentValues.put(AnnotatedCallLog.NUMBER, dialerPhoneNumber.toByteArray());
- String formattedNumber =
- PhoneNumberUtils.formatNumber(numberWithPostDialDigits, countryIso);
- if (formattedNumber == null) {
- formattedNumber = numberWithPostDialDigits;
- }
- contentValues.put(AnnotatedCallLog.FORMATTED_NUMBER, formattedNumber);
- } else {
- contentValues.put(
- AnnotatedCallLog.NUMBER, DialerPhoneNumber.getDefaultInstance().toByteArray());
+ int idColumn = cursor.getColumnIndexOrThrow(Calls._ID);
+ int dateColumn = cursor.getColumnIndexOrThrow(Calls.DATE);
+ int lastModifiedColumn = cursor.getColumnIndexOrThrow(Calls.LAST_MODIFIED);
+ int numberColumn = cursor.getColumnIndexOrThrow(Calls.NUMBER);
+ int presentationColumn = cursor.getColumnIndexOrThrow(Calls.NUMBER_PRESENTATION);
+ int typeColumn = cursor.getColumnIndexOrThrow(Calls.TYPE);
+ int countryIsoColumn = cursor.getColumnIndexOrThrow(Calls.COUNTRY_ISO);
+ int durationsColumn = cursor.getColumnIndexOrThrow(Calls.DURATION);
+ int dataUsageColumn = cursor.getColumnIndexOrThrow(Calls.DATA_USAGE);
+ int transcriptionColumn = cursor.getColumnIndexOrThrow(Calls.TRANSCRIPTION);
+ int voicemailUriColumn = cursor.getColumnIndexOrThrow(Calls.VOICEMAIL_URI);
+ int isReadColumn = cursor.getColumnIndexOrThrow(Calls.IS_READ);
+ int newColumn = cursor.getColumnIndexOrThrow(Calls.NEW);
+ int geocodedLocationColumn = cursor.getColumnIndexOrThrow(Calls.GEOCODED_LOCATION);
+ int phoneAccountComponentColumn =
+ cursor.getColumnIndexOrThrow(Calls.PHONE_ACCOUNT_COMPONENT_NAME);
+ int phoneAccountIdColumn = cursor.getColumnIndexOrThrow(Calls.PHONE_ACCOUNT_ID);
+ int featuresColumn = cursor.getColumnIndexOrThrow(Calls.FEATURES);
+ int postDialDigitsColumn = cursor.getColumnIndexOrThrow(Calls.POST_DIAL_DIGITS);
+
+ // The cursor orders by LAST_MODIFIED DESC, so the first result is the most recent timestamp
+ // processed.
+ lastTimestampProcessed = cursor.getLong(lastModifiedColumn);
+ do {
+ long id = cursor.getLong(idColumn);
+ long date = cursor.getLong(dateColumn);
+ String numberAsStr = cursor.getString(numberColumn);
+ int type;
+ if (cursor.isNull(typeColumn) || (type = cursor.getInt(typeColumn)) == 0) {
+ // CallLog.Calls#TYPE lists the allowed values, which are non-null and non-zero.
+ throw new IllegalStateException("call type is missing");
+ }
+ int presentation;
+ if (cursor.isNull(presentationColumn)
+ || (presentation = cursor.getInt(presentationColumn)) == 0) {
+ // CallLog.Calls#NUMBER_PRESENTATION lists the allowed values, which are non-null and
+ // non-zero.
+ throw new IllegalStateException("presentation is missing");
+ }
+ String countryIso = cursor.getString(countryIsoColumn);
+ int duration = cursor.getInt(durationsColumn);
+ int dataUsage = cursor.getInt(dataUsageColumn);
+ String transcription = cursor.getString(transcriptionColumn);
+ String voicemailUri = cursor.getString(voicemailUriColumn);
+ int isRead = cursor.getInt(isReadColumn);
+ int isNew = cursor.getInt(newColumn);
+ String geocodedLocation = cursor.getString(geocodedLocationColumn);
+ String phoneAccountComponentName = cursor.getString(phoneAccountComponentColumn);
+ String phoneAccountId = cursor.getString(phoneAccountIdColumn);
+ int features = cursor.getInt(featuresColumn);
+ String postDialDigits = cursor.getString(postDialDigitsColumn);
+
+ // Exclude Duo audio calls.
+ if (isDuoAudioCall(phoneAccountComponentName, features)) {
+ continue;
+ }
+
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(AnnotatedCallLog.TIMESTAMP, date);
+
+ if (!TextUtils.isEmpty(numberAsStr)) {
+ String numberWithPostDialDigits =
+ postDialDigits == null ? numberAsStr : numberAsStr + postDialDigits;
+ DialerPhoneNumber dialerPhoneNumber =
+ dialerPhoneNumberUtil.parse(numberWithPostDialDigits, countryIso);
+
+ contentValues.put(AnnotatedCallLog.NUMBER, dialerPhoneNumber.toByteArray());
+ String formattedNumber =
+ PhoneNumberUtils.formatNumber(numberWithPostDialDigits, countryIso);
+ if (formattedNumber == null) {
+ formattedNumber = numberWithPostDialDigits;
}
- contentValues.put(AnnotatedCallLog.NUMBER_PRESENTATION, presentation);
- contentValues.put(AnnotatedCallLog.CALL_TYPE, type);
- contentValues.put(AnnotatedCallLog.IS_READ, isRead);
- contentValues.put(AnnotatedCallLog.NEW, isNew);
- contentValues.put(AnnotatedCallLog.GEOCODED_LOCATION, geocodedLocation);
+ contentValues.put(AnnotatedCallLog.FORMATTED_NUMBER, formattedNumber);
+ } else {
contentValues.put(
- AnnotatedCallLog.PHONE_ACCOUNT_COMPONENT_NAME, phoneAccountComponentName);
- contentValues.put(AnnotatedCallLog.PHONE_ACCOUNT_ID, phoneAccountId);
- populatePhoneAccountLabelAndColor(
- appContext, contentValues, phoneAccountComponentName, phoneAccountId);
- contentValues.put(AnnotatedCallLog.FEATURES, features);
- contentValues.put(AnnotatedCallLog.DURATION, duration);
- contentValues.put(AnnotatedCallLog.DATA_USAGE, dataUsage);
- contentValues.put(AnnotatedCallLog.TRANSCRIPTION, transcription);
- contentValues.put(AnnotatedCallLog.VOICEMAIL_URI, voicemailUri);
- setTranscriptionState(cursor, contentValues);
-
- if (existingAnnotatedCallLogIds.contains(id)) {
- mutations.update(id, contentValues);
- } else {
- mutations.insert(id, contentValues);
- }
- } while (cursor.moveToNext());
- } // else no new results, do nothing.
+ AnnotatedCallLog.NUMBER, DialerPhoneNumber.getDefaultInstance().toByteArray());
+ }
+ contentValues.put(AnnotatedCallLog.NUMBER_PRESENTATION, presentation);
+ contentValues.put(AnnotatedCallLog.CALL_TYPE, type);
+ contentValues.put(AnnotatedCallLog.IS_READ, isRead);
+ contentValues.put(AnnotatedCallLog.NEW, isNew);
+ contentValues.put(AnnotatedCallLog.GEOCODED_LOCATION, geocodedLocation);
+ contentValues.put(AnnotatedCallLog.PHONE_ACCOUNT_COMPONENT_NAME, phoneAccountComponentName);
+ contentValues.put(AnnotatedCallLog.PHONE_ACCOUNT_ID, phoneAccountId);
+ populatePhoneAccountLabelAndColor(
+ appContext, contentValues, phoneAccountComponentName, phoneAccountId);
+ contentValues.put(AnnotatedCallLog.FEATURES, features);
+ contentValues.put(AnnotatedCallLog.DURATION, duration);
+ contentValues.put(AnnotatedCallLog.DATA_USAGE, dataUsage);
+ contentValues.put(AnnotatedCallLog.TRANSCRIPTION, transcription);
+ contentValues.put(AnnotatedCallLog.VOICEMAIL_URI, voicemailUri);
+ setTranscriptionState(cursor, contentValues);
+
+ if (existingAnnotatedCallLogIds.contains(id)) {
+ mutations.update(id, contentValues);
+ } else {
+ mutations.insert(id, contentValues);
+ }
+ } while (cursor.moveToNext());
}
}
+ /**
+ * Returns true if the phone account component name and the features belong to a Duo audio call.
+ *
+ * <p>Characteristics of a Duo audio call are as follows.
+ *
+ * <ul>
+ * <li>The phone account component name is {@link DuoConstants#PHONE_ACCOUNT_COMPONENT_NAME};
+ * and
+ * <li>The features don't include {@link Calls#FEATURES_VIDEO}.
+ * </ul>
+ *
+ * <p>It is the caller's responsibility to ensure the phone account component name and the
+ * features come from the same call log entry.
+ */
+ private static boolean isDuoAudioCall(@Nullable String phoneAccountComponentName, int features) {
+ return DuoConstants.PHONE_ACCOUNT_COMPONENT_NAME
+ .flattenToString()
+ .equals(phoneAccountComponentName)
+ && ((features & Calls.FEATURES_VIDEO) != Calls.FEATURES_VIDEO);
+ }
+
private void setTranscriptionState(Cursor cursor, ContentValues contentValues) {
if (VERSION.SDK_INT >= VERSION_CODES.O) {
int transcriptionStateColumn =