Use CONTENT_URI_WITH_VOICEMAIL for SystemCallLogDataSource
Currently the SystemCallLogDataSource queries the call log table with CONTENT_URI. This works for the call log tab, but will not work for the voicemail tab. To allow the voicemail tab to query annotated call log for voicemail information, we need to surface up voicemail data from the system call log data source into the annotated call log.
Bug: 64882313,33006245
Test: Unit tests, also verified that in the call log only the non-voicemail entries show
PiperOrigin-RevId: 172036196
Change-Id: Ieac855ae854a043207c9ae668280391c790ac33d
diff --git a/java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java b/java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java
index 9a3d2e2..39a8065 100644
--- a/java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java
+++ b/java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java
@@ -29,6 +29,7 @@
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.os.Build;
+import android.provider.CallLog.Calls;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.android.dialer.calllog.database.contract.AnnotatedCallLogContract;
@@ -121,7 +122,13 @@
Assert.checkArgument(sortOrder == null, "sort order not supported for coalesced call log");
try (Cursor allAnnotatedCallLogRows =
queryBuilder.query(
- db, null, null, null, null, null, AnnotatedCallLog.TIMESTAMP + " DESC")) {
+ db,
+ null,
+ String.format("%s != ?", CoalescedAnnotatedCallLog.CALL_TYPE),
+ new String[] {Integer.toString(Calls.VOICEMAIL_TYPE)},
+ null,
+ null,
+ AnnotatedCallLog.TIMESTAMP + " DESC")) {
Cursor coalescedRows = coalescer.coalesce(allAnnotatedCallLogRows);
coalescedRows.setNotificationUri(
getContext().getContentResolver(), CoalescedAnnotatedCallLog.CONTENT_URI);
diff --git a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
index 0a965f6..681a86d 100644
--- a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
+++ b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
@@ -88,7 +88,7 @@
appContext
.getContentResolver()
.registerContentObserver(
- CallLog.Calls.CONTENT_URI,
+ CallLog.Calls.CONTENT_URI_WITH_VOICEMAIL,
true,
new CallLogObserver(
ThreadUtil.getUiThreadHandler(), appContext, contentObserverCallbacks));
@@ -152,6 +152,9 @@
@Override
public ContentValues coalesce(List<ContentValues> individualRowsSortedByTimestampDesc) {
// TODO(zachh): Complete implementation.
+
+ assertNoVoicemailsInRows(individualRowsSortedByTimestampDesc);
+
return new RowCombiner(individualRowsSortedByTimestampDesc)
.useMostRecentLong(AnnotatedCallLog.TIMESTAMP)
.useMostRecentLong(AnnotatedCallLog.NEW)
@@ -174,6 +177,15 @@
.combine();
}
+ private void assertNoVoicemailsInRows(List<ContentValues> individualRowsSortedByTimestampDesc) {
+ for (ContentValues contentValue : individualRowsSortedByTimestampDesc) {
+ if (contentValue.getAsLong(AnnotatedCallLog.CALL_TYPE) != null) {
+ Assert.checkArgument(
+ contentValue.getAsLong(AnnotatedCallLog.CALL_TYPE) != Calls.VOICEMAIL_TYPE);
+ }
+ }
+ }
+
@TargetApi(Build.VERSION_CODES.M) // Uses try-with-resources
private void handleInsertsAndUpdates(
Context appContext, CallLogMutations mutations, Set<Long> existingAnnotatedCallLogIds) {
@@ -189,7 +201,7 @@
appContext
.getContentResolver()
.query(
- Calls.CONTENT_URI, // Excludes voicemail
+ Calls.CONTENT_URI_WITH_VOICEMAIL,
new String[] {
Calls._ID,
Calls.DATE,
@@ -414,7 +426,12 @@
try (Cursor cursor =
appContext
.getContentResolver()
- .query(Calls.CONTENT_URI, new String[] {Calls._ID}, whereClause, whereArgs, null)) {
+ .query(
+ Calls.CONTENT_URI_WITH_VOICEMAIL,
+ new String[] {Calls._ID},
+ whereClause,
+ whereArgs,
+ null)) {
if (cursor == null) {
LogUtil.e("SystemCallLogDataSource.getIdsFromSystemCallLog", "null cursor");