summaryrefslogtreecommitdiff
path: root/java/com/android/dialer
diff options
context:
space:
mode:
authormdooley <mdooley@google.com>2017-11-23 08:31:05 -0800
committerEric Erfanian <erfanian@google.com>2017-11-28 14:34:47 -0800
commit70fedf8d6caee1177ee891bbfff404dc48867c16 (patch)
treec59375133ee2f7236c17758706e88a492db81259 /java/com/android/dialer
parent5b6d823a45fe56cf9c36e5b00908831049c1d827 (diff)
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
Diffstat (limited to 'java/com/android/dialer')
-rw-r--r--java/com/android/dialer/app/calllog/CallLogAdapter.java1
-rw-r--r--java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java81
-rw-r--r--java/com/android/dialer/app/calllog/PhoneCallDetailsViews.java5
-rw-r--r--java/com/android/dialer/app/res/layout/call_log_list_item.xml48
-rw-r--r--java/com/android/dialer/app/res/values/colors.xml2
-rw-r--r--java/com/android/dialer/app/res/values/strings.xml31
-rw-r--r--java/com/android/dialer/app/res/values/styles.xml15
-rw-r--r--java/com/android/dialer/calllogutils/PhoneCallDetails.java3
-rw-r--r--java/com/android/dialer/compat/android/provider/VoicemailCompat.java17
-rw-r--r--java/com/android/dialer/constants/ScheduledJobIds.java1
10 files changed, 196 insertions, 8 deletions
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 @@
<LinearLayout
android:id="@+id/transcription"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/call_log_icon_margin"
android:visibility="gone"
@@ -174,8 +174,54 @@
android:textSize="@dimen/call_log_voicemail_transcription_text_size"
android:focusable="true"
android:nextFocusUp="@id/voicemail_transcription"
+ android:nextFocusDown="@+id/voicemail_transcription_rating"
android:paddingTop="2dp"/>
+ <LinearLayout
+ android:id="@+id/voicemail_transcription_rating"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/call_log_icon_margin"
+ android:layout_gravity="center_vertical"
+ android:visibility="gone"
+ android:paddingTop="2dp"
+ android:orientation="horizontal">
+
+ <TextView
+ style="@style/TranscriptionQualityRating"
+ android:id="@+id/voicemail_transcription_rating_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:gravity="start"
+ android:text="@string/voicemail_transcription_rating"/>
+
+ <TextView
+ style="@style/TranscriptionQualityRatingLink"
+ android:id="@+id/voicemail_transcription_rating_good"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="end"
+ android:text="@string/voicemail_transcription_rating_good"/>
+
+ <TextView
+ style="@style/TranscriptionQualityRating"
+ android:id="@+id/voicemail_transcription_rating_separator"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="end"
+ android:text="@string/voicemail_transcription_rating_separator"/>
+
+ <TextView
+ style="@style/TranscriptionQualityRatingLink"
+ android:id="@+id/voicemail_transcription_rating_bad"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="end"
+ android:text="@string/voicemail_transcription_rating_bad"/>
+
+ </LinearLayout>
+
</LinearLayout>
</LinearLayout>
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 @@
<color name="call_log_voicemail_transcript_color">#de000000</color>
<!-- 54% black -->
<color name="call_log_voicemail_transcript_branding_color">#8a000000</color>
+ <!-- 100% blue -->
+ <color name="call_log_voicemail_transcript_rating_color">#ff2a56c6</color>
<!-- 70% black -->
<color name="call_log_action_color">#b3000000</color>
<!-- 54% black -->
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] -->
<string name="voicemail_transcription_failed_no_speech">Transcript not available. No speech detected.</string>
+ <!-- Prompt asking the user to rate the quality of the voicemail transcription [CHAR LIMIT=30]
+ voicemail_transcription_rating, voicemail_transcription_rating_good,
+ voicemail_transcription_rating_separator and voicemail_transcription_rating_bad are
+ used together to form the rating prompt: 'Rate transcription quality Good or Bad'
+ where 'Good' and 'Bad' are clickable links. -->
+ <string name="voicemail_transcription_rating">Rate transcription quality</string>
+
+ <!-- Rating choice indicating that the voicemail transcription was good [CHAR LIMIT=10]
+ voicemail_transcription_rating, voicemail_transcription_rating_good,
+ voicemail_transcription_rating_separator and voicemail_transcription_rating_bad are
+ used together to form the rating prompt: 'Rate transcription quality Good or Bad'
+ where 'Good' and 'Bad' are clickable links. -->
+ <string name="voicemail_transcription_rating_good">Good</string>
+
+ <!-- Rating choice indicating that the voicemail transcription was bad [CHAR LIMIT=10]
+ voicemail_transcription_rating, voicemail_transcription_rating_good,
+ voicemail_transcription_rating_separator and voicemail_transcription_rating_bad are
+ used together to form the rating prompt: 'Rate transcription quality Good or Bad'
+ where 'Good' and 'Bad' are clickable links. -->
+ <string name="voicemail_transcription_rating_bad">Bad</string>
+
+ <!-- Separator between the good and bad transcription rating choices [CHAR LIMIT=10]
+ voicemail_transcription_rating, voicemail_transcription_rating_good,
+ voicemail_transcription_rating_separator and voicemail_transcription_rating_bad are
+ used together to form the rating prompt: 'Rate transcription quality Good or Bad'
+ where 'Good' and 'Bad' are clickable links. -->
+ <string name="voicemail_transcription_rating_separator"> or </string>
+
+ <!-- Message displayed after user has rated a voicemail transcription [CHAR LIMIT=30] -->
+ <string name="voicemail_transcription_rating_thanks">Thanks for your feedback</string>
+
<!-- Button text to prompt a user to open an sms conversation [CHAR LIMIT=NONE] -->
<string name="view_conversation">View</string>
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 @@
<item name="android:layout_height">1dp</item>
<item name="android:background">?android:attr/listDivider</item>
</style>
+
+ <style name="TranscriptionQualityRating">
+ <item name="android:textColor">@color/call_log_voicemail_transcript_branding_color</item>
+ <item name="android:textSize">@dimen/call_log_voicemail_transcription_text_size</item>
+ </style>
+
+ <style name="TranscriptionQualityRatingLink">
+ <item name="android:textColor">@color/call_log_voicemail_transcript_rating_color</item>
+ <item name="android:textSize">@dimen/call_log_voicemail_transcription_text_size</item>
+ <item name="android:paddingTop">8dp</item>
+ <item name="android:paddingBottom">8dp</item>
+ <item name="android:paddingLeft">4dp</item>
+ <item name="android:paddingRight">4dp</item>
+ <item name="android:minHeight">48dp</item>
+ </style>
</resources>
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 {
* <p>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;