diff options
13 files changed, 418 insertions, 207 deletions
diff --git a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java index 937f0419b..b88a959ed 100644 --- a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java +++ b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java @@ -94,6 +94,49 @@ public class PhoneCallDetailsHelper calendar = Calendar.getInstance(); } + static boolean shouldShowVoicemailDonationPromo( + Context context, PhoneAccountHandle accountHandle) { + VoicemailClient client = VoicemailComponent.get(context).getVoicemailClient(); + return client.isVoicemailDonationAvailable(context, accountHandle) + && !hasSeenVoicemailDonationPromo(context); + } + + static boolean hasSeenVoicemailDonationPromo(Context context) { + return StorageComponent.get(context.getApplicationContext()) + .unencryptedSharedPrefs() + .getBoolean(PREF_VOICEMAIL_DONATION_PROMO_SHOWN_KEY, false); + } + + 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(); + } + + /** Returns true if primary name is empty or the data is from Cequint Caller ID. */ + private static boolean shouldShowLocation(PhoneCallDetails details) { + if (TextUtils.isEmpty(details.geocode)) { + return false; + } + // For caller ID provided by Cequint we want to show the geo location. + if (details.sourceType == ContactSource.Type.SOURCE_TYPE_CEQUINT_CALLER_ID) { + return true; + } + // Don't bother showing geo location for contacts. + if (!TextUtils.isEmpty(details.namePrimary)) { + return false; + } + return true; + } + /** Fills the call details views with content. */ public void setPhoneCallDetails(PhoneCallDetailsViews views, PhoneCallDetails details) { // Display up to a given number of icons. @@ -250,9 +293,10 @@ public class PhoneCallDetailsHelper return true; } - // Also show the rating option if voicemail transcription is available (but not enabled) + // Also show the rating option if voicemail donation is available (but not enabled) // and the donation promo has not yet been shown. - if (client.isVoicemailDonationAvailable(context) && !hasSeenVoicemailDonationPromo(context)) { + if (client.isVoicemailDonationAvailable(context, account) + && !hasSeenVoicemailDonationPromo(context)) { return true; } @@ -263,7 +307,7 @@ public class PhoneCallDetailsHelper TranscriptionRatingValue ratingValue, PhoneCallDetails details, View ratingView) { LogUtil.enterBlock("PhoneCallDetailsHelper.recordTranscriptionRating"); - if (shouldShowVoicemailDonationPromo(context)) { + if (shouldShowVoicemailDonationPromo(context, details.accountHandle)) { showVoicemailDonationPromo(ratingValue, details, ratingView); } else { TranscriptionRatingHelper.sendRating( @@ -275,19 +319,6 @@ public class PhoneCallDetailsHelper } } - 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); @@ -360,20 +391,6 @@ public class PhoneCallDetailsHelper } } - 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() { return new ContentWithLearnMoreSpanner(context) .create( @@ -462,22 +479,6 @@ public class PhoneCallDetailsHelper return numberFormattedLabel; } - /** Returns true if primary name is empty or the data is from Cequint Caller ID. */ - private static boolean shouldShowLocation(PhoneCallDetails details) { - if (TextUtils.isEmpty(details.geocode)) { - return false; - } - // For caller ID provided by Cequint we want to show the geo location. - if (details.sourceType == ContactSource.Type.SOURCE_TYPE_CEQUINT_CALLER_ID) { - return true; - } - // Don't bother showing geo location for contacts. - if (!TextUtils.isEmpty(details.namePrimary)) { - return false; - } - return true; - } - public void setPhoneTypeLabelForTest(CharSequence phoneTypeLabel) { this.phoneTypeLabelForTest = phoneTypeLabel; } diff --git a/java/com/android/dialer/logging/dialer_impression.proto b/java/com/android/dialer/logging/dialer_impression.proto index c657768df..96ca9c6be 100644 --- a/java/com/android/dialer/logging/dialer_impression.proto +++ b/java/com/android/dialer/logging/dialer_impression.proto @@ -12,7 +12,7 @@ message DialerImpression { // Event enums to be used for Impression Logging in Dialer. // It's perfectly acceptable for this enum to be large // Values should be from 1000 to 100000. - // Next Tag: 1361 + // Next Tag: 1366 enum Type { UNKNOWN_AOSP_EVENT_TYPE = 1000; @@ -372,7 +372,7 @@ message DialerImpression { VVM_SETTINGS_VIEWED = 1148; VVM_CHANGE_PIN_CLICKED = 1149; VVM_CHANGE_PIN_COMPLETED = 1150; - VVM_CHANGE_RINGTONE_CLICKED = 1151; + VVM_CHANGE_RINGTONE_CLICKED = 1151 [deprecated = true]; VVM_CHANGE_VIBRATION_CLICKED = 1152; VVM_USER_ENABLED_IN_SETTINGS = 1153; VVM_USER_DISABLED_IN_SETTINGS = 1154; @@ -594,14 +594,12 @@ message DialerImpression { ASSISTED_DIALING_FEATURE_DISABLED_BY_USER = 1292; // User reports a same prefix call as spam from call history - REPORT_SAME_PREFIX_CALL_AS_SPAM_VIA_CALL_HISTORY = - 1290 + REPORT_SAME_PREFIX_CALL_AS_SPAM_VIA_CALL_HISTORY = 1290 ; // User reports a same prefix call as not spam from call history - REPORT_SAME_PREFIX_CALL_AS_NOT_SPAM_VIA_CALL_HISTORY = - 1291 + REPORT_SAME_PREFIX_CALL_AS_NOT_SPAM_VIA_CALL_HISTORY = 1291 ; @@ -715,5 +713,11 @@ message DialerImpression { SPAM_BLOCKING_DISABLED_THROUGH_SETTING = 1359; // Failure happened while modifying spam blocking setting. SPAM_BLOCKING_MODIFY_FAILURE_THROUGH_SETTING = 1360; + + VVM_NOTIFICATIONS_SETTING_CLICKED = 1361; + VVM_USER_TURNED_TRANSCRIBE_ON_FROM_SETTINGS = 1362; + VVM_USER_TURNED_TRANSCRIBE_OFF_FROM_SETTINGS = 1363; + VVM_USER_TURNED_DONATION_ON_FROM_SETTINGS = 1364; + VVM_USER_TURNED_DONATION_OFF_FROM_SETTINGS = 1365; } } diff --git a/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java b/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java index 5ae26f5f7..b7db28e09 100644 --- a/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java +++ b/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java @@ -51,8 +51,6 @@ import com.google.common.base.Optional; public class VoicemailSettingsFragment extends PreferenceFragment implements Preference.OnPreferenceChangeListener, ActivationStateListener { - private static final String TAG = "VmSettingsActivity"; - // Extras copied from com.android.phone.settings.VoicemailSettingsActivity, // it does not recognize EXTRA_PHONE_ACCOUNT_HANDLE in O. @VisibleForTesting @@ -63,21 +61,26 @@ public class VoicemailSettingsFragment extends PreferenceFragment static final String SUB_LABEL_EXTRA = "com.android.phone.settings.SubscriptionInfoHelper.SubscriptionLabel"; + private static final String TAG = "VmSettingsActivity"; @Nullable private PhoneAccountHandle phoneAccountHandle; private VoicemailClient voicemailClient; + // Settings that are independent of the carrier configurations private Preference voicemailNotificationPreference; - private SwitchPreference voicemailVisualVoicemail; - private SwitchPreference autoArchiveSwitchPreference; - private SwitchPreference donateVoicemailSwitchPreference; + private PreferenceScreen advancedSettingsPreference; + + // Settings that are supported by dialer only if the carrier configurations are valid. + private SwitchPreference visualVoicemailPreference; + private SwitchPreference voicemailAutoArchivePreference; + private SwitchPreference transcribeVoicemailPreference; + // Voicemail transcription analysis toggle + private SwitchPreference donateTranscribedVoicemailPreference; private Preference voicemailChangePinPreference; - private PreferenceScreen advancedSettings; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); - phoneAccountHandle = Assert.isNotNull(getArguments().getParcelable(VoicemailClient.PARAM_PHONE_ACCOUNT_HANDLE)); voicemailClient = VoicemailComponent.get(getContext()).getVoicemailClient(); @@ -95,92 +98,177 @@ public class VoicemailSettingsFragment extends PreferenceFragment addPreferencesFromResource(R.xml.voicemail_settings); - PreferenceScreen prefSet = getPreferenceScreen(); + initializePreferences(); - voicemailNotificationPreference = - findPreference(getString(R.string.voicemail_notifications_key)); - voicemailNotificationPreference.setIntent(getNotificationSettingsIntent()); + setupVisualVoicemailPreferences(); - voicemailNotificationPreference.setOnPreferenceClickListener( - new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - Logger.get(getContext()) - .logImpression(DialerImpression.Type.VVM_CHANGE_RINGTONE_CLICKED); - // Let the preference handle the click. - return false; - } - }); + setupNotificationsPreference(); + setupAdvancedSettingsPreference(); + } - voicemailVisualVoicemail = - (SwitchPreference) findPreference(getString(R.string.voicemail_visual_voicemail_key)); + private void setupVisualVoicemailPreferences() { + if (!voicemailClient.hasCarrierSupport(getContext(), phoneAccountHandle)) { + removeAllVisualVoicemailPreferences(); + return; + } - autoArchiveSwitchPreference = - (SwitchPreference) - findPreference(getString(R.string.voicemail_visual_voicemail_archive_key)); + setupVisualVoicemailPreference(); - donateVoicemailSwitchPreference = - (SwitchPreference) - findPreference(getString(R.string.voicemail_visual_voicemail_donation_key)); + setupVisualVoicemailFeaturePreferences(); + setupVoicemailChangePinPreference(); + } + + private void setupVisualVoicemailFeaturePreferences() { + if (!voicemailClient.isVoicemailEnabled(getContext(), phoneAccountHandle) + || !voicemailClient.isActivated(getContext(), phoneAccountHandle)) { + removeAllTranscriptionPreferences(); + getPreferenceScreen().removePreference(voicemailAutoArchivePreference); + return; + } + setupAutoArchivePreference(); + updateTranscriptionPreferences(); + } + + private void updateTranscriptionPreferences() { if (!VoicemailComponent.get(getContext()) .getVoicemailClient() - .isVoicemailArchiveAvailable(getContext())) { - getPreferenceScreen().removePreference(autoArchiveSwitchPreference); + .isVoicemailTranscriptionAvailable(getContext(), phoneAccountHandle)) { + removeAllTranscriptionPreferences(); + return; + } else { + showTranscriptionEnabledPreference(); + updateTranscriptionDonationPreference(); } + } + private void showTranscriptionEnabledPreference() { + transcribeVoicemailPreference.setOnPreferenceChangeListener(this); + transcribeVoicemailPreference.setChecked( + voicemailClient.isVoicemailTranscriptionEnabled(getContext(), phoneAccountHandle)); + transcribeVoicemailPreference.setSummary( + R.string.voicemail_transcription_preference_summary_info); + transcribeVoicemailPreference.setEnabled(true); + getPreferenceScreen().addPreference(transcribeVoicemailPreference); + } + + private void updateTranscriptionDonationPreference() { if (!VoicemailComponent.get(getContext()) .getVoicemailClient() - .isVoicemailDonationAvailable(getContext())) { - getPreferenceScreen().removePreference(donateVoicemailSwitchPreference); + .isVoicemailDonationAvailable(getContext(), phoneAccountHandle)) { + getPreferenceScreen().removePreference(donateTranscribedVoicemailPreference); + } else { + showTranscriptionDonationEnabledPreferences(); } + } - voicemailChangePinPreference = findPreference(getString(R.string.voicemail_change_pin_key)); - - if (voicemailClient.hasCarrierSupport(getContext(), phoneAccountHandle)) { - Assert.isNotNull(phoneAccountHandle); - Intent changePinIntent = - new Intent(new Intent(getContext(), VoicemailChangePinActivity.class)); - changePinIntent.putExtra(VoicemailClient.PARAM_PHONE_ACCOUNT_HANDLE, phoneAccountHandle); - - voicemailChangePinPreference.setIntent(changePinIntent); - voicemailChangePinPreference.setOnPreferenceClickListener( - new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - Logger.get(getContext()).logImpression(DialerImpression.Type.VVM_CHANGE_PIN_CLICKED); - // Let the preference handle the click. - return false; - } - }); - if (VoicemailChangePinActivity.isPinScrambled(getContext(), phoneAccountHandle)) { - voicemailChangePinPreference.setTitle(R.string.voicemail_set_pin_preference_title); - } else { - voicemailChangePinPreference.setTitle(R.string.voicemail_change_pin_preference_title); - } - updateChangePin(); + private void showTranscriptionDonationEnabledPreferences() { + donateTranscribedVoicemailPreference.setOnPreferenceChangeListener(this); + donateTranscribedVoicemailPreference.setChecked( + voicemailClient.isVoicemailDonationEnabled(getContext(), phoneAccountHandle)); + donateTranscribedVoicemailPreference.setSummary( + R.string.voicemail_donate_preference_summary_info); + donateTranscribedVoicemailPreference.setEnabled(true); + getPreferenceScreen().addPreference(donateTranscribedVoicemailPreference); + } - voicemailVisualVoicemail.setOnPreferenceChangeListener(this); - voicemailVisualVoicemail.setChecked( - voicemailClient.isVoicemailEnabled(getContext(), phoneAccountHandle)); + private void removeAllTranscriptionPreferences() { + getPreferenceScreen().removePreference(transcribeVoicemailPreference); + getPreferenceScreen().removePreference(donateTranscribedVoicemailPreference); + } - autoArchiveSwitchPreference.setOnPreferenceChangeListener(this); - autoArchiveSwitchPreference.setChecked( + private void setupAutoArchivePreference() { + if (!VoicemailComponent.get(getContext()) + .getVoicemailClient() + .isVoicemailArchiveAvailable(getContext())) { + getPreferenceScreen().removePreference(voicemailAutoArchivePreference); + } else { + voicemailAutoArchivePreference.setOnPreferenceChangeListener(this); + voicemailAutoArchivePreference.setChecked( voicemailClient.isVoicemailArchiveEnabled(getContext(), phoneAccountHandle)); + } + } - donateVoicemailSwitchPreference.setOnPreferenceChangeListener(this); - donateVoicemailSwitchPreference.setChecked( - voicemailClient.isVoicemailDonationEnabled(getContext(), phoneAccountHandle)); - updateDonateVoicemail(); + private void setupVisualVoicemailPreference() { + visualVoicemailPreference.setOnPreferenceChangeListener(this); + visualVoicemailPreference.setChecked( + voicemailClient.isVoicemailEnabled(getContext(), phoneAccountHandle)); + } + + private void initializePreferences() { + voicemailNotificationPreference = + findPreference(getString(R.string.voicemail_notifications_key)); + + advancedSettingsPreference = + (PreferenceScreen) findPreference(getString(R.string.voicemail_advanced_settings_key)); + + visualVoicemailPreference = + (SwitchPreference) findPreference(getString(R.string.voicemail_visual_voicemail_key)); + + voicemailAutoArchivePreference = + (SwitchPreference) + findPreference(getString(R.string.voicemail_visual_voicemail_archive_key)); + + transcribeVoicemailPreference = + (SwitchPreference) + findPreference(getString(R.string.voicemail_visual_voicemail_transcription_key)); + + donateTranscribedVoicemailPreference = + (SwitchPreference) + findPreference(getString(R.string.voicemail_visual_voicemail_donation_key)); + + voicemailChangePinPreference = findPreference(getString(R.string.voicemail_change_pin_key)); + } + + /** Removes vvm settings since the carrier setup is not supported by Dialer */ + private void removeAllVisualVoicemailPreferences() { + PreferenceScreen prefSet = getPreferenceScreen(); + prefSet.removePreference(visualVoicemailPreference); + prefSet.removePreference(voicemailAutoArchivePreference); + prefSet.removePreference(transcribeVoicemailPreference); + prefSet.removePreference(donateTranscribedVoicemailPreference); + prefSet.removePreference(voicemailChangePinPreference); + } + + private void setupVoicemailChangePinPreference() { + Intent changePinIntent = new Intent(new Intent(getContext(), VoicemailChangePinActivity.class)); + changePinIntent.putExtra(VoicemailClient.PARAM_PHONE_ACCOUNT_HANDLE, phoneAccountHandle); + + voicemailChangePinPreference.setIntent(changePinIntent); + voicemailChangePinPreference.setOnPreferenceClickListener( + new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + Logger.get(getContext()).logImpression(DialerImpression.Type.VVM_CHANGE_PIN_CLICKED); + // Let the preference handle the click. + return false; + } + }); + if (VoicemailChangePinActivity.isPinScrambled(getContext(), phoneAccountHandle)) { + voicemailChangePinPreference.setTitle(R.string.voicemail_set_pin_preference_title); } else { - prefSet.removePreference(voicemailVisualVoicemail); - prefSet.removePreference(autoArchiveSwitchPreference); - prefSet.removePreference(donateVoicemailSwitchPreference); - prefSet.removePreference(voicemailChangePinPreference); + voicemailChangePinPreference.setTitle(R.string.voicemail_change_pin_preference_title); } + updateChangePinPreference(); + } - advancedSettings = - (PreferenceScreen) findPreference(getString(R.string.voicemail_advanced_settings_key)); + private void setupNotificationsPreference() { + + voicemailNotificationPreference.setIntent(getNotificationSettingsIntent()); + + voicemailNotificationPreference.setOnPreferenceClickListener( + new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + Logger.get(getContext()) + .logImpression(DialerImpression.Type.VVM_NOTIFICATIONS_SETTING_CLICKED); + // Let the preference handle the click. + return false; + } + }); + } + + private void setupAdvancedSettingsPreference() { Intent advancedSettingsIntent = new Intent(TelephonyManager.ACTION_CONFIGURE_VOICEMAIL); advancedSettingsIntent.putExtra(TelephonyManager.EXTRA_HIDE_PUBLIC_SETTINGS, true); advancedSettingsIntent.putExtra( @@ -198,8 +286,9 @@ public class VoicemailSettingsFragment extends PreferenceFragment } } - advancedSettings.setIntent(advancedSettingsIntent); - voicemailChangePinPreference.setOnPreferenceClickListener( + advancedSettingsPreference.setIntent(advancedSettingsIntent); + + advancedSettingsPreference.setOnPreferenceClickListener( new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { @@ -226,7 +315,7 @@ public class VoicemailSettingsFragment extends PreferenceFragment @Override public boolean onPreferenceChange(Preference preference, Object objValue) { LogUtil.d(TAG, "onPreferenceChange: \"" + preference + "\" changed to \"" + objValue + "\""); - if (preference.getKey().equals(voicemailVisualVoicemail.getKey())) { + if (preference.getKey().equals(visualVoicemailPreference.getKey())) { boolean isEnabled = (boolean) objValue; if (!isEnabled) { showDisableConfirmationDialog(); @@ -235,12 +324,17 @@ public class VoicemailSettingsFragment extends PreferenceFragment } else { updateVoicemailEnabled(true); } - } else if (preference.getKey().equals(autoArchiveSwitchPreference.getKey())) { + } else if (preference.getKey().equals(voicemailAutoArchivePreference.getKey())) { logArchiveToggle((boolean) objValue); voicemailClient.setVoicemailArchiveEnabled( getContext(), phoneAccountHandle, (boolean) objValue); - } else if (preference.getKey().equals(donateVoicemailSwitchPreference.getKey())) { - logArchiveToggle((boolean) objValue); + } else if (preference.getKey().equals(transcribeVoicemailPreference.getKey())) { + logTranscribeToggle((boolean) objValue); + voicemailClient.setVoicemailTranscriptionEnabled( + getContext(), phoneAccountHandle, (boolean) objValue); + updateTranscriptionDonationPreference(); + } else if (preference.getKey().equals(donateTranscribedVoicemailPreference.getKey())) { + logDonationToggle((boolean) objValue); voicemailClient.setVoicemailDonationEnabled( getContext(), phoneAccountHandle, (boolean) objValue); } @@ -251,19 +345,19 @@ public class VoicemailSettingsFragment extends PreferenceFragment private void updateVoicemailEnabled(boolean isEnabled) { voicemailClient.setVoicemailEnabled(getContext(), phoneAccountHandle, isEnabled); - voicemailVisualVoicemail.setChecked(isEnabled); + visualVoicemailPreference.setChecked(isEnabled); if (isEnabled) { Logger.get(getContext()).logImpression(DialerImpression.Type.VVM_USER_ENABLED_IN_SETTINGS); } else { Logger.get(getContext()).logImpression(DialerImpression.Type.VVM_USER_DISABLED_IN_SETTINGS); } - - updateChangePin(); - updateDonateVoicemail(); + updateVoicemailSummaryMessage(); + updateTranscriptionPreferences(); + updateChangePinPreference(); } - private void updateChangePin() { + private void updateChangePinPreference() { if (!voicemailClient.isVoicemailEnabled(getContext(), phoneAccountHandle)) { voicemailChangePinPreference.setSummary( R.string.voicemail_change_pin_preference_summary_disable); @@ -278,36 +372,55 @@ public class VoicemailSettingsFragment extends PreferenceFragment } } - private void updateDonateVoicemail() { - if (!voicemailClient.isVoicemailEnabled(getContext(), phoneAccountHandle)) { - donateVoicemailSwitchPreference.setSummary( - R.string.voicemail_donate_preference_summary_disable); - donateVoicemailSwitchPreference.setEnabled(false); - } else if (!voicemailClient.isActivated(getContext(), phoneAccountHandle)) { - donateVoicemailSwitchPreference.setSummary( - R.string.voicemail_donate_preference_summary_not_activated); - donateVoicemailSwitchPreference.setEnabled(false); + private void logArchiveToggle(boolean userTurnedOn) { + if (userTurnedOn) { + Logger.get(getContext()) + .logImpression(DialerImpression.Type.VVM_USER_TURNED_ARCHIVE_ON_FROM_SETTINGS); } else { - donateVoicemailSwitchPreference.setSummary(R.string.voicemail_donate_preference_summary_info); - donateVoicemailSwitchPreference.setEnabled(true); + Logger.get(getContext()) + .logImpression(DialerImpression.Type.VVM_USER_TURNED_ARCHIVE_OFF_FROM_SETTINGS); } } - private void logArchiveToggle(boolean userTurnedOn) { + private void logTranscribeToggle(boolean userTurnedOn) { if (userTurnedOn) { Logger.get(getContext()) - .logImpression(DialerImpression.Type.VVM_USER_TURNED_ARCHIVE_ON_FROM_SETTINGS); + .logImpression(DialerImpression.Type.VVM_USER_TURNED_TRANSCRIBE_ON_FROM_SETTINGS); } else { Logger.get(getContext()) - .logImpression(DialerImpression.Type.VVM_USER_TURNED_ARCHIVE_OFF_FROM_SETTINGS); + .logImpression(DialerImpression.Type.VVM_USER_TURNED_TRANSCRIBE_OFF_FROM_SETTINGS); + } + } + + private void logDonationToggle(boolean userTurnedOn) { + if (userTurnedOn) { + Logger.get(getContext()) + .logImpression(DialerImpression.Type.VVM_USER_TURNED_TRANSCRIBE_ON_FROM_SETTINGS); + } else { + Logger.get(getContext()) + .logImpression(DialerImpression.Type.VVM_USER_TURNED_TRANSCRIBE_OFF_FROM_SETTINGS); } } @Override public void onActivationStateChanged(PhoneAccountHandle phoneAccountHandle, boolean isActivated) { if (this.phoneAccountHandle.equals(phoneAccountHandle)) { - updateChangePin(); - updateDonateVoicemail(); + updateVoicemailSummaryMessage(); + updateTranscriptionPreferences(); + updateChangePinPreference(); + } + } + + /** + * Shows the activating message while visual voicemail is being activated. This is useful, since + * some toggles do not show up, until voicemail is activated e.g transcription and rating. + */ + private void updateVoicemailSummaryMessage() { + if (voicemailClient.isVoicemailEnabled(getContext(), phoneAccountHandle) + && !voicemailClient.isActivated(getContext(), phoneAccountHandle)) { + visualVoicemailPreference.setSummary(R.string.voicemail_activating_summary_info); + } else { + visualVoicemailPreference.setSummary(""); } } diff --git a/java/com/android/dialer/voicemail/settings/res/values/strings.xml b/java/com/android/dialer/voicemail/settings/res/values/strings.xml index 1d2c104a3..db6309800 100644 --- a/java/com/android/dialer/voicemail/settings/res/values/strings.xml +++ b/java/com/android/dialer/voicemail/settings/res/values/strings.xml @@ -102,19 +102,24 @@ <!-- The error message to show if the server reported an error while attempting to change the voicemail PIN --> <string name="change_pin_system_error">Unable to set PIN</string> + <string name="voicemail_visual_voicemail_transcription_key" translatable="false">transcribe_voicemails</string> <string name="voicemail_visual_voicemail_donation_key" translatable="false">donate_voicemails</string> + <!-- Title for visual voicemail setting that enables users voicemails to be transcribed by Google. + [CHAR LIMIT=40] --> + <string name="voicemail_visual_voicemail_transcription_switch_title"> + Voicemail transcription + </string> <!-- Title for visual voicemail setting that enables user to donate their voicemails for analysis. [CHAR LIMIT=40] --> <string name="voicemail_visual_voicemail_donation_switch_title"> Voicemail transcription analysis </string> - <!-- Summary information for visual voicemail donation setting when visual voicemail is not enabled - [CHAR LIMIT=NONE] --> - <string name="voicemail_donate_preference_summary_disable">Visual voicemail must be enabled to donate voicemails</string> - <!-- Summary information for visual voicemail donation setting when visual voicemail is not activated - [CHAR LIMIT=NONE] --> - <string name="voicemail_donate_preference_summary_not_activated">Visual voicemail is not activated yet, please try again later</string> + <!-- Summary information while visual voicemail is activating after turning it on [CHAR LIMIT=NONE] --> + <string name="voicemail_activating_summary_info">Activating voicemail</string> + + <!-- Summary information for visual voicemail transcription setting [CHAR LIMIT=NONE] --> + <string name="voicemail_transcription_preference_summary_info">Get transcripts of your voicemail using Google\'s transcription service</string> <!-- Summary information for visual voicemail donation setting [CHAR LIMIT=NONE] --> <string name="voicemail_donate_preference_summary_info">Let Google review your voicemail messages to improve transcription accuracy</string> @@ -125,7 +130,7 @@ <!-- The label for the confirm-disable-voicemail button [CHAR LIMIT=16] --> <string name="confirm_disable_voicemail_accept_dialog_label">TURN OFF</string> - <string translatable="false" name="transcription_learn_more_url">https://support.google.com/phoneapp/answer/2811844?hl=en%26ref_topic=7539039</string> - <string translatable="false" name="donation_learn_more_url">https://support.google.com/phoneapp/answer/2811844#voicemail_transcript</string> + <string name="transcription_learn_more_url" translatable="false">https://support.google.com/phoneapp/answer/2811844?hl=en%26ref_topic=7539039</string> + <string name="donation_learn_more_url" translatable="false">https://support.google.com/phoneapp/answer/2811844#voicemail_transcript</string> </resources> diff --git a/java/com/android/dialer/voicemail/settings/res/xml/voicemail_settings.xml b/java/com/android/dialer/voicemail/settings/res/xml/voicemail_settings.xml index e558985a4..175a12740 100644 --- a/java/com/android/dialer/voicemail/settings/res/xml/voicemail_settings.xml +++ b/java/com/android/dialer/voicemail/settings/res/xml/voicemail_settings.xml @@ -31,8 +31,12 @@ android:title="@string/voicemail_visual_voicemail_auto_archive_switch_title"/>" <SwitchPreference + android:key="@string/voicemail_visual_voicemail_transcription_key" + android:dependency="@string/voicemail_visual_voicemail_key" + android:title="@string/voicemail_visual_voicemail_transcription_switch_title"/>" + <SwitchPreference android:key="@string/voicemail_visual_voicemail_donation_key" - android:dependency="@string/voicemail_visual_voicemail_key" + android:dependency="@string/voicemail_visual_voicemail_transcription_key" android:title="@string/voicemail_visual_voicemail_donation_switch_title"/>" <Preference diff --git a/java/com/android/incallui/rtt/impl/RttChatFragment.java b/java/com/android/incallui/rtt/impl/RttChatFragment.java index dd55ccff7..90bf199b2 100644 --- a/java/com/android/incallui/rtt/impl/RttChatFragment.java +++ b/java/com/android/incallui/rtt/impl/RttChatFragment.java @@ -206,7 +206,7 @@ public class RttChatFragment extends Fragment @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if (actionId == EditorInfo.IME_ACTION_DONE) { + if (actionId == EditorInfo.IME_ACTION_SEND) { submitButton.performClick(); return true; } diff --git a/java/com/android/incallui/rtt/impl/res/layout/frag_rtt_chat.xml b/java/com/android/incallui/rtt/impl/res/layout/frag_rtt_chat.xml index 753117904..34a99544a 100644 --- a/java/com/android/incallui/rtt/impl/res/layout/frag_rtt_chat.xml +++ b/java/com/android/incallui/rtt/impl/res/layout/frag_rtt_chat.xml @@ -48,9 +48,8 @@ android:paddingEnd="16dp" android:background="@drawable/input_bubble_background" android:hint="@string/rtt_input_hint" - android:imeOptions="actionDone" - android:inputType="textMultiLine|text" - android:maxLines="4" + android:imeOptions="actionSend" + android:inputType="text" android:minHeight="53dp" android:textColor="#DD000000" android:textColorHint="#757575" diff --git a/java/com/android/incallui/rtt/protocol/Constants.java b/java/com/android/incallui/rtt/protocol/Constants.java index 5806bbada..1c13b07b2 100644 --- a/java/com/android/incallui/rtt/protocol/Constants.java +++ b/java/com/android/incallui/rtt/protocol/Constants.java @@ -20,5 +20,5 @@ package com.android.incallui.rtt.protocol; public interface Constants { /** String used to break bubble, which means one RTT message is complete. */ - String BUBBLE_BREAKER = "\n\n"; + String BUBBLE_BREAKER = "\n"; } diff --git a/java/com/android/voicemail/VoicemailClient.java b/java/com/android/voicemail/VoicemailClient.java index 1ce7ef75a..5b382f1dc 100644 --- a/java/com/android/voicemail/VoicemailClient.java +++ b/java/com/android/voicemail/VoicemailClient.java @@ -30,35 +30,25 @@ import java.util.List; public interface VoicemailClient { /** - * Whether the voicemail module is enabled (OS has support and not disabled by flags, etc.). This - * does not mean the carrier has support or user has enabled the feature. - */ - boolean isVoicemailModuleEnabled(); - - /** * Broadcast to tell the client to upload local database changes to the server. Since the dialer * UI and the client are in the same package, the {@link * android.content.Intent#ACTION_PROVIDER_CHANGED} will always be a self-change even if the UI is * external to the client. */ String ACTION_UPLOAD = "com.android.voicemail.VoicemailClient.ACTION_UPLOAD"; - /** Common key for passing {@link PhoneAccountHandle} in bundles. */ String PARAM_PHONE_ACCOUNT_HANDLE = "phone_account_handle"; - /** * Broadcast from the client to inform the app to show a legacy voicemail notification. This * broadcast is same as {@link TelephonyManager#ACTION_SHOW_VOICEMAIL_NOTIFICATION}. */ String ACTION_SHOW_LEGACY_VOICEMAIL = "com.android.voicemail.VoicemailClient.ACTION_SHOW_LEGACY_VOICEMAIL"; - /** * Boolean extra send with {@link #ACTION_SHOW_LEGACY_VOICEMAIL}, indicating that the notification * is sent by legacy mode and should not be suppressed even when VVM is activated */ String EXTRA_IS_LEGACY_MODE = "is_legacy_mode"; - /** * Secret code to launch the voicemail config activity intended for OEMs and Carriers. {@code * *#*#VVMCONFIG#*#*} @@ -66,6 +56,12 @@ public interface VoicemailClient { String VOICEMAIL_SECRET_CODE = "886266344"; /** + * Whether the voicemail module is enabled (OS has support and not disabled by flags, etc.). This + * does not mean the carrier has support or user has enabled the feature. + */ + boolean isVoicemailModuleEnabled(); + + /** * Whether visual voicemail is supported by the carrier for the {@code phoneAccountHandle}. This * is purely based on the MCCMNC, and a single account might still be disabled by the carrier. */ @@ -123,17 +119,23 @@ public interface VoicemailClient { /** * @return if the voicemail transcription feature is available on the current device. This depends - * on whether the server side flag is turned on for the feature, and if the OS meets the - * requirement for this feature. + * on whether the server side flag is turned on for the feature, visual voicemail is activated + * and enabled and if the OS meets the requirement for this feature. */ - boolean isVoicemailTranscriptionAvailable(Context context); + boolean isVoicemailTranscriptionAvailable(Context context, PhoneAccountHandle account); + + /** @return if the voicemail transcription setting has been enabled by the user. */ + boolean isVoicemailTranscriptionEnabled(Context context, PhoneAccountHandle account); /** @return if the voicemail donation feature is available. */ - boolean isVoicemailDonationAvailable(Context context); + boolean isVoicemailDonationAvailable(Context context, PhoneAccountHandle account); /** @return if the voicemail donation setting has been enabled by the user. */ boolean isVoicemailDonationEnabled(Context context, PhoneAccountHandle account); + void setVoicemailTranscriptionEnabled( + Context context, PhoneAccountHandle phoneAccountHandle, boolean enabled); + void setVoicemailDonationEnabled( Context context, PhoneAccountHandle phoneAccountHandle, boolean enabled); @@ -162,12 +164,6 @@ public interface VoicemailClient { @MainThread void onShutdown(@NonNull Context context); - /** Listener for changes in {@link #isActivated(Context, PhoneAccountHandle)} */ - interface ActivationStateListener { - @MainThread - void onActivationStateChanged(PhoneAccountHandle phoneAccountHandle, boolean isActivated); - } - @MainThread void addActivationStateListener(ActivationStateListener listener); @@ -187,4 +183,10 @@ public interface VoicemailClient { */ @Nullable String getCarrierConfigString(Context context, PhoneAccountHandle phoneAccountHandle, String key); + + /** Listener for changes in {@link #isActivated(Context, PhoneAccountHandle)} */ + interface ActivationStateListener { + @MainThread + void onActivationStateChanged(PhoneAccountHandle phoneAccountHandle, boolean isActivated); + } } diff --git a/java/com/android/voicemail/impl/VoicemailClientImpl.java b/java/com/android/voicemail/impl/VoicemailClientImpl.java index 993594eb3..b0881c9a3 100644 --- a/java/com/android/voicemail/impl/VoicemailClientImpl.java +++ b/java/com/android/voicemail/impl/VoicemailClientImpl.java @@ -123,13 +123,28 @@ public class VoicemailClientImpl implements VoicemailClient { } @Override - public boolean isVoicemailTranscriptionAvailable(Context context) { + public boolean isVoicemailTranscriptionAvailable( + Context context, PhoneAccountHandle phoneAccountHandle) { if (!BuildCompat.isAtLeastO()) { LogUtil.i( "VoicemailClientImpl.isVoicemailTranscriptionAvailable", "not running on O or later"); return false; } + if (!isVoicemailEnabled(context, phoneAccountHandle)) { + LogUtil.i( + "VoicemailClientImpl.isVoicemailTranscriptionAvailable", + "visual voicemail is not enabled"); + return false; + } + + if (!isActivated(context, phoneAccountHandle)) { + LogUtil.i( + "VoicemailClientImpl.isVoicemailTranscriptionAvailable", + "visual voicemail is not activated"); + return false; + } + TranscriptionConfigProvider provider = new TranscriptionConfigProvider(context); if (!provider.isVoicemailTranscriptionAvailable()) { LogUtil.i( @@ -141,12 +156,24 @@ public class VoicemailClientImpl implements VoicemailClient { } @Override - public boolean isVoicemailDonationAvailable(Context context) { - if (!isVoicemailTranscriptionAvailable(context)) { + public boolean isVoicemailTranscriptionEnabled(Context context, PhoneAccountHandle account) { + return isVoicemailTranscriptionAvailable(context, account) + && VisualVoicemailSettingsUtil.isVoicemailTranscriptionEnabled(context, account); + } + + @Override + public boolean isVoicemailDonationAvailable( + Context context, PhoneAccountHandle phoneAccountHandle) { + if (!isVoicemailTranscriptionAvailable(context, phoneAccountHandle)) { LogUtil.i("VoicemailClientImpl.isVoicemailDonationAvailable", "transcription not available"); return false; } + if (!isVoicemailTranscriptionEnabled(context, phoneAccountHandle)) { + LogUtil.i("VoicemailClientImpl.isVoicemailDonationAvailable", "transcription not enabled"); + return false; + } + TranscriptionConfigProvider provider = new TranscriptionConfigProvider(context); if (!provider.isVoicemailDonationAvailable()) { LogUtil.i("VoicemailClientImpl.isVoicemailDonationAvailable", "feature disabled by config"); @@ -158,13 +185,34 @@ public class VoicemailClientImpl implements VoicemailClient { @Override public boolean isVoicemailDonationEnabled(Context context, PhoneAccountHandle account) { - return isVoicemailTranscriptionAvailable(context) + return isVoicemailTranscriptionEnabled(context, account) + && isVoicemailDonationAvailable(context, account) && VisualVoicemailSettingsUtil.isVoicemailDonationEnabled(context, account); } @Override + public void setVoicemailTranscriptionEnabled( + Context context, PhoneAccountHandle phoneAccountHandle, boolean enabled) { + Assert.checkArgument( + isVoicemailTranscriptionAvailable(context, phoneAccountHandle), + "transcription must be available before enabling/disabling it"); + VisualVoicemailSettingsUtil.setVoicemailTranscriptionEnabled( + context, phoneAccountHandle, enabled); + } + + @Override public void setVoicemailDonationEnabled( Context context, PhoneAccountHandle phoneAccountHandle, boolean enabled) { + if (enabled) { + Assert.checkArgument( + isVoicemailTranscriptionAvailable(context, phoneAccountHandle) + && isVoicemailTranscriptionEnabled(context, phoneAccountHandle), + "should not be able to enable donation without transcription " + + "available(value: %b) and enabled (value:%b) for account:%s", + isVoicemailTranscriptionAvailable(context, phoneAccountHandle), + isVoicemailTranscriptionEnabled(context, phoneAccountHandle), + phoneAccountHandle.toString()); + } VisualVoicemailSettingsUtil.setVoicemailDonationEnabled(context, phoneAccountHandle, enabled); } diff --git a/java/com/android/voicemail/impl/settings/VisualVoicemailSettingsUtil.java b/java/com/android/voicemail/impl/settings/VisualVoicemailSettingsUtil.java index e42d56938..3e006988e 100644 --- a/java/com/android/voicemail/impl/settings/VisualVoicemailSettingsUtil.java +++ b/java/com/android/voicemail/impl/settings/VisualVoicemailSettingsUtil.java @@ -33,6 +33,7 @@ public class VisualVoicemailSettingsUtil { @VisibleForTesting public static final String IS_ENABLED_KEY = "is_enabled"; private static final String ARCHIVE_ENABLED_KEY = "archive_is_enabled"; + private static final String TRANSCRIBE_VOICEMAILS_KEY = "transcribe_voicemails"; private static final String DONATE_VOICEMAILS_KEY = "donate_voicemails"; public static void setEnabled( @@ -59,21 +60,6 @@ public class VisualVoicemailSettingsUtil { } } - private static class VoicemailDeleteWorker implements Worker<Void, Void> { - private final Context context; - - VoicemailDeleteWorker(Context context) { - this.context = context; - } - - @Override - public Void doInBackground(Void unused) { - int deleted = VoicemailDatabaseUtil.deleteAll(context); - VvmLog.i("VisualVoicemailSettingsUtil.doInBackground", "deleted " + deleted + " voicemails"); - return null; - } - } - private static void onSuccess(Void unused) { VvmLog.i("VisualVoicemailSettingsUtil.onSuccess", "delete voicemails"); } @@ -92,12 +78,24 @@ public class VisualVoicemailSettingsUtil { .apply(); } + public static void setVoicemailTranscriptionEnabled( + Context context, PhoneAccountHandle phoneAccount, boolean isEnabled) { + Assert.checkArgument( + VoicemailComponent.get(context) + .getVoicemailClient() + .isVoicemailTranscriptionAvailable(context, phoneAccount)); + new VisualVoicemailPreferences(context, phoneAccount) + .edit() + .putBoolean(TRANSCRIBE_VOICEMAILS_KEY, isEnabled) + .apply(); + } + public static void setVoicemailDonationEnabled( Context context, PhoneAccountHandle phoneAccount, boolean isEnabled) { Assert.checkArgument( VoicemailComponent.get(context) .getVoicemailClient() - .isVoicemailTranscriptionAvailable(context)); + .isVoicemailTranscriptionAvailable(context, phoneAccount)); new VisualVoicemailPreferences(context, phoneAccount) .edit() .putBoolean(DONATE_VOICEMAILS_KEY, isEnabled) @@ -125,6 +123,14 @@ public class VisualVoicemailSettingsUtil { return prefs.getBoolean(ARCHIVE_ENABLED_KEY, false); } + public static boolean isVoicemailTranscriptionEnabled( + Context context, PhoneAccountHandle phoneAccount) { + Assert.isNotNull(phoneAccount); + + VisualVoicemailPreferences prefs = new VisualVoicemailPreferences(context, phoneAccount); + return prefs.getBoolean(TRANSCRIBE_VOICEMAILS_KEY, false); + } + public static boolean isVoicemailDonationEnabled( Context context, PhoneAccountHandle phoneAccount) { Assert.isNotNull(phoneAccount); @@ -146,4 +152,19 @@ public class VisualVoicemailSettingsUtil { VisualVoicemailPreferences prefs = new VisualVoicemailPreferences(context, phoneAccount); return prefs.contains(IS_ENABLED_KEY); } + + private static class VoicemailDeleteWorker implements Worker<Void, Void> { + private final Context context; + + VoicemailDeleteWorker(Context context) { + this.context = context; + } + + @Override + public Void doInBackground(Void unused) { + int deleted = VoicemailDatabaseUtil.deleteAll(context); + VvmLog.i("VisualVoicemailSettingsUtil.doInBackground", "deleted " + deleted + " voicemails"); + return null; + } + } } diff --git a/java/com/android/voicemail/impl/transcribe/TranscriptionService.java b/java/com/android/voicemail/impl/transcribe/TranscriptionService.java index c206c0818..781e3477d 100644 --- a/java/com/android/voicemail/impl/transcribe/TranscriptionService.java +++ b/java/com/android/voicemail/impl/transcribe/TranscriptionService.java @@ -98,6 +98,10 @@ public class TranscriptionService extends JobService { return false; } VoicemailClient client = VoicemailComponent.get(context).getVoicemailClient(); + if (!client.isVoicemailTranscriptionEnabled(context, account)) { + LogUtil.i("TranscriptionService.canTranscribeVoicemail", "transcription is not enabled"); + return false; + } if (!client.hasAcceptedTos(context, account)) { LogUtil.i("TranscriptionService.canTranscribeVoicemail", "hasn't accepted TOS"); return false; diff --git a/java/com/android/voicemail/stub/StubVoicemailClient.java b/java/com/android/voicemail/stub/StubVoicemailClient.java index 2b02261c4..0a1d55351 100644 --- a/java/com/android/voicemail/stub/StubVoicemailClient.java +++ b/java/com/android/voicemail/stub/StubVoicemailClient.java @@ -71,12 +71,18 @@ public final class StubVoicemailClient implements VoicemailClient { Context context, PhoneAccountHandle phoneAccountHandle, boolean value) {} @Override - public boolean isVoicemailTranscriptionAvailable(Context context) { + public boolean isVoicemailTranscriptionAvailable( + Context context, PhoneAccountHandle phoneAccountHandle) { return false; } @Override - public boolean isVoicemailDonationAvailable(Context context) { + public boolean isVoicemailTranscriptionEnabled(Context context, PhoneAccountHandle account) { + return false; + } + + @Override + public boolean isVoicemailDonationAvailable(Context context, PhoneAccountHandle account) { return false; } @@ -86,6 +92,10 @@ public final class StubVoicemailClient implements VoicemailClient { } @Override + public void setVoicemailTranscriptionEnabled( + Context context, PhoneAccountHandle phoneAccountHandle, boolean enabled) {} + + @Override public void setVoicemailDonationEnabled( Context context, PhoneAccountHandle phoneAccountHandle, boolean enabled) {} |