packages/apps/Dialer/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java

542 lines
22 KiB
Java
Raw Normal View History

2025-08-25 08:38:42 +08:00
/**
* Copyright (C) 2017 The Android Open Source Project
*
* <p>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
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>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.settings;
import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
import android.preference.SwitchPreference;
import android.provider.Settings;
import android.support.annotation.IntDef;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telephony.SubscriptionInfo;
import android.telephony.TelephonyManager;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.preference.SwitchPreferenceWithClickableSummary;
import com.android.dialer.configprovider.ConfigProviderComponent;
import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
import com.android.dialer.notification.NotificationChannelManager;
import com.android.dialer.spannable.ContentWithLearnMoreSpanner;
import com.android.dialer.telecom.TelecomUtil;
import com.android.voicemail.VoicemailClient;
import com.android.voicemail.VoicemailClient.ActivationStateListener;
import com.android.voicemail.VoicemailComponent;
import com.google.common.base.Optional;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* Fragment for voicemail settings. Requires {@link VoicemailClient#PARAM_PHONE_ACCOUNT_HANDLE} set
* in arguments.
*/
@TargetApi(VERSION_CODES.O)
public class VoicemailSettingsFragment extends PreferenceFragment
implements Preference.OnPreferenceChangeListener, ActivationStateListener {
// Extras copied from com.android.phone.settings.VoicemailSettingsActivity,
// it does not recognize EXTRA_PHONE_ACCOUNT_HANDLE in O.
@VisibleForTesting
static final String SUB_ID_EXTRA =
"com.android.phone.settings.SubscriptionInfoHelper.SubscriptionId";
// Extra on intent containing the label of a subscription.
@VisibleForTesting
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 Preference changeGreetingPreference;
private PreferenceScreen advancedSettingsPreference;
// Settings that are supported by dialer only if the carrier configurations are valid.
private SwitchPreference visualVoicemailPreference;
private SwitchPreference voicemailAutoArchivePreference;
private SwitchPreferenceWithClickableSummary transcribeVoicemailPreference;
// Voicemail transcription analysis toggle
private SwitchPreferenceWithClickableSummary donateTranscribedVoicemailPreference;
private Preference voicemailChangePinPreference;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
phoneAccountHandle =
Assert.isNotNull(getArguments().getParcelable(VoicemailClient.PARAM_PHONE_ACCOUNT_HANDLE));
voicemailClient = VoicemailComponent.get(getContext()).getVoicemailClient();
}
@Override
public void onResume() {
super.onResume();
Logger.get(getContext()).logImpression(DialerImpression.Type.VVM_SETTINGS_VIEWED);
voicemailClient.addActivationStateListener(this);
PreferenceScreen preferenceScreen = getPreferenceScreen();
if (preferenceScreen != null) {
preferenceScreen.removeAll();
}
addPreferencesFromResource(R.xml.voicemail_settings);
initializeXmlPreferences();
setupVisualVoicemailPreferences();
setupNotificationsPreference();
setupChangeGreetingPreference();
setupAdvancedSettingsPreference();
}
private void setupVisualVoicemailPreferences() {
if (!voicemailClient.hasCarrierSupport(getContext(), phoneAccountHandle)) {
removeAllVisualVoicemailPreferences();
return;
}
setupVisualVoicemailPreference();
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()
.isVoicemailTranscriptionAvailable(getContext(), phoneAccountHandle)) {
removeAllTranscriptionPreferences();
return;
} else {
showTranscriptionEnabledPreference();
updateTranscriptionDonationPreference();
}
}
private void showTranscriptionEnabledPreference() {
transcribeVoicemailPreference.setOnPreferenceChangeListener(this);
transcribeVoicemailPreference.setChecked(
voicemailClient.isVoicemailTranscriptionEnabled(getContext(), phoneAccountHandle));
transcribeVoicemailPreference.setSummary(getVoicemailTranscriptionInformationalText());
transcribeVoicemailPreference.setEnabled(true);
getPreferenceScreen().addPreference(transcribeVoicemailPreference);
}
/**
* Builds a spannable string containing the voicemail transcription informational text containing
* the appropriate "Learn More" urls.
*
* @return The voicemail transcription information text.
*/
private CharSequence getVoicemailTranscriptionInformationalText() {
return new ContentWithLearnMoreSpanner(getContext())
.create(
getContext().getString(R.string.voicemail_transcription_preference_summary_info),
getContext().getString(R.string.transcription_learn_more_url));
}
private void updateTranscriptionDonationPreference() {
if (!VoicemailComponent.get(getContext())
.getVoicemailClient()
.isVoicemailDonationAvailable(getContext(), phoneAccountHandle)) {
getPreferenceScreen().removePreference(donateTranscribedVoicemailPreference);
} else {
showTranscriptionDonationEnabledPreferences();
}
}
private void showTranscriptionDonationEnabledPreferences() {
donateTranscribedVoicemailPreference.setEnabled(true);
donateTranscribedVoicemailPreference.setChecked(
voicemailClient.isVoicemailDonationEnabled(getContext(), phoneAccountHandle));
donateTranscribedVoicemailPreference.setOnPreferenceChangeListener(this);
donateTranscribedVoicemailPreference.setSummary(
getVoicemailTranscriptionDonationInformationalText());
getPreferenceScreen().addPreference(donateTranscribedVoicemailPreference);
}
/**
* Builds a spannable string containing the voicemail donation informational text containing the
* appropriate "Learn More" urls.
*
* @return The voicemail donation information text.
*/
private CharSequence getVoicemailTranscriptionDonationInformationalText() {
return new ContentWithLearnMoreSpanner(getContext())
.create(
getContext().getString(R.string.voicemail_donate_preference_summary_info),
getContext().getString(R.string.donation_learn_more_url));
}
private void removeAllTranscriptionPreferences() {
getPreferenceScreen().removePreference(transcribeVoicemailPreference);
getPreferenceScreen().removePreference(donateTranscribedVoicemailPreference);
}
private void setupAutoArchivePreference() {
if (!VoicemailComponent.get(getContext())
.getVoicemailClient()
.isVoicemailArchiveAvailable(getContext())) {
getPreferenceScreen().removePreference(voicemailAutoArchivePreference);
} else {
voicemailAutoArchivePreference.setOnPreferenceChangeListener(this);
voicemailAutoArchivePreference.setChecked(
voicemailClient.isVoicemailArchiveEnabled(getContext(), phoneAccountHandle));
}
}
private void setupVisualVoicemailPreference() {
visualVoicemailPreference.setOnPreferenceChangeListener(this);
visualVoicemailPreference.setChecked(
voicemailClient.isVoicemailEnabled(getContext(), phoneAccountHandle));
updateVoicemailSummaryMessage();
}
/** The preferences that are present in the voicemail_settings.xml file are initialized here. */
private void initializeXmlPreferences() {
voicemailNotificationPreference =
findPreference(getString(R.string.voicemail_notifications_key));
voicemailNotificationPreference.setOrder(VMSettingOrdering.NOTIFICATIONS);
changeGreetingPreference = findPreference(getString(R.string.voicemail_change_greeting_key));
changeGreetingPreference.setOrder(VMSettingOrdering.CHANGE_GREETING);
advancedSettingsPreference =
(PreferenceScreen) findPreference(getString(R.string.voicemail_advanced_settings_key));
advancedSettingsPreference.setOrder(VMSettingOrdering.ADVANCED_SETTING);
visualVoicemailPreference =
(SwitchPreference) findPreference(getString(R.string.voicemail_visual_voicemail_key));
visualVoicemailPreference.setOrder(VMSettingOrdering.VISUAL_VOICEMAIL);
voicemailAutoArchivePreference =
(SwitchPreference)
findPreference(getString(R.string.voicemail_visual_voicemail_archive_key));
voicemailAutoArchivePreference.setOrder(VMSettingOrdering.VOICEMAIL_AUTO_ARCHIVE);
transcribeVoicemailPreference =
(SwitchPreferenceWithClickableSummary)
findPreference(getString(R.string.voicemail_visual_voicemail_transcription_key));
transcribeVoicemailPreference.setOrder(VMSettingOrdering.VOICEMAIL_TRANSCRIPTION);
donateTranscribedVoicemailPreference =
(SwitchPreferenceWithClickableSummary)
findPreference(getString(R.string.voicemail_visual_voicemail_donation_key));
donateTranscribedVoicemailPreference.setOrder(
VMSettingOrdering.VOICEMAIL_TRANSCRIPTION_DONATION);
voicemailChangePinPreference = findPreference(getString(R.string.voicemail_change_pin_key));
voicemailChangePinPreference.setOrder(VMSettingOrdering.VOICEMAIL_CHANGE_PIN);
}
/** 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 {
voicemailChangePinPreference.setTitle(R.string.voicemail_change_pin_preference_title);
}
updateChangePinPreference();
}
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 setupChangeGreetingPreference() {
if (!ConfigProviderComponent.get(getContext())
.getConfigProvider()
.getBoolean("voicemail_change_greeting_enabled", false)) {
getPreferenceScreen().removePreference(changeGreetingPreference);
return;
}
Intent changeGreetingIntent = new Intent(getContext(), CurrentVoicemailGreetingActivity.class);
changeGreetingPreference.setIntent(changeGreetingIntent);
}
private void setupAdvancedSettingsPreference() {
Intent advancedSettingsIntent = new Intent(TelephonyManager.ACTION_CONFIGURE_VOICEMAIL);
advancedSettingsIntent.putExtra(TelephonyManager.EXTRA_HIDE_PUBLIC_SETTINGS, true);
advancedSettingsIntent.putExtra(
TelephonyManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle);
// (a bug): EXTRA_PHONE_ACCOUNT_HANDLE not implemented in telephony in O.
Optional<SubscriptionInfo> subscriptionInfo =
TelecomUtil.getSubscriptionInfo(getContext(), phoneAccountHandle);
if (subscriptionInfo.isPresent()) {
advancedSettingsIntent.putExtra(SUB_ID_EXTRA, subscriptionInfo.get().getSubscriptionId());
PhoneAccount phoneAccount =
getContext().getSystemService(TelecomManager.class).getPhoneAccount(phoneAccountHandle);
if (phoneAccount != null) {
advancedSettingsIntent.putExtra(SUB_LABEL_EXTRA, phoneAccount.getLabel());
}
}
advancedSettingsPreference.setIntent(advancedSettingsIntent);
advancedSettingsPreference.setOnPreferenceClickListener(
new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Logger.get(getContext())
.logImpression(DialerImpression.Type.VVM_ADVANCED_SETINGS_CLICKED);
// Let the preference handle the click.
return false;
}
});
}
@Override
public void onPause() {
voicemailClient.removeActivationStateListener(this);
super.onPause();
}
/**
* Implemented to support onPreferenceChangeListener to look for preference changes.
*
* @param preference is the preference to be changed
* @param objValue should be the value of the selection, NOT its localized display value.
*/
@Override
public boolean onPreferenceChange(Preference preference, Object objValue) {
LogUtil.d(TAG, "onPreferenceChange: \"" + preference + "\" changed to \"" + objValue + "\"");
if (preference.getKey().equals(visualVoicemailPreference.getKey())) {
boolean isEnabled = (boolean) objValue;
if (!isEnabled) {
showDisableConfirmationDialog();
// Don't let the preference setting proceed.
return false;
} else {
updateVoicemailEnabled(true);
}
} else if (preference.getKey().equals(voicemailAutoArchivePreference.getKey())) {
logArchiveToggle((boolean) objValue);
voicemailClient.setVoicemailArchiveEnabled(
getContext(), phoneAccountHandle, (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);
}
// Let the preference setting proceed.
return true;
}
private void updateVoicemailEnabled(boolean isEnabled) {
voicemailClient.setVoicemailEnabled(getContext(), phoneAccountHandle, 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);
}
updateVoicemailSummaryMessage();
updateTranscriptionPreferences();
updateChangePinPreference();
}
private void updateChangePinPreference() {
if (!voicemailClient.isVoicemailEnabled(getContext(), phoneAccountHandle)) {
voicemailChangePinPreference.setSummary(
R.string.voicemail_change_pin_preference_summary_disable);
voicemailChangePinPreference.setEnabled(false);
} else if (!voicemailClient.isActivated(getContext(), phoneAccountHandle)) {
voicemailChangePinPreference.setSummary(
R.string.voicemail_change_pin_preference_summary_not_activated);
voicemailChangePinPreference.setEnabled(false);
} else {
voicemailChangePinPreference.setSummary(null);
voicemailChangePinPreference.setEnabled(true);
}
}
private void logArchiveToggle(boolean userTurnedOn) {
if (userTurnedOn) {
Logger.get(getContext())
.logImpression(DialerImpression.Type.VVM_USER_TURNED_ARCHIVE_ON_FROM_SETTINGS);
} else {
Logger.get(getContext())
.logImpression(DialerImpression.Type.VVM_USER_TURNED_ARCHIVE_OFF_FROM_SETTINGS);
}
}
private void logTranscribeToggle(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);
}
}
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)) {
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("");
}
}
private Intent getNotificationSettingsIntent() {
String channelId =
NotificationChannelManager.getVoicemailChannelId(getContext(), phoneAccountHandle);
return new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS)
.putExtra(Settings.EXTRA_CHANNEL_ID, channelId)
.putExtra(Settings.EXTRA_APP_PACKAGE, getContext().getPackageName());
}
private void showDisableConfirmationDialog() {
LogUtil.i(TAG, "showDisableConfirmationDialog");
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle(R.string.confirm_disable_voicemail_dialog_title);
builder.setMessage(R.string.confirm_disable_voicemail_dialog_message);
builder.setPositiveButton(
R.string.confirm_disable_voicemail_accept_dialog_label,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
LogUtil.i(TAG, "showDisableConfirmationDialog, confirmed");
updateVoicemailEnabled(false);
dialog.dismiss();
}
});
builder.setNegativeButton(
android.R.string.cancel,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
LogUtil.i(TAG, "showDisableConfirmationDialog, cancelled");
dialog.dismiss();
}
});
builder.setCancelable(true);
builder.show();
}
/** The ordering in which to show the voicemail settings */
@Retention(RetentionPolicy.SOURCE)
@IntDef({
VMSettingOrdering.NOTIFICATIONS,
VMSettingOrdering.VISUAL_VOICEMAIL,
VMSettingOrdering.VOICEMAIL_TRANSCRIPTION,
VMSettingOrdering.VOICEMAIL_TRANSCRIPTION_DONATION,
VMSettingOrdering.VOICEMAIL_CHANGE_PIN,
VMSettingOrdering.VOICEMAIL_AUTO_ARCHIVE,
VMSettingOrdering.ADVANCED_SETTING,
VMSettingOrdering.CHANGE_GREETING
})
private @interface VMSettingOrdering {
int NOTIFICATIONS = 1;
int VISUAL_VOICEMAIL = 2;
int VOICEMAIL_TRANSCRIPTION = 3;
int VOICEMAIL_TRANSCRIPTION_DONATION = 4;
int VOICEMAIL_CHANGE_PIN = 5;
int VOICEMAIL_AUTO_ARCHIVE = 6;
int ADVANCED_SETTING = 7;
int CHANGE_GREETING = 8;
}
}