diff options
Diffstat (limited to 'java')
6 files changed, 80 insertions, 20 deletions
diff --git a/java/com/android/dialer/calllog/database/Coalescer.java b/java/com/android/dialer/calllog/database/Coalescer.java index a8a8f2f1d..71052b907 100644 --- a/java/com/android/dialer/calllog/database/Coalescer.java +++ b/java/com/android/dialer/calllog/database/Coalescer.java @@ -21,6 +21,7 @@ import android.database.MatrixCursor; import android.support.annotation.NonNull; import android.support.annotation.WorkerThread; import android.telecom.PhoneAccountHandle; +import com.android.dialer.CoalescedIds; import com.android.dialer.DialerPhoneNumber; import com.android.dialer.calllog.database.contract.AnnotatedCallLogContract.AnnotatedCallLog; import com.android.dialer.calllog.database.contract.AnnotatedCallLogContract.CoalescedAnnotatedCallLog; @@ -29,6 +30,7 @@ import com.android.dialer.calllog.datasources.DataSources; import com.android.dialer.calllogutils.PhoneAccountUtils; import com.android.dialer.common.Assert; import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil; +import com.google.common.base.Preconditions; import com.google.i18n.phonenumbers.PhoneNumberUtil; import com.google.protobuf.InvalidProtocolBufferException; import java.util.ArrayList; @@ -40,11 +42,10 @@ import javax.inject.Inject; /** * Coalesces call log rows by combining some adjacent rows. * - * <p>Applies the business which logic which determines which adjacent rows should be coalasced, and - * then delegates to each data source to determine how individual columns should be aggregated. + * <p>Applies the logic that determines which adjacent rows should be coalesced, and then delegates + * to each data source to determine how individual columns should be aggregated. */ public class Coalescer { - private final DataSources dataSources; @Inject @@ -96,7 +97,9 @@ public class Coalescer { if (!rowsShouldBeCombined(dialerPhoneNumberUtil, previousRow, currentRow)) { ContentValues coalescedRow = coalesceRowsForAllDataSources(currentRowGroup); - coalescedRow.put(CoalescedAnnotatedCallLog.NUMBER_CALLS, currentRowGroup.size()); + coalescedRow.put( + CoalescedAnnotatedCallLog.COALESCED_IDS, + getCoalescedIds(currentRowGroup).toByteArray()); addContentValuesToMatrixCursor( coalescedRow, allCoalescedRowsMatrixCursor, coalescedRowId++); currentRowGroup.clear(); @@ -106,7 +109,8 @@ public class Coalescer { // Deal with leftover rows. ContentValues coalescedRow = coalesceRowsForAllDataSources(currentRowGroup); - coalescedRow.put(CoalescedAnnotatedCallLog.NUMBER_CALLS, currentRowGroup.size()); + coalescedRow.put( + CoalescedAnnotatedCallLog.COALESCED_IDS, getCoalescedIds(currentRowGroup).toByteArray()); addContentValuesToMatrixCursor(coalescedRow, allCoalescedRowsMatrixCursor, coalescedRowId); } return allCoalescedRowsMatrixCursor; @@ -185,6 +189,23 @@ public class Coalescer { } /** + * Build a {@link CoalescedIds} proto that contains IDs of the rows in {@link AnnotatedCallLog} + * that are coalesced into one row in {@link CoalescedAnnotatedCallLog}. + * + * @param individualRows {@link AnnotatedCallLog} rows sorted by timestamp descending + * @return A {@link CoalescedIds} proto containing IDs of {@code individualRows}. + */ + private CoalescedIds getCoalescedIds(List<ContentValues> individualRows) { + CoalescedIds.Builder coalescedIds = CoalescedIds.newBuilder(); + + for (ContentValues row : individualRows) { + coalescedIds.addCoalescedId(Preconditions.checkNotNull(row.getAsLong(AnnotatedCallLog._ID))); + } + + return coalescedIds.build(); + } + + /** * @param contentValues a {@link CoalescedAnnotatedCallLog} row * @param matrixCursor represents {@link CoalescedAnnotatedCallLog} */ diff --git a/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java b/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java index 9efe21487..c9c053cea 100644 --- a/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java +++ b/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java @@ -274,17 +274,18 @@ public class AnnotatedCallLogContract { "vnd.android.cursor.item/coalesced_annotated_call_log"; /** - * Number of AnnotatedCallLog rows represented by this CoalescedAnnotatedCallLog row. + * IDs of rows in {@link AnnotatedCallLog} that are coalesced into one row in {@link + * CoalescedAnnotatedCallLog}, encoded as a {@link com.android.dialer.CoalescedIds} proto. * - * <p>Type: INTEGER + * <p>Type: BLOB */ - public static final String NUMBER_CALLS = "number_calls"; + public static final String COALESCED_IDS = "coalesced_ids"; /** * Columns that are only in the {@link CoalescedAnnotatedCallLog} but not the {@link * AnnotatedCallLog}. */ - private static final String[] COLUMNS_ONLY_IN_COALESCED_CALL_LOG = new String[] {NUMBER_CALLS}; + private static final String[] COLUMNS_ONLY_IN_COALESCED_CALL_LOG = new String[] {COALESCED_IDS}; /** All columns in the {@link CoalescedAnnotatedCallLog}. */ public static final String[] ALL_COLUMNS = diff --git a/java/com/android/dialer/calllog/model/CoalescedRow.java b/java/com/android/dialer/calllog/model/CoalescedRow.java index 091467430..5cc056872 100644 --- a/java/com/android/dialer/calllog/model/CoalescedRow.java +++ b/java/com/android/dialer/calllog/model/CoalescedRow.java @@ -17,8 +17,8 @@ package com.android.dialer.calllog.model; import android.support.annotation.ColorInt; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import com.android.dialer.CoalescedIds; import com.android.dialer.DialerPhoneNumber; import com.google.auto.value.AutoValue; @@ -38,15 +38,14 @@ public abstract class CoalescedRow { .setFeatures(0) .setIsBusiness(false) .setIsVoicemail(false) - .setNumberCalls(0) - .setCallType(0); + .setCallType(0) + .setCoalescedIds(CoalescedIds.getDefaultInstance()); } public abstract int id(); public abstract long timestamp(); - @NonNull public abstract DialerPhoneNumber number(); @Nullable @@ -93,7 +92,7 @@ public abstract class CoalescedRow { public abstract int callType(); - public abstract int numberCalls(); + public abstract CoalescedIds coalescedIds(); /** Builder for {@link CoalescedRow}. */ @AutoValue.Builder @@ -103,7 +102,7 @@ public abstract class CoalescedRow { public abstract Builder setTimestamp(long timestamp); - public abstract Builder setNumber(@NonNull DialerPhoneNumber number); + public abstract Builder setNumber(DialerPhoneNumber number); public abstract Builder setName(@Nullable String name); @@ -140,7 +139,7 @@ public abstract class CoalescedRow { public abstract Builder setCallType(int callType); - public abstract Builder setNumberCalls(int numberCalls); + public abstract Builder setCoalescedIds(CoalescedIds coalescedIds); public abstract CoalescedRow build(); } diff --git a/java/com/android/dialer/calllog/model/coalesced_ids.proto b/java/com/android/dialer/calllog/model/coalesced_ids.proto new file mode 100644 index 000000000..059f95782 --- /dev/null +++ b/java/com/android/dialer/calllog/model/coalesced_ids.proto @@ -0,0 +1,30 @@ +// 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 + +syntax = "proto2"; + +option java_package = "com.android.dialer"; +option java_multiple_files = true; +option optimize_for = LITE_RUNTIME; + + +package com.android.dialer; + +// A proto containing a list of IDs of the rows in AnnotatedCallLog that are +// coalesced into a row in CoalescedAnnotatedCallLog. +// For example, if rows in the AnnotatedCallLog with IDs 123, 124, 125 are +// coalesced into one row, the list in the proto will be [123, 124, 125]. +message CoalescedIds { + repeated int64 coalesced_id = 1; +}
\ No newline at end of file diff --git a/java/com/android/dialer/calllog/ui/CoalescedAnnotatedCallLogCursorLoader.java b/java/com/android/dialer/calllog/ui/CoalescedAnnotatedCallLogCursorLoader.java index 9f635439a..8aefb1a74 100644 --- a/java/com/android/dialer/calllog/ui/CoalescedAnnotatedCallLogCursorLoader.java +++ b/java/com/android/dialer/calllog/ui/CoalescedAnnotatedCallLogCursorLoader.java @@ -19,6 +19,7 @@ package com.android.dialer.calllog.ui; import android.content.Context; import android.database.Cursor; import android.support.v4.content.CursorLoader; +import com.android.dialer.CoalescedIds; import com.android.dialer.DialerPhoneNumber; import com.android.dialer.calllog.database.contract.AnnotatedCallLogContract.CoalescedAnnotatedCallLog; import com.android.dialer.calllog.model.CoalescedRow; @@ -48,7 +49,7 @@ final class CoalescedAnnotatedCallLogCursorLoader extends CursorLoader { private static final int IS_BUSINESS = 17; private static final int IS_VOICEMAIL = 18; private static final int CALL_TYPE = 19; - private static final int NUMBER_CALLS = 20; + private static final int COALESCED_IDS = 20; CoalescedAnnotatedCallLogCursorLoader(Context context) { // CoalescedAnnotatedCallLog requires that PROJECTION be ALL_COLUMNS and the following params be @@ -71,6 +72,13 @@ final class CoalescedAnnotatedCallLogCursorLoader extends CursorLoader { throw new IllegalStateException("Couldn't parse DialerPhoneNumber bytes"); } + CoalescedIds coalescedIds; + try { + coalescedIds = CoalescedIds.parseFrom(cursor.getBlob(COALESCED_IDS)); + } catch (InvalidProtocolBufferException e) { + throw new IllegalStateException("Couldn't parse CoalescedIds bytes"); + } + return CoalescedRow.builder() .setId(cursor.getInt(ID)) .setTimestamp(cursor.getLong(TIMESTAMP)) @@ -92,7 +100,7 @@ final class CoalescedAnnotatedCallLogCursorLoader extends CursorLoader { .setIsBusiness(cursor.getInt(IS_BUSINESS) == 1) .setIsVoicemail(cursor.getInt(IS_VOICEMAIL) == 1) .setCallType(cursor.getInt(CALL_TYPE)) - .setNumberCalls(cursor.getInt(NUMBER_CALLS)) + .setCoalescedIds(coalescedIds) .build(); } diff --git a/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java b/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java index 16147f604..629a9a289 100644 --- a/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java +++ b/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java @@ -89,8 +89,9 @@ final class NewCallLogViewHolder extends RecyclerView.ViewHolder { private void setNumberCalls(CoalescedRow row) { // TODO(zachh): Number of calls shouldn't be text, but a circle with a number inside. - if (row.numberCalls() > 1) { - primaryTextView.append(String.format(Locale.getDefault(), " (%d)", row.numberCalls())); + int numberCalls = row.coalescedIds().getCoalescedIdCount(); + if (numberCalls > 1) { + primaryTextView.append(String.format(Locale.getDefault(), " (%d)", numberCalls)); } } |