diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2018-01-23 03:51:25 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2018-01-23 03:51:25 +0000 |
commit | 5feae4d9f7b3685be38b48c1806ceb03c6b2273c (patch) | |
tree | 6ef19b009a788ed8f6d4b88b0a08b03adf9d1e30 /java/com/android/dialer/voicemail/listui/error/VoicemailTosMessageCreator.java | |
parent | c979f257060fbcb95cbd4871461dd5eb1ae04f1b (diff) | |
parent | 4deaebc5a988eb83440693721f1ab28b180d8779 (diff) |
Merge "Move legacy voicemail/error to nui voicemail/listui/error"
Diffstat (limited to 'java/com/android/dialer/voicemail/listui/error/VoicemailTosMessageCreator.java')
-rw-r--r-- | java/com/android/dialer/voicemail/listui/error/VoicemailTosMessageCreator.java | 554 |
1 files changed, 554 insertions, 0 deletions
diff --git a/java/com/android/dialer/voicemail/listui/error/VoicemailTosMessageCreator.java b/java/com/android/dialer/voicemail/listui/error/VoicemailTosMessageCreator.java new file mode 100644 index 000000000..ec1a95a1a --- /dev/null +++ b/java/com/android/dialer/voicemail/listui/error/VoicemailTosMessageCreator.java @@ -0,0 +1,554 @@ +/* + * Copyright (C) 2017 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.voicemail.listui.error; + +import android.app.AlertDialog; +import android.content.ComponentName; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.net.Uri; +import android.os.Build; +import android.preference.PreferenceManager; +import android.support.annotation.Nullable; +import android.telecom.PhoneAccountHandle; +import android.telephony.TelephonyManager; +import android.text.Layout; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.style.AlignmentSpan; +import android.text.style.TextAppearanceSpan; +import android.text.style.URLSpan; +import android.view.View; +import android.view.View.OnClickListener; +import com.android.dialer.common.LogUtil; +import com.android.dialer.compat.telephony.TelephonyManagerCompat; +import com.android.dialer.configprovider.ConfigProviderBindings; +import com.android.dialer.constants.Constants; +import com.android.dialer.logging.DialerImpression; +import com.android.dialer.logging.Logger; +import com.android.dialer.voicemail.listui.error.VoicemailErrorMessage.Action; +import com.android.dialer.voicemail.settings.VoicemailSettingsFragment; +import com.android.voicemail.VisualVoicemailTypeExtensions; +import com.android.voicemail.VoicemailClient; +import com.android.voicemail.VoicemailComponent; +import com.android.voicemail.VoicemailVersionConstants; +import java.util.Locale; + +/** + * Create error message from {@link VoicemailStatus} for voicemail. This is will show different + * terms of service for Verizon and for other carriers. + */ +public class VoicemailTosMessageCreator { + private static final String ISO639_SPANISH = "es"; + + private final Context context; + private final VoicemailStatus status; + private final VoicemailStatusReader statusReader; + private final SharedPreferences preferences; + + VoicemailTosMessageCreator( + final Context context, + final VoicemailStatus status, + final VoicemailStatusReader statusReader) { + this.context = context; + this.status = status; + this.statusReader = statusReader; + this.preferences = + PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()); + } + + @Nullable + VoicemailErrorMessage maybeCreateTosMessage() { + if (!canShowTos()) { + return null; + } else if (shouldShowTos()) { + logTosCreatedImpression(); + return getTosMessage(); + } else if (shouldShowPromo()) { + return getPromoMessage(); + } else { + return null; + } + } + + private VoicemailErrorMessage getTosMessage() { + return new VoicemailTosMessage( + getNewUserTosTitle(), + getNewUserTosMessageText(), + new Action( + getDeclineText(), + new OnClickListener() { + @Override + public void onClick(View v) { + LogUtil.i("VoicemailTosMessageCreator.getTosMessage", "decline clicked"); + PhoneAccountHandle handle = + new PhoneAccountHandle( + ComponentName.unflattenFromString(status.phoneAccountComponentName), + status.phoneAccountId); + logTosDeclinedImpression(); + showDeclineTosDialog(handle); + } + }), + new Action( + getAcceptText(), + new OnClickListener() { + @Override + public void onClick(View v) { + LogUtil.i("VoicemailTosMessageCreator.getTosMessage", "accept clicked"); + recordTosAcceptance(); + // Accepting the TOS also acknowledges the latest features + recordFeatureAcknowledgement(); + logTosAcceptedImpression(); + statusReader.refresh(); + } + }, + true /* raised */)) + .setModal(true) + .setImageResourceId(R.drawable.voicemail_tos_image); + } + + private VoicemailErrorMessage getPromoMessage() { + return new VoicemailTosMessage( + getExistingUserTosTitle(), + getExistingUserTosMessageText(), + new Action( + context.getString(R.string.dialer_terms_and_conditions_existing_user_setings), + new OnClickListener() { + @Override + public void onClick(View v) { + LogUtil.i("VoicemailTosMessageCreator.getPromoMessage", "open settings"); + Intent intent = + new Intent(Intent.ACTION_VIEW) + .setComponent( + new ComponentName(context, Constants.get().getSettingsActivity())) + .setData( + Uri.fromParts( + "header", VoicemailSettingsFragment.class.getName(), null)); + context.startActivity(intent); + } + }), + new Action( + context.getString(R.string.dialer_terms_and_conditions_existing_user_ack), + new OnClickListener() { + @Override + public void onClick(View v) { + LogUtil.i("VoicemailTosMessageCreator.getPromoMessage", "acknowledge clicked"); + // Feature acknowledgement also means accepting TOS + recordTosAcceptance(); + recordFeatureAcknowledgement(); + statusReader.refresh(); + } + }, + true /* raised */)) + .setModal(true) + .setImageResourceId(R.drawable.voicemail_tos_image); + } + + private boolean canShowTos() { + if (!isValidVoicemailType(status.type)) { + LogUtil.i("VoicemailTosMessageCreator.canShowTos", "unsupported type: " + status.type); + return false; + } + + if (status.getPhoneAccountHandle() == null + || status.getPhoneAccountHandle().getComponentName() == null) { + LogUtil.i("VoicemailTosMessageCreator.canShowTos", "invalid phone account"); + return false; + } + + return true; + } + + private boolean shouldShowTos() { + if (hasAcceptedTos()) { + LogUtil.i("VoicemailTosMessageCreator.shouldShowTos", "already accepted TOS"); + return false; + } + + if (isVvm3()) { + LogUtil.i("VoicemailTosMessageCreator.shouldShowTos", "showing TOS for verizon"); + return true; + } + + if (isVoicemailTranscriptionAvailable() && !isLegacyVoicemailUser()) { + LogUtil.i( + "VoicemailTosMessageCreator.shouldShowTos", "showing TOS for Google transcription users"); + return true; + } + + return false; + } + + private boolean shouldShowPromo() { + if (hasAcknowledgedFeatures()) { + LogUtil.i( + "VoicemailTosMessageCreator.shouldShowPromo", "already acknowledeged latest features"); + return false; + } + + if (isVoicemailTranscriptionAvailable()) { + LogUtil.i( + "VoicemailTosMessageCreator.shouldShowPromo", + "showing promo for Google transcription users"); + return true; + } + + return false; + } + + private static boolean isValidVoicemailType(String type) { + if (type == null) { + return false; + } + switch (type) { + case TelephonyManager.VVM_TYPE_OMTP: + case TelephonyManager.VVM_TYPE_CVVM: + case VisualVoicemailTypeExtensions.VVM_TYPE_VVM3: + return true; + default: + return false; + } + } + + private boolean isVoicemailTranscriptionAvailable() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O + && ConfigProviderBindings.get(context) + .getBoolean("voicemail_transcription_available", false); + } + + private void showDeclineTosDialog(final PhoneAccountHandle handle) { + if (isVvm3() && Vvm3VoicemailMessageCreator.PIN_NOT_SET == status.configurationState) { + LogUtil.i( + "VoicemailTosMessageCreator.showDeclineTosDialog", "PIN_NOT_SET, showing set PIN dialog"); + showSetPinBeforeDeclineDialog(handle); + return; + } + LogUtil.i( + "VoicemailTosMessageCreator.showDeclineVerizonTosDialog", + "showing decline ToS dialog, status=" + status); + final TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class); + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(R.string.terms_and_conditions_decline_dialog_title); + builder.setMessage(getTosDeclinedDialogMessageId()); + builder.setPositiveButton( + getTosDeclinedDialogDowngradeId(), + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Logger.get(context).logImpression(DialerImpression.Type.VOICEMAIL_VVM3_TOS_DECLINED); + VoicemailClient voicemailClient = VoicemailComponent.get(context).getVoicemailClient(); + if (voicemailClient.isVoicemailModuleEnabled()) { + voicemailClient.setVoicemailEnabled(context, status.getPhoneAccountHandle(), false); + } else { + TelephonyManagerCompat.setVisualVoicemailEnabled(telephonyManager, handle, false); + } + } + }); + + builder.setNegativeButton( + android.R.string.cancel, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + + builder.setCancelable(true); + builder.show(); + } + + private void showSetPinBeforeDeclineDialog(PhoneAccountHandle phoneAccountHandle) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setMessage(R.string.verizon_terms_and_conditions_decline_set_pin_dialog_message); + builder.setPositiveButton( + R.string.verizon_terms_and_conditions_decline_set_pin_dialog_set_pin, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Logger.get(context) + .logImpression(DialerImpression.Type.VOICEMAIL_VVM3_TOS_DECLINE_CHANGE_PIN_SHOWN); + Intent intent = new Intent(TelephonyManager.ACTION_CONFIGURE_VOICEMAIL); + intent.putExtra(TelephonyManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle); + context.startActivity(intent); + } + }); + + builder.setNegativeButton( + android.R.string.cancel, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + + builder.setCancelable(true); + builder.show(); + } + + private boolean isVvm3() { + return VisualVoicemailTypeExtensions.VVM_TYPE_VVM3.equals(status.type); + } + + private boolean useSpanish() { + return Locale.getDefault().getLanguage().equals(new Locale(ISO639_SPANISH).getLanguage()); + } + + private boolean hasAcceptedTos() { + if (isVvm3()) { + return preferences.getInt(VoicemailVersionConstants.PREF_VVM3_TOS_VERSION_ACCEPTED_KEY, 0) + >= VoicemailVersionConstants.CURRENT_VVM3_TOS_VERSION; + } else { + return preferences.getInt(VoicemailVersionConstants.PREF_DIALER_TOS_VERSION_ACCEPTED_KEY, 0) + >= VoicemailVersionConstants.CURRENT_DIALER_TOS_VERSION; + } + } + + private void recordTosAcceptance() { + if (isVvm3()) { + preferences + .edit() + .putInt( + VoicemailVersionConstants.PREF_VVM3_TOS_VERSION_ACCEPTED_KEY, + VoicemailVersionConstants.CURRENT_VVM3_TOS_VERSION) + .apply(); + } else { + preferences + .edit() + .putInt( + VoicemailVersionConstants.PREF_DIALER_TOS_VERSION_ACCEPTED_KEY, + VoicemailVersionConstants.CURRENT_DIALER_TOS_VERSION) + .apply(); + } + + PhoneAccountHandle handle = + new PhoneAccountHandle( + ComponentName.unflattenFromString(status.phoneAccountComponentName), + status.phoneAccountId); + VoicemailComponent.get(context).getVoicemailClient().onTosAccepted(context, handle); + } + + private boolean hasAcknowledgedFeatures() { + if (isVvm3()) { + return true; + } + + return preferences.getInt( + VoicemailVersionConstants.PREF_DIALER_FEATURE_VERSION_ACKNOWLEDGED_KEY, 0) + >= VoicemailVersionConstants.CURRENT_VOICEMAIL_FEATURE_VERSION; + } + + private void recordFeatureAcknowledgement() { + preferences + .edit() + .putInt( + VoicemailVersionConstants.PREF_DIALER_FEATURE_VERSION_ACKNOWLEDGED_KEY, + VoicemailVersionConstants.CURRENT_VOICEMAIL_FEATURE_VERSION) + .apply(); + } + + private boolean isLegacyVoicemailUser() { + return preferences.getInt( + VoicemailVersionConstants.PREF_DIALER_FEATURE_VERSION_ACKNOWLEDGED_KEY, 0) + == VoicemailVersionConstants.LEGACY_VOICEMAIL_FEATURE_VERSION; + } + + private void logTosCreatedImpression() { + if (isVvm3()) { + Logger.get(context).logImpression(DialerImpression.Type.VOICEMAIL_VVM3_TOS_V2_CREATED); + } else { + Logger.get(context).logImpression(DialerImpression.Type.VOICEMAIL_DIALER_TOS_CREATED); + } + } + + private void logTosDeclinedImpression() { + if (isVvm3()) { + Logger.get(context) + .logImpression(DialerImpression.Type.VOICEMAIL_VVM3_TOS_V2_DECLINE_CLICKED); + } else { + Logger.get(context).logImpression(DialerImpression.Type.VOICEMAIL_DIALER_TOS_DECLINE_CLICKED); + } + } + + private void logTosAcceptedImpression() { + if (isVvm3()) { + Logger.get(context).logImpression(DialerImpression.Type.VOICEMAIL_VVM3_TOS_V2_ACCEPTED); + } else { + Logger.get(context).logImpression(DialerImpression.Type.VOICEMAIL_DIALER_TOS_ACCEPTED); + } + } + + private CharSequence getVvm3Tos() { + String policyUrl = context.getString(R.string.verizon_terms_and_conditions_policy_url); + return useSpanish() + ? context.getString(R.string.verizon_terms_and_conditions_1_1_spanish, policyUrl) + : context.getString(R.string.verizon_terms_and_conditions_1_1_english, policyUrl); + } + + private CharSequence getVvmDialerTos() { + return context.getString(R.string.dialer_terms_and_conditions_for_verizon_1_0); + } + + private CharSequence getNewUserDialerTos() { + if (!isVoicemailTranscriptionAvailable()) { + return ""; + } + + String learnMoreText = context.getString(R.string.dialer_terms_and_conditions_learn_more); + return context.getString(R.string.dialer_terms_and_conditions_1_0, learnMoreText); + } + + private CharSequence getExistingUserDialerTos() { + if (!isVoicemailTranscriptionAvailable()) { + return ""; + } + + String learnMoreText = context.getString(R.string.dialer_terms_and_conditions_learn_more); + return context.getString(R.string.dialer_terms_and_conditions_existing_user, learnMoreText); + } + + private CharSequence getAcceptText() { + if (isVvm3()) { + return useSpanish() + ? context.getString(R.string.verizon_terms_and_conditions_accept_spanish) + : context.getString(R.string.verizon_terms_and_conditions_accept_english); + } else { + return useSpanish() + ? context.getString(R.string.dialer_terms_and_conditions_accept_spanish) + : context.getString(R.string.dialer_terms_and_conditions_accept_english); + } + } + + private CharSequence getDeclineText() { + if (isVvm3()) { + return useSpanish() + ? context.getString(R.string.verizon_terms_and_conditions_decline_spanish) + : context.getString(R.string.verizon_terms_and_conditions_decline_english); + } else { + return useSpanish() + ? context.getString(R.string.dialer_terms_and_conditions_decline_spanish) + : context.getString(R.string.dialer_terms_and_conditions_decline_english); + } + } + + private CharSequence getNewUserTosTitle() { + return isVvm3() + ? context.getString(R.string.verizon_terms_and_conditions_title) + : context.getString(R.string.dialer_terms_and_conditions_title); + } + + private CharSequence getExistingUserTosTitle() { + return isVvm3() + ? context.getString(R.string.verizon_terms_and_conditions_title) + : context.getString(R.string.dialer_terms_and_conditions_existing_user_title); + } + + private CharSequence getNewUserTosMessageText() { + SpannableString spannableTos; + if (isVvm3()) { + // For verizon the TOS consist of three pieces: google dialer TOS, Verizon TOS message and + // Verizon TOS details. + CharSequence vvm3Details = getVvm3Tos(); + CharSequence tos = + context.getString( + R.string.verizon_terms_and_conditions_message, getVvmDialerTos(), vvm3Details); + spannableTos = new SpannableString(tos); + // Set the text style for the details part of the TOS + int start = spannableTos.length() - vvm3Details.length(); + spannableTos.setSpan( + new TextAppearanceSpan(context, R.style.TosDetailsTextStyle), + start, + start + vvm3Details.length(), + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + // Add verizon policy link + String linkUrl = context.getString(R.string.verizon_terms_and_conditions_policy_url); + return addLink(spannableTos, linkUrl, linkUrl); + } else { + // The TOS for everyone else, there are no details, but change to center alignment. + CharSequence tos = + context.getString(R.string.dialer_terms_and_conditions_message, getNewUserDialerTos()); + spannableTos = new SpannableString(tos); + spannableTos.setSpan( + new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER), + 0, + tos.length(), + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + // Add 'Learn more' link for dialer TOS + String learnMore = context.getString(R.string.dialer_terms_and_conditions_learn_more); + return addLink(spannableTos, learnMore, getLearnMoreUrl()); + } + } + + private CharSequence getExistingUserTosMessageText() { + SpannableString spannableTos; + // Change to center alignment. + CharSequence tos = + context.getString(R.string.dialer_terms_and_conditions_message, getExistingUserDialerTos()); + spannableTos = new SpannableString(tos); + spannableTos.setSpan( + new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER), + 0, + tos.length(), + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + // Add 'Learn more' link for dialer TOS + String learnMore = context.getString(R.string.dialer_terms_and_conditions_learn_more); + return addLink(spannableTos, learnMore, getLearnMoreUrl()); + } + + private SpannableString addLink(SpannableString spannable, String linkText, String linkUrl) { + if (TextUtils.isEmpty(linkUrl) || TextUtils.isEmpty(linkText)) { + return spannable; + } + + int start = spannable.toString().indexOf(linkText); + if (start != -1) { + int end = start + linkText.length(); + spannable.setSpan(new URLSpan(linkUrl), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + spannable.setSpan( + new TextAppearanceSpan(context, R.style.TosLinkStyle), + start, + end, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + return spannable; + } + + private String getLearnMoreUrl() { + return ConfigProviderBindings.get(context) + .getString( + "voicemail_transcription_learn_more_url", + context.getString(R.string.dialer_terms_and_conditions_learn_more_url)); + } + + private int getTosDeclinedDialogMessageId() { + return isVvm3() + ? R.string.verizon_terms_and_conditions_decline_dialog_message + : R.string.dialer_terms_and_conditions_decline_dialog_message; + } + + private int getTosDeclinedDialogDowngradeId() { + return isVvm3() + ? R.string.verizon_terms_and_conditions_decline_dialog_downgrade + : R.string.dialer_terms_and_conditions_decline_dialog_downgrade; + } +} |