From 70fedf8d6caee1177ee891bbfff404dc48867c16 Mon Sep 17 00:00:00 2001 From: mdooley Date: Thu, 23 Nov 2017 08:31:05 -0800 Subject: Adding transcription rating feedback Allow users who have agreed to donate their voicemails to also provide transcription quality feedback. screenshot: https://drive.google.com/open?id=0B9o_KvtLkcuIajVtdFN3Y0Qydmx2NXJYN2N3OVA3N0h5UEdR Bug: 68712148 Test: manual and new unit tests PiperOrigin-RevId: 176774942 Change-Id: I08b9afbbefaedfb0de5199038a1d2769bd983855 --- .../android/dialer/app/calllog/CallLogAdapter.java | 1 + .../dialer/app/calllog/PhoneCallDetailsHelper.java | 81 ++++++++++++++++++++-- .../dialer/app/calllog/PhoneCallDetailsViews.java | 5 ++ .../dialer/app/res/layout/call_log_list_item.xml | 48 ++++++++++++- java/com/android/dialer/app/res/values/colors.xml | 2 + java/com/android/dialer/app/res/values/strings.xml | 31 +++++++++ java/com/android/dialer/app/res/values/styles.xml | 15 ++++ .../dialer/calllogutils/PhoneCallDetails.java | 3 + .../compat/android/provider/VoicemailCompat.java | 17 +++++ .../android/dialer/constants/ScheduledJobIds.java | 1 + 10 files changed, 196 insertions(+), 8 deletions(-) (limited to 'java/com/android/dialer') diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java index 47ef32d42..4f78bc97f 100644 --- a/java/com/android/dialer/app/calllog/CallLogAdapter.java +++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java @@ -960,6 +960,7 @@ public class CallLogAdapter extends GroupingListAdapter } views.callType = cursor.getInt(CallLogQuery.CALL_TYPE); views.voicemailUri = cursor.getString(CallLogQuery.VOICEMAIL_URI); + details.voicemailUri = views.voicemailUri; return details; } diff --git a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java index ad931e87a..3898d1f24 100644 --- a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java +++ b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java @@ -19,30 +19,39 @@ package com.android.dialer.app.calllog; import android.content.Context; import android.content.res.Resources; import android.graphics.Typeface; +import android.net.Uri; import android.provider.CallLog.Calls; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.support.v4.content.ContextCompat; import android.telecom.PhoneAccount; +import android.telecom.PhoneAccountHandle; import android.text.TextUtils; import android.text.format.DateUtils; import android.text.util.Linkify; +import android.view.Gravity; import android.view.View; import android.widget.TextView; +import android.widget.Toast; import com.android.dialer.app.R; import com.android.dialer.app.calllog.calllogcache.CallLogCache; import com.android.dialer.calllogutils.PhoneCallDetails; +import com.android.dialer.common.LogUtil; import com.android.dialer.compat.android.provider.VoicemailCompat; import com.android.dialer.logging.ContactSource; import com.android.dialer.oem.MotorolaUtils; import com.android.dialer.phonenumberutil.PhoneNumberHelper; import com.android.dialer.util.DialerUtils; +import com.android.voicemail.VoicemailComponent; +import com.android.voicemail.impl.transcribe.TranscriptionRatingHelper; +import com.google.internal.communications.voicemailtranscription.v1.TranscriptionRatingValue; import java.util.ArrayList; import java.util.Calendar; import java.util.concurrent.TimeUnit; /** Helper class to fill in the views in {@link PhoneCallDetailsViews}. */ -public class PhoneCallDetailsHelper { - +public class PhoneCallDetailsHelper + implements TranscriptionRatingHelper.SuccessListener, + TranscriptionRatingHelper.FailureListener { /** The maximum number of icons will be shown to represent the call types in a group. */ private static final int MAX_CALL_TYPE_ICONS = 3; @@ -152,13 +161,16 @@ public class PhoneCallDetailsHelper { String transcript = ""; String branding = ""; + boolean showRatingPrompt = false; if (!TextUtils.isEmpty(details.transcription)) { transcript = details.transcription; - // Set the branding text if the voicemail was transcribed by google - // TODO(mdooley): the transcription state is only set by the google transcription code, - // but a better solution would be to check the SOURCE_PACKAGE - if (details.transcriptionState == VoicemailCompat.TRANSCRIPTION_AVAILABLE) { + // Show a transcription quality rating prompt or set the branding text if the voicemail was + // transcribed by google + if (shouldShowTranscriptionRating(details.transcriptionState, details.accountHandle)) { + showRatingPrompt = true; + } else if (details.transcriptionState == VoicemailCompat.TRANSCRIPTION_AVAILABLE + || details.transcriptionState == VoicemailCompat.TRANSCRIPTION_AVAILABLE_AND_RATED) { branding = mResources.getString(R.string.voicemail_transcription_branding_text); } } else { @@ -183,7 +195,28 @@ public class PhoneCallDetailsHelper { } views.voicemailTranscriptionView.setText(transcript); - views.voicemailTranscriptionBrandingView.setText(branding); + if (showRatingPrompt) { + views.voicemailTranscriptionBrandingView.setVisibility(View.GONE); + + View ratingView = views.voicemailTranscriptionRatingView; + ratingView.setVisibility(View.VISIBLE); + ratingView + .findViewById(R.id.voicemail_transcription_rating_good) + .setOnClickListener( + view -> + recordTranscriptionRating( + TranscriptionRatingValue.GOOD_TRANSCRIPTION, details)); + ratingView + .findViewById(R.id.voicemail_transcription_rating_bad) + .setOnClickListener( + view -> + recordTranscriptionRating(TranscriptionRatingValue.BAD_TRANSCRIPTION, details)); + } else { + views.voicemailTranscriptionRatingView.setVisibility(View.GONE); + + views.voicemailTranscriptionBrandingView.setVisibility(View.VISIBLE); + views.voicemailTranscriptionBrandingView.setText(branding); + } } // Bold if not read @@ -198,6 +231,40 @@ public class PhoneCallDetailsHelper { details.isRead ? R.color.call_log_detail_color : R.color.call_log_unread_text_color)); } + private boolean shouldShowTranscriptionRating( + int transcriptionState, PhoneAccountHandle account) { + // TODO(mdooley): add a configurable random element here? + return transcriptionState == VoicemailCompat.TRANSCRIPTION_AVAILABLE + && VoicemailComponent.get(mContext) + .getVoicemailClient() + .isVoicemailDonationEnabled(mContext, account); + } + + private void recordTranscriptionRating( + TranscriptionRatingValue ratingValue, PhoneCallDetails details) { + LogUtil.enterBlock("PhoneCallDetailsHelper.recordTranscriptionRating"); + TranscriptionRatingHelper.sendRating( + mContext, + ratingValue, + Uri.parse(details.voicemailUri), + this::onRatingSuccess, + this::onRatingFailure); + } + + @Override + public void onRatingSuccess(Uri voicemailUri) { + LogUtil.enterBlock("PhoneCallDetailsHelper.onRatingSuccess"); + Toast toast = + Toast.makeText(mContext, R.string.voicemail_transcription_rating_thanks, Toast.LENGTH_LONG); + toast.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 50); + toast.show(); + } + + @Override + public void onRatingFailure(Throwable t) { + LogUtil.e("PhoneCallDetailsHelper.onRatingFailure", "failed to send rating", t); + } + /** * Builds a string containing the call location and date. For voicemail logs only the call date is * returned because location information is displayed in the call action button diff --git a/java/com/android/dialer/app/calllog/PhoneCallDetailsViews.java b/java/com/android/dialer/app/calllog/PhoneCallDetailsViews.java index 40c0894f0..8b7a92bd4 100644 --- a/java/com/android/dialer/app/calllog/PhoneCallDetailsViews.java +++ b/java/com/android/dialer/app/calllog/PhoneCallDetailsViews.java @@ -32,6 +32,7 @@ public final class PhoneCallDetailsViews { public final View transcriptionView; public final TextView voicemailTranscriptionView; public final TextView voicemailTranscriptionBrandingView; + public final View voicemailTranscriptionRatingView; public final TextView callAccountLabel; private PhoneCallDetailsViews( @@ -42,6 +43,7 @@ public final class PhoneCallDetailsViews { View transcriptionView, TextView voicemailTranscriptionView, TextView voicemailTranscriptionBrandingView, + View voicemailTranscriptionRatingView, TextView callAccountLabel) { this.nameView = nameView; this.callTypeView = callTypeView; @@ -50,6 +52,7 @@ public final class PhoneCallDetailsViews { this.transcriptionView = transcriptionView; this.voicemailTranscriptionView = voicemailTranscriptionView; this.voicemailTranscriptionBrandingView = voicemailTranscriptionBrandingView; + this.voicemailTranscriptionRatingView = voicemailTranscriptionRatingView; this.callAccountLabel = callAccountLabel; } @@ -69,6 +72,7 @@ public final class PhoneCallDetailsViews { view.findViewById(R.id.transcription), (TextView) view.findViewById(R.id.voicemail_transcription), (TextView) view.findViewById(R.id.voicemail_transcription_branding), + view.findViewById(R.id.voicemail_transcription_rating), (TextView) view.findViewById(R.id.call_account_label)); } @@ -81,6 +85,7 @@ public final class PhoneCallDetailsViews { new View(context), new TextView(context), new TextView(context), + new View(context), new TextView(context)); } } diff --git a/java/com/android/dialer/app/res/layout/call_log_list_item.xml b/java/com/android/dialer/app/res/layout/call_log_list_item.xml index e0f9e63b4..75c8fe6e2 100644 --- a/java/com/android/dialer/app/res/layout/call_log_list_item.xml +++ b/java/com/android/dialer/app/res/layout/call_log_list_item.xml @@ -150,7 +150,7 @@ + + + + + + + + + + + + diff --git a/java/com/android/dialer/app/res/values/colors.xml b/java/com/android/dialer/app/res/values/colors.xml index f1f5002ed..84a381f21 100644 --- a/java/com/android/dialer/app/res/values/colors.xml +++ b/java/com/android/dialer/app/res/values/colors.xml @@ -34,6 +34,8 @@ #de000000 #8a000000 + + #ff2a56c6 #b3000000 diff --git a/java/com/android/dialer/app/res/values/strings.xml b/java/com/android/dialer/app/res/values/strings.xml index 485bd8994..01c477680 100644 --- a/java/com/android/dialer/app/res/values/strings.xml +++ b/java/com/android/dialer/app/res/values/strings.xml @@ -665,6 +665,37 @@ [CHAR LIMIT=64] --> Transcript not available. No speech detected. + + Rate transcription quality + + + Good + + + Bad + + + or + + + Thanks for your feedback + View diff --git a/java/com/android/dialer/app/res/values/styles.xml b/java/com/android/dialer/app/res/values/styles.xml index d464ca7f2..c26821023 100644 --- a/java/com/android/dialer/app/res/values/styles.xml +++ b/java/com/android/dialer/app/res/values/styles.xml @@ -251,4 +251,19 @@ 1dp ?android:attr/listDivider + + + + diff --git a/java/com/android/dialer/calllogutils/PhoneCallDetails.java b/java/com/android/dialer/calllogutils/PhoneCallDetails.java index 869a3d099..fe8bfde43 100644 --- a/java/com/android/dialer/calllogutils/PhoneCallDetails.java +++ b/java/com/android/dialer/calllogutils/PhoneCallDetails.java @@ -134,6 +134,9 @@ public class PhoneCallDetails { public int voicemailId; public int previousGroup; + // The URI of the voicemail associated with this phone call, if this call went to voicemail. + public String voicemailUri; + /** * Constructor with required fields for the details of a call with a number associated with a * contact. diff --git a/java/com/android/dialer/compat/android/provider/VoicemailCompat.java b/java/com/android/dialer/compat/android/provider/VoicemailCompat.java index 175ea5d95..02eebb32c 100644 --- a/java/com/android/dialer/compat/android/provider/VoicemailCompat.java +++ b/java/com/android/dialer/compat/android/provider/VoicemailCompat.java @@ -72,4 +72,21 @@ public class VoicemailCompat { *

Internal dialer use only, not part of the public SDK. */ public static final int TRANSCRIPTION_FAILED_LANGUAGE_NOT_SUPPORTED = -2; + + /** + * Value of {@link #TRANSCRIPTION_STATE} when the voicemail transcription has completed and the + * result has been stored in the {@link #TRANSCRIPTION} column of the database, and the user has + * provided a quality rating for the transcription. + */ + public static final int TRANSCRIPTION_AVAILABLE_AND_RATED = -3; + + /** + * Voicemail transcription quality rating value sent to the server indicating a good transcription + */ + public static final int TRANSCRIPTION_QUALITY_RATING_GOOD = 1; + + /** + * Voicemail transcription quality rating value sent to the server indicating a bad transcription + */ + public static final int TRANSCRIPTION_QUALITY_RATING_BAD = 2; } diff --git a/java/com/android/dialer/constants/ScheduledJobIds.java b/java/com/android/dialer/constants/ScheduledJobIds.java index c0835b261..1a852d0e7 100644 --- a/java/com/android/dialer/constants/ScheduledJobIds.java +++ b/java/com/android/dialer/constants/ScheduledJobIds.java @@ -46,6 +46,7 @@ public final class ScheduledJobIds { public static final int VVM_TRANSCRIPTION_JOB = 203; public static final int VVM_TRANSCRIPTION_BACKFILL_JOB = 204; public static final int VVM_NOTIFICATION_JOB = 205; + public static final int VVM_TRANSCRIPTION_RATING_JOB = 206; public static final int VOIP_REGISTRATION = 300; -- cgit v1.2.3