Adding voicemail donation promo

This cl shows a voicemail donation promo the first time a user
tries to rate a transcription. It also changes the good/bad rating links
to thumbs up/down icons.

The 'learn more' link still needs the real URL.

screen shots:
https://drive.google.com/open?id=0B9o_KvtLkcuIOERUNUJId3FVY3UzUS0wVUdQQVpCS1lmM3Nz
https://drive.google.com/open?id=0B9o_KvtLkcuIWkNVMDV1VTJ4VUMtakVwSE1UTGdUWjljTUV3
https://drive.google.com/open?id=0B9o_KvtLkcuIeU1ndG1palRkTnNJQWVYLXgyMnd4TjBDOFI4

mocks:
https://drive.google.com/file/d/1FIhXDkn3h3xI7liVdJEraq47MoKQM3hi/view
https://drive.google.com/file/d/1uTm58QCvFOBycsGP21vgvEGTq_Imgkqi/view

Bug: 37340510
Test: manual tests
PiperOrigin-RevId: 184745497
Change-Id: I40fd1e211311c3127f215ede2e44b22f345dcf8b
diff --git a/assets/quantum/res/drawable/quantum_ic_thumb_down_grey600_24.xml b/assets/quantum/res/drawable/quantum_ic_thumb_down_grey600_24.xml
new file mode 100644
index 0000000..fec2563
--- /dev/null
+++ b/assets/quantum/res/drawable/quantum_ic_thumb_down_grey600_24.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2018 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
+  -->
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:name="vector"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path
+        android:name="path"
+        android:pathData="M 15 3 L 6 3 C 5.17 3 4.46 3.5 4.16 4.22 L 1.14 11.27 C 1.05 11.5 1 11.74 1 12 L 1 13.91 L 1.01 13.92 L 1 14 C 1 15.1 1.9 16 3 16 L 9.31 16 L 8.36 20.57 L 8.33 20.89 C 8.33 21.3 8.5 21.68 8.77 21.95 L 9.83 23 L 16.42 16.41 C 16.78 16.05 17 15.55 17 15 L 17 5 C 17 3.9 16.1 3 15 3 Z M 19 3 L 19 15 L 23 15 L 23 3 L 19 3 Z"
+        android:fillColor="#757575"
+        android:strokeWidth="1"/>
+</vector>
diff --git a/assets/quantum/res/drawable/quantum_ic_thumb_up_grey600_24.xml b/assets/quantum/res/drawable/quantum_ic_thumb_up_grey600_24.xml
new file mode 100644
index 0000000..06a4cbd
--- /dev/null
+++ b/assets/quantum/res/drawable/quantum_ic_thumb_up_grey600_24.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2018 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
+  -->
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:name="vector"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path
+        android:name="path"
+        android:pathData="M 1 21 L 5 21 L 5 9 L 1 9 L 1 21 Z M 23 10 C 23 8.9 22.1 8 21 8 L 14.69 8 L 15.64 3.43 L 15.67 3.11 C 15.67 2.7 15.5 2.32 15.23 2.05 L 14.17 1 L 7.59 7.59 C 7.22 7.95 7 8.45 7 9 L 7 19 C 7 20.1 7.9 21 9 21 L 18 21 C 18.83 21 19.54 20.5 19.84 19.78 L 22.86 12.73 C 22.95 12.5 23 12.26 23 12 L 23 10.09 L 22.99 10.08 L 23 10 Z"
+        android:fillColor="#757575"
+        android:strokeWidth="1"/>
+</vector>
diff --git a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
index e23d92c..82c9815 100644
--- a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
+++ b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
@@ -16,7 +16,9 @@
 
 package com.android.dialer.app.calllog;
 
+import android.app.AlertDialog;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.res.Resources;
 import android.graphics.Typeface;
 import android.net.Uri;
@@ -25,11 +27,18 @@
 import android.support.v4.content.ContextCompat;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
+import android.text.SpannableString;
+import android.text.Spanned;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
+import android.text.method.LinkMovementMethod;
+import android.text.style.TextAppearanceSpan;
+import android.text.style.URLSpan;
 import android.text.util.Linkify;
+import android.util.TypedValue;
 import android.view.Gravity;
 import android.view.View;
+import android.widget.Button;
 import android.widget.TextView;
 import android.widget.Toast;
 import com.android.dialer.app.R;
@@ -41,7 +50,9 @@
 import com.android.dialer.logging.ContactSource;
 import com.android.dialer.oem.MotorolaUtils;
 import com.android.dialer.phonenumberutil.PhoneNumberHelper;
+import com.android.dialer.storage.StorageComponent;
 import com.android.dialer.util.DialerUtils;
+import com.android.voicemail.VoicemailClient;
 import com.android.voicemail.VoicemailComponent;
 import com.android.voicemail.impl.transcribe.TranscriptionRatingHelper;
 import com.google.internal.communications.voicemailtranscription.v1.TranscriptionRatingValue;
@@ -56,6 +67,9 @@
   /** 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;
 
+  private static final String PREF_VOICEMAIL_DONATION_PROMO_SHOWN_KEY =
+      "pref_voicemail_donation_promo_shown_key";
+
   private final Context context;
   private final Resources resources;
   private final CallLogCache callLogCache;
@@ -165,15 +179,10 @@
 
       String transcript = "";
       String branding = "";
-      boolean showRatingPrompt = false;
       if (!TextUtils.isEmpty(details.transcription)) {
         transcript = details.transcription;
 
-        // 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
+        if (details.transcriptionState == VoicemailCompat.TRANSCRIPTION_AVAILABLE
             || details.transcriptionState == VoicemailCompat.TRANSCRIPTION_AVAILABLE_AND_RATED) {
           branding = resources.getString(R.string.voicemail_transcription_branding_text);
         }
@@ -198,28 +207,25 @@
       }
 
       views.voicemailTranscriptionView.setText(transcript);
-      if (showRatingPrompt) {
-        views.voicemailTranscriptionBrandingView.setVisibility(View.GONE);
-        views.voicemailTranscriptionBrandingView.setText(branding);
+      views.voicemailTranscriptionBrandingView.setText(branding);
 
-        View ratingView = views.voicemailTranscriptionRatingView;
+      View ratingView = views.voicemailTranscriptionRatingView;
+      if (shouldShowTranscriptionRating(details.transcriptionState, details.accountHandle)) {
         ratingView.setVisibility(View.VISIBLE);
         ratingView
             .findViewById(R.id.voicemail_transcription_rating_good)
             .setOnClickListener(
                 view ->
                     recordTranscriptionRating(
-                        TranscriptionRatingValue.GOOD_TRANSCRIPTION, details));
+                        TranscriptionRatingValue.GOOD_TRANSCRIPTION, details, ratingView));
         ratingView
             .findViewById(R.id.voicemail_transcription_rating_bad)
             .setOnClickListener(
                 view ->
-                    recordTranscriptionRating(TranscriptionRatingValue.BAD_TRANSCRIPTION, details));
+                    recordTranscriptionRating(
+                        TranscriptionRatingValue.BAD_TRANSCRIPTION, details, ratingView));
       } else {
-        views.voicemailTranscriptionRatingView.setVisibility(View.GONE);
-
-        views.voicemailTranscriptionBrandingView.setVisibility(View.VISIBLE);
-        views.voicemailTranscriptionBrandingView.setText(branding);
+        ratingView.setVisibility(View.GONE);
       }
     }
 
@@ -237,22 +243,156 @@
 
   private boolean shouldShowTranscriptionRating(
       int transcriptionState, PhoneAccountHandle account) {
-    // TODO(mdooley): add a configurable random element here?
-    return transcriptionState == VoicemailCompat.TRANSCRIPTION_AVAILABLE
-        && VoicemailComponent.get(context)
-            .getVoicemailClient()
-            .isVoicemailDonationEnabled(context, account);
+    if (transcriptionState != VoicemailCompat.TRANSCRIPTION_AVAILABLE) {
+      return false;
+    }
+
+    VoicemailClient client = VoicemailComponent.get(context).getVoicemailClient();
+    if (client.isVoicemailDonationEnabled(context, account)) {
+      return true;
+    }
+
+    // Also show the rating option if voicemail transcription is available (but not enabled)
+    // and the donation promo has not yet been shown.
+    if (client.isVoicemailDonationAvailable(context) && !hasSeenVoicemailDonationPromo(context)) {
+      return true;
+    }
+
+    return false;
   }
 
   private void recordTranscriptionRating(
-      TranscriptionRatingValue ratingValue, PhoneCallDetails details) {
+      TranscriptionRatingValue ratingValue, PhoneCallDetails details, View ratingView) {
     LogUtil.enterBlock("PhoneCallDetailsHelper.recordTranscriptionRating");
-    TranscriptionRatingHelper.sendRating(
-        context,
-        ratingValue,
-        Uri.parse(details.voicemailUri),
-        this::onRatingSuccess,
-        this::onRatingFailure);
+
+    if (shouldShowVoicemailDonationPromo(context)) {
+      showVoicemailDonationPromo(ratingValue, details, ratingView);
+    } else {
+      TranscriptionRatingHelper.sendRating(
+          context,
+          ratingValue,
+          Uri.parse(details.voicemailUri),
+          this::onRatingSuccess,
+          this::onRatingFailure);
+    }
+  }
+
+  static boolean shouldShowVoicemailDonationPromo(Context context) {
+    VoicemailClient client = VoicemailComponent.get(context).getVoicemailClient();
+    return client.isVoicemailTranscriptionAvailable(context)
+        && client.isVoicemailDonationAvailable(context)
+        && !hasSeenVoicemailDonationPromo(context);
+  }
+
+  static boolean hasSeenVoicemailDonationPromo(Context context) {
+    return StorageComponent.get(context.getApplicationContext())
+        .unencryptedSharedPrefs()
+        .getBoolean(PREF_VOICEMAIL_DONATION_PROMO_SHOWN_KEY, false);
+  }
+
+  private void showVoicemailDonationPromo(
+      TranscriptionRatingValue ratingValue, PhoneCallDetails details, View ratingView) {
+    AlertDialog.Builder builder = new AlertDialog.Builder(context);
+    builder.setMessage(getVoicemailDonationPromoContent());
+    builder.setPositiveButton(
+        R.string.voicemail_donation_promo_opt_in,
+        new DialogInterface.OnClickListener() {
+          @Override
+          public void onClick(final DialogInterface dialog, final int button) {
+            LogUtil.i("PhoneCallDetailsHelper.showVoicemailDonationPromo", "onClick");
+            dialog.cancel();
+            recordPromoShown(context);
+            VoicemailComponent.get(context)
+                .getVoicemailClient()
+                .setVoicemailDonationEnabled(context, details.accountHandle, true);
+            TranscriptionRatingHelper.sendRating(
+                context,
+                ratingValue,
+                Uri.parse(details.voicemailUri),
+                PhoneCallDetailsHelper.this::onRatingSuccess,
+                PhoneCallDetailsHelper.this::onRatingFailure);
+            ratingView.setVisibility(View.GONE);
+          }
+        });
+    builder.setNegativeButton(
+        R.string.voicemail_donation_promo_opt_out,
+        new DialogInterface.OnClickListener() {
+          @Override
+          public void onClick(final DialogInterface dialog, final int button) {
+            dialog.cancel();
+            recordPromoShown(context);
+            ratingView.setVisibility(View.GONE);
+          }
+        });
+    builder.setCancelable(true);
+    AlertDialog dialog = builder.create();
+
+    // Use a custom title to prevent truncation, sigh
+    TextView title = new TextView(context);
+    title.setText(
+        ratingValue == TranscriptionRatingValue.GOOD_TRANSCRIPTION
+            ? R.string.voicemail_donation_promo_good_title
+            : R.string.voicemail_donation_promo_bad_title);
+    title.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL));
+    title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
+    title.setTextColor(ContextCompat.getColor(context, R.color.dialer_primary_text_color));
+    title.setPadding(
+        dpsToPixels(context, 24), /* left */
+        dpsToPixels(context, 10), /* top */
+        dpsToPixels(context, 24), /* right */
+        dpsToPixels(context, 0)); /* bottom */
+    dialog.setCustomTitle(title);
+
+    dialog.show();
+
+    // Make the message link clickable and adjust the appearance of the message and buttons
+    TextView textView = (TextView) dialog.findViewById(android.R.id.message);
+    textView.setLineSpacing(0, 1.2f);
+    textView.setMovementMethod(LinkMovementMethod.getInstance());
+    Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
+    if (positiveButton != null) {
+      positiveButton.setTextColor(
+          context
+              .getResources()
+              .getColor(R.color.voicemail_donation_promo_positive_button_text_color));
+    }
+    Button negativeButton = dialog.getButton(DialogInterface.BUTTON_NEGATIVE);
+    if (negativeButton != null) {
+      negativeButton.setTextColor(
+          context
+              .getResources()
+              .getColor(R.color.voicemail_donation_promo_negative_button_text_color));
+    }
+  }
+
+  private static int dpsToPixels(Context context, int dps) {
+    return (int)
+        (TypedValue.applyDimension(
+            TypedValue.COMPLEX_UNIT_DIP, dps, context.getResources().getDisplayMetrics()));
+  }
+
+  private static void recordPromoShown(Context context) {
+    StorageComponent.get(context.getApplicationContext())
+        .unencryptedSharedPrefs()
+        .edit()
+        .putBoolean(PREF_VOICEMAIL_DONATION_PROMO_SHOWN_KEY, true)
+        .apply();
+  }
+
+  private SpannableString getVoicemailDonationPromoContent() {
+    CharSequence content = context.getString(R.string.voicemail_donation_promo_content);
+    CharSequence learnMore = context.getString(R.string.voicemail_donation_promo_learn_more);
+    String learnMoreUrl = context.getString(R.string.voicemail_donation_promo_learn_more_url);
+    SpannableString span = new SpannableString(content + "\n" + learnMore);
+    int end = span.length();
+    int start = end - learnMore.length();
+    span.setSpan(new URLSpan(learnMoreUrl), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+    span.setSpan(
+        new TextAppearanceSpan(context, R.style.PromoLinkStyle),
+        start,
+        end,
+        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+    return span;
   }
 
   @Override
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 a24552b..1b776b4 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
@@ -193,36 +193,27 @@
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:layout_weight="1"
-                  android:gravity="start"
+                  android:gravity="start|center_vertical"
                   android:focusable="true"
                   android:text="@string/voicemail_transcription_rating"/>
 
-              <TextView
-                  style="@style/TranscriptionQualityRatingLink"
+              <ImageView
+                  style="@style/TranscriptionQualityRatingIcon"
                   android:id="@+id/voicemail_transcription_rating_good"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
-                  android:gravity="end"
+                  android:gravity="end|center_vertical"
                   android:focusable="true"
-                  android:text="@string/voicemail_transcription_rating_good"/>
+                  android:src="@drawable/quantum_ic_thumb_up_grey600_24"/>
 
-              <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:focusable="true"
-                  android:text="@string/voicemail_transcription_rating_separator"/>
-
-              <TextView
-                  style="@style/TranscriptionQualityRatingLink"
+              <ImageView
+                  style="@style/TranscriptionQualityRatingIcon"
                   android:id="@+id/voicemail_transcription_rating_bad"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
-                  android:gravity="end"
+                  android:gravity="end|center_vertical"
                   android:focusable="true"
-                  android:text="@string/voicemail_transcription_rating_bad"/>
+                  android:src="@drawable/quantum_ic_thumb_down_grey600_24"/>
 
             </LinearLayout>
 
diff --git a/java/com/android/dialer/app/res/values/colors.xml b/java/com/android/dialer/app/res/values/colors.xml
index 84a381f..e79c5c5 100644
--- a/java/com/android/dialer/app/res/values/colors.xml
+++ b/java/com/android/dialer/app/res/values/colors.xml
@@ -80,4 +80,7 @@
   <color name="blocked_number_disabled_emergency_background_color">#E0E0E0</color>
   <color name="add_blocked_number_icon_color">#bdbdbd</color>
 
+  <color name="voicemail_donation_promo_positive_button_text_color">#FF2A56C6</color>
+  <color name="voicemail_donation_promo_negative_button_text_color">#FF757575</color>
+
 </resources>
diff --git a/java/com/android/dialer/app/res/values/strings.xml b/java/com/android/dialer/app/res/values/strings.xml
index d4f3f81..2d5542b 100644
--- a/java/com/android/dialer/app/res/values/strings.xml
+++ b/java/com/android/dialer/app/res/values/strings.xml
@@ -675,34 +675,39 @@
        [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. -->
+  <!-- Title of voicemail donation promo dialog, show after clicking a 'thumbs up' rating icon
+       [CHAR LIMIT=64] -->
+  <string name="voicemail_donation_promo_good_title">Thanks! Would you like to help us improve transcriptions?</string>
+
+  <!-- Title of voicemail donation promo dialog, show after clicking a 'thumbs up' rating icon
+       [CHAR LIMIT=64] -->
+  <string name="voicemail_donation_promo_bad_title">Sorry. Would you like to help us improve transcriptions?</string>
+
+  <!-- Content of voicemail donation promo dialog
+       [CHAR LIMIT=NONE] -->
+  <string name="voicemail_donation_promo_content">
+    Let Google review your voicemail messages to improve transcription quality. Your
+    voicemail messages will not be tied to your Google Account.
+  </string>
+
+  <!-- Text for a 'learn more' link at the end of the voicemail donation promo dialog content -->
+  <string name="voicemail_donation_promo_learn_more">Learn&#160;more</string>
+
+  <!-- TODO(mdooley): get real url -->
+  <string translatable="false" name="voicemail_donation_promo_learn_more_url">https:www.google.com</string>
+
+  <!-- Label for the voicemail donation promo dialog opt-in button
+       [CHAR LIMIT=20] -->
+  <string name="voicemail_donation_promo_opt_in">Yes, I\'m in</string>
+
+  <!-- Label for the voicemail donation promo dialog opt-out button
+       [CHAR LIMIT=20] -->
+  <string name="voicemail_donation_promo_opt_out">No thanks</string>
+
+  <!-- Prompt asking the user to rate the quality of the voicemail transcription
+       [CHAR LIMIT=30] -->
   <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>
 
diff --git a/java/com/android/dialer/app/res/values/styles.xml b/java/com/android/dialer/app/res/values/styles.xml
index b275cec..869f127 100644
--- a/java/com/android/dialer/app/res/values/styles.xml
+++ b/java/com/android/dialer/app/res/values/styles.xml
@@ -258,15 +258,22 @@
   <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>
+    <item name="android:textStyle">italic</item>
+    <item name="android:paddingRight">20dp</item>
+    <item name="android:minHeight">56dp</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>
+  <style name="TranscriptionQualityRatingIcon">
     <item name="android:paddingTop">8dp</item>
     <item name="android:paddingBottom">8dp</item>
-    <item name="android:paddingLeft">12dp</item>
-    <item name="android:paddingRight">12dp</item>
-    <item name="android:minHeight">48dp</item>
+    <item name="android:paddingLeft">16dp</item>
+    <item name="android:paddingRight">16dp</item>
+    <item name="android:minHeight">56dp</item>
   </style>
+
+  <style name="PromoLinkStyle">
+    <item name="android:textColor">@color/dialer_theme_color</item>
+    <item name="android:fontFamily">"sans-serif-medium"</item>
+  </style>
+
 </resources>
diff --git a/java/com/android/dialer/theme/res/values/dimens.xml b/java/com/android/dialer/theme/res/values/dimens.xml
index 88b8a04..e7c9477 100644
--- a/java/com/android/dialer/theme/res/values/dimens.xml
+++ b/java/com/android/dialer/theme/res/values/dimens.xml
@@ -22,7 +22,7 @@
   <dimen name="call_log_primary_text_size">16sp</dimen>
   <dimen name="call_log_detail_text_size">12sp</dimen>
   <dimen name="call_log_day_group_heading_size">14sp</dimen>
-  <dimen name="call_log_voicemail_transcription_text_size">14sp</dimen>
+  <dimen name="call_log_voicemail_transcription_text_size">16sp</dimen>
   <!-- Height of the call log actions section for each call log entry -->
   <dimen name="call_log_action_height">48dp</dimen>
   <dimen name="call_log_day_group_padding_top">15dp</dimen>