diff --git a/java/com/android/contacts/common/list/PinnedHeaderListView.java b/java/com/android/contacts/common/list/PinnedHeaderListView.java
index 33c68b6..a801624 100644
--- a/java/com/android/contacts/common/list/PinnedHeaderListView.java
+++ b/java/com/android/contacts/common/list/PinnedHeaderListView.java
@@ -513,7 +513,7 @@
       canvas.translate(translateX, header.y);
       if (header.state == FADING) {
         mBounds.set(0, 0, view.getWidth(), view.getHeight());
-        canvas.saveLayerAlpha(mBounds, header.alpha, Canvas.ALL_SAVE_FLAG);
+        canvas.saveLayerAlpha(mBounds, header.alpha);
       }
       view.draw(canvas);
       canvas.restoreToCount(saveCount);
diff --git a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
index 1f27e5b..937f041 100644
--- a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
+++ b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
@@ -28,12 +28,9 @@
 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;
@@ -50,6 +47,7 @@
 import com.android.dialer.logging.ContactSource;
 import com.android.dialer.oem.MotorolaUtils;
 import com.android.dialer.phonenumberutil.PhoneNumberHelper;
+import com.android.dialer.spannable.ContentWithLearnMoreSpanner;
 import com.android.dialer.storage.StorageComponent;
 import com.android.dialer.util.DialerUtils;
 import com.android.voicemail.VoicemailClient;
@@ -327,7 +325,6 @@
     builder.setCancelable(true);
     AlertDialog dialog = builder.create();
 
-    // Use a custom title to prevent truncation, sigh
     TextView title = new TextView(context);
     title.setText(R.string.voicemail_donation_promo_title);
 
@@ -378,19 +375,10 @@
   }
 
   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 + " " + 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;
+    return new ContentWithLearnMoreSpanner(context)
+        .create(
+            context.getString(R.string.voicemail_donation_promo_content),
+            context.getString(R.string.voicemail_donation_promo_learn_more_url));
   }
 
   @Override
diff --git a/java/com/android/dialer/app/res/values/strings.xml b/java/com/android/dialer/app/res/values/strings.xml
index 047f9e3..7c88329 100644
--- a/java/com/android/dialer/app/res/values/strings.xml
+++ b/java/com/android/dialer/app/res/values/strings.xml
@@ -680,12 +680,9 @@
        [CHAR LIMIT=NONE] -->
   <string name="voicemail_donation_promo_content">
     Let Google review this and future voicemail messages with transcripts.
-    They\'ll be stored anonymously. Change Settings anytime.
+    They\'ll be stored anonymously. Change Settings any time. <xliff:g example="Learn more">%1$s</xliff:g>
   </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>
-
   <string translatable="false" name="voicemail_donation_promo_learn_more_url">https://support.google.com/phoneapp/answer/2811844?hl=en%26ref_topic=7539039</string>
 
   <!-- Label for the voicemail donation promo dialog opt-in button
diff --git a/java/com/android/dialer/spannable/AndroidManifest.xml b/java/com/android/dialer/spannable/AndroidManifest.xml
new file mode 100644
index 0000000..e256dc1
--- /dev/null
+++ b/java/com/android/dialer/spannable/AndroidManifest.xml
@@ -0,0 +1,22 @@
+<!--
+ ~ 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
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.dialer.spannable">
+
+  <uses-sdk
+      android:minSdkVersion="23"
+      android:targetSdkVersion="27"/>
+</manifest>
diff --git a/java/com/android/dialer/spannable/ContentWithLearnMoreSpanner.java b/java/com/android/dialer/spannable/ContentWithLearnMoreSpanner.java
new file mode 100644
index 0000000..50302af
--- /dev/null
+++ b/java/com/android/dialer/spannable/ContentWithLearnMoreSpanner.java
@@ -0,0 +1,94 @@
+/*
+ * 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.
+ */
+package com.android.dialer.spannable;
+
+import android.content.Context;
+import android.support.annotation.NonNull;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.style.TypefaceSpan;
+import com.android.dialer.common.Assert;
+
+/**
+ * Creates {@link SpannableString SpannableStrings} which are styled appropriately for Dialer
+ * content with "Learn more" links.
+ *
+ * <p>Example usage:
+ *
+ * <pre>
+ *   TextView content = ...;
+ *   ContentWithLearnMoreSpanner creator = new ContentWithLearnMoreSpanner(getApplicationContext());
+ *   // myFeatureContent: "Try my feature. <xliff:g example="Learn more">%1$s</xliff:g>"
+ *   String content = getString(R.string.myFeatureContent);
+ *
+ *   SpannableString spannable = creator.create(content, "https://www.myFeatureHelp.com");
+ *   content.setText(spannable);
+ * </pre>
+ *
+ * Users will see: "Try my feature. Learn more" where "Learn more" links to the given url.
+ */
+public final class ContentWithLearnMoreSpanner {
+
+  private final Context context;
+
+  public ContentWithLearnMoreSpanner(@NonNull Context context) {
+    this.context = context.getApplicationContext();
+  }
+
+  /**
+   * Creates a spannable string using the given content and learn more url.
+   *
+   * @param contentFormatString a format string {@see java.util.Formatter} with a single string
+   *     format parameter, e.g. "Try my feature. %1$s".
+   * @param learnMoreUrl a url which the "Learn more" text will link to.
+   * @return a {@link SpannableString}. This string is put together by inserting the text "Learn
+   *     more" into the given {@code contentFormatString}, setting "Learn more" to link to the given
+   *     {@code learnMoreUrl}, then styling the "Learn more" text with common Dialer learn more
+   *     styling. The "Learn more" text uses a non-breaking-space character to ensure it says on a
+   *     single line.
+   * @throws java.util.IllegalFormatException if {@code contentFormatString} has an improper format
+   * @throws IllegalArgumentException if it wasn't possible to add "Learn more" to the given
+   *     contentFormatString
+   */
+  @NonNull
+  public SpannableString create(@NonNull String contentFormatString, @NonNull String learnMoreUrl) {
+    String learnMore = context.getString(R.string.general_learn_more);
+
+    SpannableString contents = new SpannableString(String.format(contentFormatString, learnMore));
+
+    Assert.checkArgument(
+        contents.toString().contains(learnMore),
+        "Couldn't add learn more link to %s",
+        contentFormatString);
+
+    int learnMoreSpanStartIndex = contents.toString().lastIndexOf(learnMore);
+    int learnMoreSpanEndIndex = learnMoreSpanStartIndex + learnMore.length();
+
+    contents.setSpan(
+        new TypefaceSpan("sans-serif-medium"),
+        learnMoreSpanStartIndex,
+        learnMoreSpanEndIndex,
+        Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+
+    contents.setSpan(
+        new UrlSpanWithoutUnderline(learnMoreUrl),
+        learnMoreSpanStartIndex,
+        learnMoreSpanEndIndex,
+        Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+
+    return contents;
+  }
+}
diff --git a/java/com/android/dialer/spannable/UrlSpanWithoutUnderline.java b/java/com/android/dialer/spannable/UrlSpanWithoutUnderline.java
new file mode 100644
index 0000000..81ffa6b
--- /dev/null
+++ b/java/com/android/dialer/spannable/UrlSpanWithoutUnderline.java
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ */
+package com.android.dialer.spannable;
+
+import android.text.TextPaint;
+import android.text.style.URLSpan;
+
+/** Version of {@link URLSpan} which doesn't underline links. */
+final class UrlSpanWithoutUnderline extends URLSpan {
+
+  UrlSpanWithoutUnderline(String url) {
+    super(url);
+  }
+
+  @Override
+  public void updateDrawState(TextPaint ds) {
+    super.updateDrawState(ds);
+    ds.setUnderlineText(false);
+  }
+}
diff --git a/java/com/android/dialer/spannable/res/values/strings.xml b/java/com/android/dialer/spannable/res/values/strings.xml
new file mode 100644
index 0000000..9e214b2
--- /dev/null
+++ b/java/com/android/dialer/spannable/res/values/strings.xml
@@ -0,0 +1,22 @@
+<?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
+  -->
+<resources>
+
+  <!-- The Learn more text used for all features to link to additional details.
+      [CHAR_LIMIT=30] -->
+  <string name="general_learn_more">Learn\u00A0more</string>
+</resources>
\ No newline at end of file
diff --git a/packages.mk b/packages.mk
index bc9f729..1157621 100644
--- a/packages.mk
+++ b/packages.mk
@@ -59,6 +59,7 @@
 	com.android.dialer.shortcuts \
 	com.android.dialer.simulator.impl \
 	com.android.dialer.speeddial \
+	com.android.dialer.spannable \
 	com.android.dialer.theme \
 	com.android.dialer.util \
 	com.android.dialer.voicemail.listui \
