From e8dab7ef42ba99e002db2160c6ccfff72cd5100b Mon Sep 17 00:00:00 2001 From: zachh Date: Tue, 14 Nov 2017 11:13:46 -0800 Subject: Added URI for selecting distinct phone numbers from AnnotatedCallLog. This will be used in the PhoneLookupDataSource. A separate URI is necessary because the content provider APIs do not provide a mechanism for querying using the "distinct" keyword. Bug: 34672501 Test: unit PiperOrigin-RevId: 175706603 Change-Id: Ia455a18d10afb116d26f69e8b0c7493f4f877d0b --- .../database/AnnotatedCallLogContentProvider.java | 45 ++++++++++++++++++++-- .../contract/AnnotatedCallLogContract.java | 5 +++ 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java b/java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java index 68298e356..825e84f91 100644 --- a/java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java +++ b/java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java @@ -38,6 +38,7 @@ import com.android.dialer.calllog.database.contract.AnnotatedCallLogContract.Coa import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; import java.util.ArrayList; +import java.util.Arrays; /** {@link ContentProvider} for the annotated call log. */ public class AnnotatedCallLogContentProvider extends ContentProvider { @@ -51,7 +52,8 @@ public class AnnotatedCallLogContentProvider extends ContentProvider { private static final int ANNOTATED_CALL_LOG_TABLE_CODE = 1; private static final int ANNOTATED_CALL_LOG_TABLE_ID_CODE = 2; - private static final int COALESCED_ANNOTATED_CALL_LOG_TABLE_CODE = 3; + private static final int ANNOTATED_CALL_LOG_TABLE_DISTINCT_NUMBER_CODE = 3; + private static final int COALESCED_ANNOTATED_CALL_LOG_TABLE_CODE = 4; private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); @@ -62,6 +64,10 @@ public class AnnotatedCallLogContentProvider extends ContentProvider { AnnotatedCallLogContract.AUTHORITY, AnnotatedCallLog.TABLE + "/#", ANNOTATED_CALL_LOG_TABLE_ID_CODE); + uriMatcher.addURI( + AnnotatedCallLogContract.AUTHORITY, + AnnotatedCallLog.DISTINCT_PHONE_NUMBERS, + ANNOTATED_CALL_LOG_TABLE_DISTINCT_NUMBER_CODE); uriMatcher.addURI( AnnotatedCallLogContract.AUTHORITY, CoalescedAnnotatedCallLog.TABLE, @@ -101,8 +107,6 @@ public class AnnotatedCallLogContentProvider extends ContentProvider { switch (match) { case ANNOTATED_CALL_LOG_TABLE_ID_CODE: queryBuilder.appendWhere(AnnotatedCallLog._ID + "=" + ContentUris.parseId(uri)); - // fall through - case ANNOTATED_CALL_LOG_TABLE_CODE: Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder); if (cursor != null) { @@ -112,6 +116,31 @@ public class AnnotatedCallLogContentProvider extends ContentProvider { LogUtil.w("AnnotatedCallLogContentProvider.query", "cursor was null"); } return cursor; + case ANNOTATED_CALL_LOG_TABLE_CODE: + cursor = + queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder); + if (cursor != null) { + cursor.setNotificationUri( + getContext().getContentResolver(), AnnotatedCallLog.CONTENT_URI); + } else { + LogUtil.w("AnnotatedCallLogContentProvider.query", "cursor was null"); + } + return cursor; + case ANNOTATED_CALL_LOG_TABLE_DISTINCT_NUMBER_CODE: + Assert.checkArgument( + Arrays.equals(projection, new String[] {AnnotatedCallLog.NUMBER}), + "only NUMBER supported for projection for distinct phone number query, got: %s", + Arrays.toString(projection)); + queryBuilder.setDistinct(true); + cursor = + queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder); + if (cursor != null) { + cursor.setNotificationUri( + getContext().getContentResolver(), AnnotatedCallLog.CONTENT_URI); + } else { + LogUtil.w("AnnotatedCallLogContentProvider.query", "cursor was null"); + } + return cursor; case COALESCED_ANNOTATED_CALL_LOG_TABLE_CODE: Assert.checkArgument( projection == CoalescedAnnotatedCallLog.ALL_COLUMNS, @@ -170,6 +199,8 @@ public class AnnotatedCallLogContentProvider extends ContentProvider { values.put(AnnotatedCallLog._ID, idFromUri); } break; + case ANNOTATED_CALL_LOG_TABLE_DISTINCT_NUMBER_CODE: + throw new UnsupportedOperationException(); case COALESCED_ANNOTATED_CALL_LOG_TABLE_CODE: throw new UnsupportedOperationException("coalesced call log does not support inserting"); default: @@ -206,6 +237,8 @@ public class AnnotatedCallLogContentProvider extends ContentProvider { Assert.checkArgument(id != -1, "error parsing id from uri %s", uri); selection = getSelectionWithId(id); break; + case ANNOTATED_CALL_LOG_TABLE_DISTINCT_NUMBER_CODE: + throw new UnsupportedOperationException(); case COALESCED_ANNOTATED_CALL_LOG_TABLE_CODE: throw new UnsupportedOperationException("coalesced call log does not support deleting"); default: @@ -244,8 +277,10 @@ public class AnnotatedCallLogContentProvider extends ContentProvider { selectionArgs == null, "Do not specify selection args when updating by ID"); selection = getSelectionWithId(ContentUris.parseId(uri)); break; + case ANNOTATED_CALL_LOG_TABLE_DISTINCT_NUMBER_CODE: + throw new UnsupportedOperationException(); case COALESCED_ANNOTATED_CALL_LOG_TABLE_CODE: - throw new UnsupportedOperationException("coalesced call log does not support updating"); + throw new UnsupportedOperationException(); default: throw new IllegalArgumentException("Unknown uri: " + uri); } @@ -287,6 +322,8 @@ public class AnnotatedCallLogContentProvider extends ContentProvider { case ANNOTATED_CALL_LOG_TABLE_ID_CODE: // These are allowed values, continue. break; + case ANNOTATED_CALL_LOG_TABLE_DISTINCT_NUMBER_CODE: + throw new UnsupportedOperationException(); case COALESCED_ANNOTATED_CALL_LOG_TABLE_CODE: throw new UnsupportedOperationException( "coalesced call log does not support applyBatch"); diff --git a/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java b/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java index 4f26f0cc9..d3318d125 100644 --- a/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java +++ b/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java @@ -211,11 +211,16 @@ public class AnnotatedCallLogContract { public static final class AnnotatedCallLog implements CommonColumns { public static final String TABLE = "AnnotatedCallLog"; + public static final String DISTINCT_PHONE_NUMBERS = "DistinctPhoneNumbers"; /** The content URI for this table. */ public static final Uri CONTENT_URI = Uri.withAppendedPath(AnnotatedCallLogContract.CONTENT_URI, TABLE); + /** Content URI for selecting the distinct phone numbers from the AnnotatedCallLog. */ + public static final Uri DISTINCT_NUMBERS_CONTENT_URI = + Uri.withAppendedPath(AnnotatedCallLogContract.CONTENT_URI, DISTINCT_PHONE_NUMBERS); + /** The MIME type of a {@link android.content.ContentProvider#getType(Uri)} single entry. */ public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/annotated_call_log"; -- cgit v1.2.3 From bc9d0073e0dd5125ed215fe4d36e38354b855bd5 Mon Sep 17 00:00:00 2001 From: uabdullah Date: Tue, 14 Nov 2017 11:51:49 -0800 Subject: Set total duration for NUI voicemail media player seekbar The duration of the voicemail shown in the seekbar/media player (upon expanding) should be the same as the duration shown when the voicemail view holder is collapsed. Both values are retrieved from the same source (VoicemailEntry). Bug: 64882313,68382421,69268144 Test: Unit Tests PiperOrigin-RevId: 175712662 Change-Id: I70496c004d52deb1793e6d6354b0ec79bf4c4398 --- .../contract/AnnotatedCallLogContract.java | 2 +- .../listui/NewVoicemailMediaPlayerView.java | 24 +++++++++++++++------- .../voicemail/listui/NewVoicemailViewHolder.java | 1 + .../voicemail/listui/VoicemailEntryText.java | 2 +- .../layout/new_voicemail_media_player_layout.xml | 2 -- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java b/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java index d3318d125..c9b463e74 100644 --- a/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java +++ b/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java @@ -227,7 +227,7 @@ public class AnnotatedCallLogContract { /** * See {@link android.provider.CallLog.Calls#DURATION}. * - *

TYPE: INTEGER (int) + *

TYPE: INTEGER (long) */ public static final String DURATION = "duration"; diff --git a/java/com/android/dialer/voicemail/listui/NewVoicemailMediaPlayerView.java b/java/com/android/dialer/voicemail/listui/NewVoicemailMediaPlayerView.java index 1e56a8189..b2d93b17c 100644 --- a/java/com/android/dialer/voicemail/listui/NewVoicemailMediaPlayerView.java +++ b/java/com/android/dialer/voicemail/listui/NewVoicemailMediaPlayerView.java @@ -25,18 +25,19 @@ import android.media.MediaPlayer.OnErrorListener; import android.media.MediaPlayer.OnPreparedListener; import android.net.Uri; import android.provider.VoicemailContract; -import android.support.annotation.VisibleForTesting; import android.support.v4.util.Pair; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; +import android.widget.TextView; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; import com.android.dialer.common.concurrent.DialerExecutor.SuccessListener; import com.android.dialer.common.concurrent.DialerExecutor.Worker; import com.android.dialer.common.concurrent.DialerExecutorComponent; +import com.android.dialer.voicemail.model.VoicemailEntry; /** * The view of the media player that is visible when a {@link NewVoicemailViewHolder} is expanded. @@ -46,6 +47,7 @@ public class NewVoicemailMediaPlayerView extends LinearLayout { private Button playButton; private Button speakerButton; private Button deleteButton; + private TextView totalDurationView; private Uri voicemailUri; private FragmentManager fragmentManager; private MediaPlayer mediaPlayer; @@ -62,14 +64,15 @@ public class NewVoicemailMediaPlayerView extends LinearLayout { protected void onFinishInflate() { super.onFinishInflate(); LogUtil.enterBlock("NewVoicemailMediaPlayer.onFinishInflate"); - initializeMediaPlayerButtons(); + initializeMediaPlayerButtonsAndViews(); setupListenersForMediaPlayerButtons(); } - private void initializeMediaPlayerButtons() { + private void initializeMediaPlayerButtonsAndViews() { playButton = findViewById(R.id.playButton); speakerButton = findViewById(R.id.speakerButton); deleteButton = findViewById(R.id.deleteButton); + totalDurationView = findViewById(R.id.playback_seek_total_duration); } private void setupListenersForMediaPlayerButtons() { @@ -171,7 +174,6 @@ public class NewVoicemailMediaPlayerView extends LinearLayout { } }; - @VisibleForTesting(otherwise = VisibleForTesting.NONE) OnCompletionListener onCompletionListener = new OnCompletionListener() { @@ -197,7 +199,6 @@ public class NewVoicemailMediaPlayerView extends LinearLayout { } }; - @VisibleForTesting(otherwise = VisibleForTesting.NONE) OnErrorListener onErrorListener = new OnErrorListener() { @Override @@ -210,12 +211,21 @@ public class NewVoicemailMediaPlayerView extends LinearLayout { } }; - public void setVoicemailUri(Uri voicemailUri) { + void setVoicemailUri(Uri voicemailUri) { Assert.isNotNull(voicemailUri); this.voicemailUri = voicemailUri; } - public void setFragmentManager(FragmentManager fragmentManager) { + void setFragmentManager(FragmentManager fragmentManager) { this.fragmentManager = fragmentManager; } + + // TODO(uabdullah): Merge with voicemailUri (http://cl/175585919) + void setVoicemailDuration(VoicemailEntry voicemailEntry) { + Assert.isNotNull(voicemailEntry); + Assert.isNotNull(totalDurationView); + + totalDurationView.setText( + VoicemailEntryText.getVoicemailDuration(getContext(), voicemailEntry)); + } } diff --git a/java/com/android/dialer/voicemail/listui/NewVoicemailViewHolder.java b/java/com/android/dialer/voicemail/listui/NewVoicemailViewHolder.java index 078a029c9..d5546c33f 100644 --- a/java/com/android/dialer/voicemail/listui/NewVoicemailViewHolder.java +++ b/java/com/android/dialer/voicemail/listui/NewVoicemailViewHolder.java @@ -81,6 +81,7 @@ final class NewVoicemailViewHolder extends RecyclerView.ViewHolder implements On setPhoto(voicemailEntry); mediaPlayerView.setVoicemailUri(Uri.parse(voicemailEntry.voicemailUri())); mediaPlayerView.setFragmentManager(fragmentManager); + mediaPlayerView.setVoicemailDuration(voicemailEntry); } // TODO(uabdullah): Consider/Implement TYPE (e.g Spam, TYPE_VOICEMAIL) diff --git a/java/com/android/dialer/voicemail/listui/VoicemailEntryText.java b/java/com/android/dialer/voicemail/listui/VoicemailEntryText.java index f59220105..d73d1f0de 100644 --- a/java/com/android/dialer/voicemail/listui/VoicemailEntryText.java +++ b/java/com/android/dialer/voicemail/listui/VoicemailEntryText.java @@ -91,7 +91,7 @@ public class VoicemailEntryText { return secondaryText.toString(); } - private static String getVoicemailDuration(Context context, VoicemailEntry voicemailEntry) { + static String getVoicemailDuration(Context context, VoicemailEntry voicemailEntry) { long minutes = TimeUnit.SECONDS.toMinutes(voicemailEntry.duration()); long seconds = voicemailEntry.duration() - TimeUnit.MINUTES.toSeconds(minutes); diff --git a/java/com/android/dialer/voicemail/listui/res/layout/new_voicemail_media_player_layout.xml b/java/com/android/dialer/voicemail/listui/res/layout/new_voicemail_media_player_layout.xml index a21b6aa6c..e8e560059 100644 --- a/java/com/android/dialer/voicemail/listui/res/layout/new_voicemail_media_player_layout.xml +++ b/java/com/android/dialer/voicemail/listui/res/layout/new_voicemail_media_player_layout.xml @@ -55,13 +55,11 @@ android:max="0" android:progress="0"/> - -- cgit v1.2.3 From c7b413058c765603d5c65d39e4042a55ab170ef0 Mon Sep 17 00:00:00 2001 From: uabdullah Date: Tue, 14 Nov 2017 12:28:52 -0800 Subject: Combine voicemail uri and duration for NUI media player Voicemail URI and duration are both retrieved from VoicemailEntry. This CL combines it. This was a todo added from http://cl/175585919 Test: unit tests PiperOrigin-RevId: 175718355 Change-Id: I7d2748cf6e110e494f6895c512ce355aa2d048a7 --- .../voicemail/listui/NewVoicemailMediaPlayerView.java | 14 +++++++------- .../dialer/voicemail/listui/NewVoicemailViewHolder.java | 3 +-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/java/com/android/dialer/voicemail/listui/NewVoicemailMediaPlayerView.java b/java/com/android/dialer/voicemail/listui/NewVoicemailMediaPlayerView.java index b2d93b17c..4629ce277 100644 --- a/java/com/android/dialer/voicemail/listui/NewVoicemailMediaPlayerView.java +++ b/java/com/android/dialer/voicemail/listui/NewVoicemailMediaPlayerView.java @@ -25,6 +25,7 @@ import android.media.MediaPlayer.OnErrorListener; import android.media.MediaPlayer.OnPreparedListener; import android.net.Uri; import android.provider.VoicemailContract; +import android.support.annotation.VisibleForTesting; import android.support.v4.util.Pair; import android.util.AttributeSet; import android.view.LayoutInflater; @@ -174,6 +175,7 @@ public class NewVoicemailMediaPlayerView extends LinearLayout { } }; + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) OnCompletionListener onCompletionListener = new OnCompletionListener() { @@ -199,6 +201,7 @@ public class NewVoicemailMediaPlayerView extends LinearLayout { } }; + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) OnErrorListener onErrorListener = new OnErrorListener() { @Override @@ -211,20 +214,17 @@ public class NewVoicemailMediaPlayerView extends LinearLayout { } }; - void setVoicemailUri(Uri voicemailUri) { - Assert.isNotNull(voicemailUri); - this.voicemailUri = voicemailUri; - } - void setFragmentManager(FragmentManager fragmentManager) { this.fragmentManager = fragmentManager; } - // TODO(uabdullah): Merge with voicemailUri (http://cl/175585919) - void setVoicemailDuration(VoicemailEntry voicemailEntry) { + void setVoicemailEntryValues(VoicemailEntry voicemailEntry) { Assert.isNotNull(voicemailEntry); + Uri uri = Uri.parse(voicemailEntry.voicemailUri()); + Assert.isNotNull(uri); Assert.isNotNull(totalDurationView); + voicemailUri = uri; totalDurationView.setText( VoicemailEntryText.getVoicemailDuration(getContext(), voicemailEntry)); } diff --git a/java/com/android/dialer/voicemail/listui/NewVoicemailViewHolder.java b/java/com/android/dialer/voicemail/listui/NewVoicemailViewHolder.java index d5546c33f..f8de01f58 100644 --- a/java/com/android/dialer/voicemail/listui/NewVoicemailViewHolder.java +++ b/java/com/android/dialer/voicemail/listui/NewVoicemailViewHolder.java @@ -79,9 +79,8 @@ final class NewVoicemailViewHolder extends RecyclerView.ViewHolder implements On itemView.setOnClickListener(this); setPhoto(voicemailEntry); - mediaPlayerView.setVoicemailUri(Uri.parse(voicemailEntry.voicemailUri())); + mediaPlayerView.setVoicemailEntryValues(voicemailEntry); mediaPlayerView.setFragmentManager(fragmentManager); - mediaPlayerView.setVoicemailDuration(voicemailEntry); } // TODO(uabdullah): Consider/Implement TYPE (e.g Spam, TYPE_VOICEMAIL) -- cgit v1.2.3