Loading java/com/android/contacts/common/list/PinnedHeaderListView.java +1 −1 Original line number Diff line number Diff line Loading @@ -513,7 +513,7 @@ public class PinnedHeaderListView extends AutoScrollListView 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); Loading java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java +5 −17 Original line number Diff line number Diff line Loading @@ -28,12 +28,9 @@ 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; Loading @@ -50,6 +47,7 @@ import com.android.dialer.compat.telephony.TelephonyManagerCompat; 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; Loading Loading @@ -327,7 +325,6 @@ public class PhoneCallDetailsHelper 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); Loading Loading @@ -378,19 +375,10 @@ public class PhoneCallDetailsHelper } 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 Loading java/com/android/dialer/app/res/values/strings.xml +1 −4 Original line number Diff line number Diff line Loading @@ -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 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 Loading java/com/android/dialer/spannable/AndroidManifest.xml 0 → 100644 +22 −0 Original line number Diff line number Diff line <!-- ~ 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> java/com/android/dialer/spannable/ContentWithLearnMoreSpanner.java 0 → 100644 +94 −0 Original line number Diff line number Diff line /* * 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; } } Loading
java/com/android/contacts/common/list/PinnedHeaderListView.java +1 −1 Original line number Diff line number Diff line Loading @@ -513,7 +513,7 @@ public class PinnedHeaderListView extends AutoScrollListView 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); Loading
java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java +5 −17 Original line number Diff line number Diff line Loading @@ -28,12 +28,9 @@ 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; Loading @@ -50,6 +47,7 @@ import com.android.dialer.compat.telephony.TelephonyManagerCompat; 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; Loading Loading @@ -327,7 +325,6 @@ public class PhoneCallDetailsHelper 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); Loading Loading @@ -378,19 +375,10 @@ public class PhoneCallDetailsHelper } 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 Loading
java/com/android/dialer/app/res/values/strings.xml +1 −4 Original line number Diff line number Diff line Loading @@ -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 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 Loading
java/com/android/dialer/spannable/AndroidManifest.xml 0 → 100644 +22 −0 Original line number Diff line number Diff line <!-- ~ 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>
java/com/android/dialer/spannable/ContentWithLearnMoreSpanner.java 0 → 100644 +94 −0 Original line number Diff line number Diff line /* * 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; } }