diff options
Diffstat (limited to 'java/com/android/dialer/calllog')
8 files changed, 101 insertions, 40 deletions
diff --git a/java/com/android/dialer/calllog/database/AnnotatedCallLogDatabaseHelper.java b/java/com/android/dialer/calllog/database/AnnotatedCallLogDatabaseHelper.java index eed77ebed..fea3e91e8 100644 --- a/java/com/android/dialer/calllog/database/AnnotatedCallLogDatabaseHelper.java +++ b/java/com/android/dialer/calllog/database/AnnotatedCallLogDatabaseHelper.java @@ -41,6 +41,7 @@ class AnnotatedCallLogDatabaseHelper extends SQLiteOpenHelper { + (AnnotatedCallLog.TIMESTAMP + " integer, ") + (AnnotatedCallLog.NUMBER + " blob, ") + (AnnotatedCallLog.FORMATTED_NUMBER + " text, ") + + (AnnotatedCallLog.NUMBER_PRESENTATION + " integer, ") + (AnnotatedCallLog.DURATION + " integer, ") + (AnnotatedCallLog.DATA_USAGE + " integer, ") + (AnnotatedCallLog.IS_READ + " integer, ") @@ -54,7 +55,7 @@ class AnnotatedCallLogDatabaseHelper extends SQLiteOpenHelper { + (AnnotatedCallLog.TRANSCRIPTION + " integer, ") + (AnnotatedCallLog.VOICEMAIL_URI + " text, ") + (AnnotatedCallLog.CALL_TYPE + " integer not null, ") - + (AnnotatedCallLog.NUMBER_ATTRIBUTES + " blob ") + + (AnnotatedCallLog.NUMBER_ATTRIBUTES + " blob") + ");"; /** diff --git a/java/com/android/dialer/calllog/database/Coalescer.java b/java/com/android/dialer/calllog/database/Coalescer.java index e301c9f72..ed09eea68 100644 --- a/java/com/android/dialer/calllog/database/Coalescer.java +++ b/java/com/android/dialer/calllog/database/Coalescer.java @@ -156,6 +156,11 @@ public class Coalescer { return false; } + if (!row1.getAsInteger(AnnotatedCallLog.NUMBER_PRESENTATION) + .equals(row2.getAsInteger(AnnotatedCallLog.NUMBER_PRESENTATION))) { + return false; + } + if (!meetsAssistedDialingCriteria(row1, row2)) { return false; } diff --git a/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java b/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java index 96a640918..4fee4e558 100644 --- a/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java +++ b/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java @@ -59,6 +59,13 @@ public class AnnotatedCallLogContract { String FORMATTED_NUMBER = "formatted_number"; /** + * See {@link android.provider.CallLog.Calls#NUMBER_PRESENTATION}. + * + * <p>Type: INTEGER (int) + */ + String NUMBER_PRESENTATION = "presentation"; + + /** * See {@link android.provider.CallLog.Calls#IS_READ}. * * <p>TYPE: INTEGER (boolean) @@ -136,6 +143,7 @@ public class AnnotatedCallLogContract { TIMESTAMP, NUMBER, FORMATTED_NUMBER, + NUMBER_PRESENTATION, IS_READ, NEW, GEOCODED_LOCATION, @@ -145,7 +153,7 @@ public class AnnotatedCallLogContract { PHONE_ACCOUNT_COLOR, FEATURES, NUMBER_ATTRIBUTES, - CALL_TYPE, + CALL_TYPE }; } diff --git a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java index 93c35c5fa..24410ee30 100644 --- a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java +++ b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java @@ -196,6 +196,7 @@ public class SystemCallLogDataSource implements CallLogDataSource { // recent one. .useMostRecentBlob(AnnotatedCallLog.NUMBER) .useMostRecentString(AnnotatedCallLog.FORMATTED_NUMBER) + .useSingleValueInt(AnnotatedCallLog.NUMBER_PRESENTATION) .useMostRecentString(AnnotatedCallLog.GEOCODED_LOCATION) .useSingleValueString(AnnotatedCallLog.PHONE_ACCOUNT_COMPONENT_NAME) .useSingleValueString(AnnotatedCallLog.PHONE_ACCOUNT_ID) @@ -239,6 +240,7 @@ public class SystemCallLogDataSource implements CallLogDataSource { Calls.DATE, Calls.LAST_MODIFIED, // TODO(a bug): Not available in M Calls.NUMBER, + Calls.NUMBER_PRESENTATION, Calls.TYPE, Calls.COUNTRY_ISO, Calls.DURATION, @@ -251,7 +253,7 @@ public class SystemCallLogDataSource implements CallLogDataSource { Calls.PHONE_ACCOUNT_COMPONENT_NAME, Calls.PHONE_ACCOUNT_ID, Calls.FEATURES, - Calls.POST_DIAL_DIGITS, // TODO(a bug): Not available in M + Calls.POST_DIAL_DIGITS // TODO(a bug): Not available in M }, // TODO(a bug): LAST_MODIFIED not available on M Calls.LAST_MODIFIED + " > ? AND " + Voicemails.DELETED + " = 0", @@ -273,6 +275,7 @@ public class SystemCallLogDataSource implements CallLogDataSource { 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); @@ -295,11 +298,18 @@ public class SystemCallLogDataSource implements CallLogDataSource { long id = cursor.getLong(idColumn); long date = cursor.getLong(dateColumn); String numberAsStr = cursor.getString(numberColumn); - long type; + 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); @@ -333,6 +343,7 @@ public class SystemCallLogDataSource implements CallLogDataSource { contentValues.put( 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); diff --git a/java/com/android/dialer/calllog/datasources/util/RowCombiner.java b/java/com/android/dialer/calllog/datasources/util/RowCombiner.java index 6e33db51e..2bb65cc3e 100644 --- a/java/com/android/dialer/calllog/datasources/util/RowCombiner.java +++ b/java/com/android/dialer/calllog/datasources/util/RowCombiner.java @@ -80,6 +80,18 @@ public class RowCombiner { return this; } + /** Asserts that all column values for the given column name are the same, and uses it. */ + public RowCombiner useSingleValueInt(String columnName) { + Iterator<ContentValues> iterator = individualRowsSortedByTimestampDesc.iterator(); + Integer singleValue = iterator.next().getAsInteger(columnName); + while (iterator.hasNext()) { + Integer current = iterator.next().getAsInteger(columnName); + Assert.checkState(Objects.equals(singleValue, current), "Values different for " + columnName); + } + combinedRow.put(columnName, singleValue); + return this; + } + /** Performs a bitwise OR on the specified column and yields the result. */ public RowCombiner bitwiseOr(String columnName) { int combinedValue = 0; diff --git a/java/com/android/dialer/calllog/model/CoalescedRow.java b/java/com/android/dialer/calllog/model/CoalescedRow.java index 312c29cc0..2b6db97a2 100644 --- a/java/com/android/dialer/calllog/model/CoalescedRow.java +++ b/java/com/android/dialer/calllog/model/CoalescedRow.java @@ -32,6 +32,7 @@ public abstract class CoalescedRow { .setId(0) .setTimestamp(0) .setNumber(DialerPhoneNumber.getDefaultInstance()) + .setNumberPresentation(0) .setIsRead(false) .setIsNew(false) .setPhoneAccountColor(0) @@ -52,6 +53,8 @@ public abstract class CoalescedRow { @Nullable public abstract String formattedNumber(); + public abstract int numberPresentation(); + public abstract boolean isRead(); public abstract boolean isNew(); @@ -91,6 +94,8 @@ public abstract class CoalescedRow { public abstract Builder setFormattedNumber(@Nullable String formattedNumber); + public abstract Builder setNumberPresentation(int presentation); + public abstract Builder setIsRead(boolean isRead); public abstract Builder setIsNew(boolean isNew); diff --git a/java/com/android/dialer/calllog/ui/CoalescedAnnotatedCallLogCursorLoader.java b/java/com/android/dialer/calllog/ui/CoalescedAnnotatedCallLogCursorLoader.java index d72544b56..0b1c6c990 100644 --- a/java/com/android/dialer/calllog/ui/CoalescedAnnotatedCallLogCursorLoader.java +++ b/java/com/android/dialer/calllog/ui/CoalescedAnnotatedCallLogCursorLoader.java @@ -34,17 +34,18 @@ final class CoalescedAnnotatedCallLogCursorLoader extends CursorLoader { private static final int TIMESTAMP = 1; private static final int NUMBER = 2; private static final int FORMATTED_NUMBER = 3; - private static final int IS_READ = 4; - private static final int NEW = 5; - private static final int GEOCODED_LOCATION = 6; - private static final int PHONE_ACCOUNT_COMPONENT_NAME = 7; - private static final int PHONE_ACCOUNT_ID = 8; - private static final int PHONE_ACCOUNT_LABEL = 9; - private static final int PHONE_ACCOUNT_COLOR = 10; - private static final int FEATURES = 11; - private static final int NUMBER_ATTRIBUTES = 12; - private static final int CALL_TYPE = 13; - private static final int COALESCED_IDS = 14; + private static final int NUMBER_PRESENTATION = 4; + private static final int IS_READ = 5; + private static final int NEW = 6; + private static final int GEOCODED_LOCATION = 7; + private static final int PHONE_ACCOUNT_COMPONENT_NAME = 8; + private static final int PHONE_ACCOUNT_ID = 9; + private static final int PHONE_ACCOUNT_LABEL = 10; + private static final int PHONE_ACCOUNT_COLOR = 11; + private static final int FEATURES = 12; + private static final int NUMBER_ATTRIBUTES = 13; + private static final int CALL_TYPE = 14; + private static final int COALESCED_IDS = 15; CoalescedAnnotatedCallLogCursorLoader(Context context) { // CoalescedAnnotatedCallLog requires that PROJECTION be ALL_COLUMNS and the following params be @@ -86,6 +87,7 @@ final class CoalescedAnnotatedCallLogCursorLoader extends CursorLoader { .setTimestamp(cursor.getLong(TIMESTAMP)) .setNumber(number) .setFormattedNumber(cursor.getString(FORMATTED_NUMBER)) + .setNumberPresentation(cursor.getInt(NUMBER_PRESENTATION)) .setIsRead(cursor.getInt(IS_READ) == 1) .setIsNew(cursor.getInt(NEW) == 1) .setGeocodedLocation(cursor.getString(GEOCODED_LOCATION)) diff --git a/java/com/android/dialer/calllog/ui/menu/Modules.java b/java/com/android/dialer/calllog/ui/menu/Modules.java index beb2cf0db..96e5951c6 100644 --- a/java/com/android/dialer/calllog/ui/menu/Modules.java +++ b/java/com/android/dialer/calllog/ui/menu/Modules.java @@ -24,12 +24,15 @@ import com.android.dialer.calldetails.CallDetailsActivity; import com.android.dialer.callintent.CallInitiationType; import com.android.dialer.calllog.model.CoalescedRow; import com.android.dialer.calllogutils.CallLogContactTypes; +import com.android.dialer.calllogutils.PhoneNumberDisplayUtil; import com.android.dialer.contactactions.ContactActionModule; import com.android.dialer.contactactions.DividerModule; import com.android.dialer.contactactions.IntentModule; import com.android.dialer.contactactions.SharedModules; import com.android.dialer.dialercontact.DialerContact; +import com.android.dialer.phonenumberutil.PhoneNumberHelper; import com.android.dialer.telecom.TelecomUtil; +import com.google.common.base.Optional; import java.util.ArrayList; import java.util.List; @@ -43,16 +46,23 @@ final class Modules { // Conditionally add each module, which are items in the bottom sheet's menu. List<ContactActionModule> modules = new ArrayList<>(); - maybeAddModuleForVideoOrAudioCall(context, modules, row); - SharedModules.maybeAddModuleForAddingToContacts( - context, - modules, - row.number(), - row.numberAttributes().getName(), - row.numberAttributes().getLookupUri()); + // TODO(zach): Don't use raw input. + String normalizedNumber = row.number().getRawInput().getNumber(); + boolean canPlaceCalls = + PhoneNumberHelper.canPlaceCallsTo(normalizedNumber, row.numberPresentation()); - String originalNumber = row.number().getRawInput().getNumber(); - SharedModules.maybeAddModuleForSendingTextMessage(context, modules, originalNumber); + if (canPlaceCalls) { + addModuleForVideoOrAudioCall(context, modules, row, normalizedNumber); + + SharedModules.maybeAddModuleForAddingToContacts( + context, + modules, + row.number(), + row.numberAttributes().getName(), + row.numberAttributes().getLookupUri()); + + SharedModules.maybeAddModuleForSendingTextMessage(context, modules, normalizedNumber); + } if (!modules.isEmpty()) { modules.add(new DividerModule()); @@ -62,7 +72,9 @@ final class Modules { // TODO(zachh): Module for blocking/unblocking spam. // TODO(zachh): Module for CallComposer. - SharedModules.maybeAddModuleForCopyingNumber(context, modules, originalNumber); + if (canPlaceCalls) { + SharedModules.maybeAddModuleForCopyingNumber(context, modules, normalizedNumber); + } // TODO(zachh): Revisit if DialerContact is the best thing to pass to CallDetails; could // it use a ContactPrimaryActionInfo instead? @@ -73,14 +85,11 @@ final class Modules { return modules; } - private static void maybeAddModuleForVideoOrAudioCall( - Context context, List<ContactActionModule> modules, CoalescedRow row) { - String originalNumber = row.number().getRawInput().getNumber(); - if (TextUtils.isEmpty(originalNumber)) { - // Skip adding the menu item if the phone number is unknown. - return; - } - + private static void addModuleForVideoOrAudioCall( + Context context, + List<ContactActionModule> modules, + CoalescedRow row, + String normalizedNumber) { PhoneAccountHandle phoneAccountHandle = TelecomUtil.composePhoneAccountHandle( row.phoneAccountComponentName(), row.phoneAccountId()); @@ -90,14 +99,14 @@ final class Modules { // trigger a video call. modules.add( IntentModule.newCallModule( - context, originalNumber, phoneAccountHandle, CallInitiationType.Type.CALL_LOG)); + context, normalizedNumber, phoneAccountHandle, CallInitiationType.Type.CALL_LOG)); } else { // Add a video call item for audio calls. Click the top entry on the bottom sheet will // trigger an audio call. // TODO(zachh): Only show video option if video capabilities present? modules.add( IntentModule.newVideoCallModule( - context, originalNumber, phoneAccountHandle, CallInitiationType.Type.CALL_LOG)); + context, normalizedNumber, phoneAccountHandle, CallInitiationType.Type.CALL_LOG)); } } @@ -112,20 +121,28 @@ final class Modules { CallDetailsActivity.newInstance( context, row.coalescedIds(), - createDialerContactFromRow(row), + createDialerContactFromRow(context, row), canReportAsInvalidNumber, canSupportAssistedDialing), R.string.call_details_menu_label, R.drawable.quantum_ic_info_outline_vd_theme_24)); } - private static DialerContact createDialerContactFromRow(CoalescedRow row) { - // TODO(zachh): Do something with parsed values to make more dialable? - String originalNumber = row.number().getRawInput().getNumber(); + private static DialerContact createDialerContactFromRow(Context context, CoalescedRow row) { + Optional<String> presentationName = + PhoneNumberDisplayUtil.getNameForPresentation(context, row.numberPresentation()); + if (presentationName.isPresent()) { + return DialerContact.newBuilder() + .setNameOrNumber(presentationName.get()) + .setContactType(CallLogContactTypes.getContactType(row)) + .build(); + } + // TODO(zachh): Don't use raw input. + String normalizedNumber = row.number().getRawInput().getNumber(); DialerContact.Builder dialerContactBuilder = DialerContact.newBuilder() - .setNumber(originalNumber) + .setNumber(normalizedNumber) .setContactType(CallLogContactTypes.getContactType(row)) .setPhotoId(row.numberAttributes().getPhotoId()); |