blob: 7f5bb796a706602d275e4b9a1f5503af29822ccb [file] [log] [blame]
/**
* 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.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 android.text.Html;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
import com.android.dialer.notification.NotificationChannelManager;
import com.android.dialer.telecom.TelecomUtil;
import com.android.dialer.widget.TextViewPreference;
import com.android.voicemail.VoicemailClient;
import com.android.voicemail.VoicemailClient.ActivationStateListener;
import com.android.voicemail.VoicemailComponent;
import com.google.common.base.Optional;
/**
* 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 {
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
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";
@Nullable private PhoneAccountHandle phoneAccountHandle;
private VoicemailClient voicemailClient;
private Preference voicemailNotificationPreference;
private SwitchPreference voicemailVisualVoicemail;
private SwitchPreference autoArchiveSwitchPreference;
private SwitchPreference donateVoicemailSwitchPreference;
private Preference voicemailChangePinPreference;
private PreferenceScreen advancedSettings;
private TextViewPreference voicemailTranscriptionInstructionText;
@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);
PreferenceScreen prefSet = getPreferenceScreen();
voicemailNotificationPreference =
findPreference(getString(R.string.voicemail_notifications_key));
voicemailNotificationPreference.setIntent(getNotificationSettingsIntent());
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;
}
});
voicemailVisualVoicemail =
(SwitchPreference) findPreference(getString(R.string.voicemail_visual_voicemail_key));
autoArchiveSwitchPreference =
(SwitchPreference)
findPreference(getString(R.string.voicemail_visual_voicemail_archive_key));
donateVoicemailSwitchPreference =
(SwitchPreference)
findPreference(getString(R.string.voicemail_visual_voicemail_donation_key));
if (!VoicemailComponent.get(getContext())
.getVoicemailClient()
.isVoicemailArchiveAvailable(getContext())) {
getPreferenceScreen().removePreference(autoArchiveSwitchPreference);
}
if (!VoicemailComponent.get(getContext())
.getVoicemailClient()
.isVoicemailDonationAvailable(getContext())) {
getPreferenceScreen().removePreference(donateVoicemailSwitchPreference);
}
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();
voicemailVisualVoicemail.setOnPreferenceChangeListener(this);
voicemailVisualVoicemail.setChecked(
voicemailClient.isVoicemailEnabled(getContext(), phoneAccountHandle));
autoArchiveSwitchPreference.setOnPreferenceChangeListener(this);
autoArchiveSwitchPreference.setChecked(
voicemailClient.isVoicemailArchiveEnabled(getContext(), phoneAccountHandle));
donateVoicemailSwitchPreference.setOnPreferenceChangeListener(this);
donateVoicemailSwitchPreference.setChecked(
voicemailClient.isVoicemailDonationEnabled(getContext(), phoneAccountHandle));
updateDonateVoicemail();
} else {
prefSet.removePreference(voicemailVisualVoicemail);
prefSet.removePreference(autoArchiveSwitchPreference);
prefSet.removePreference(donateVoicemailSwitchPreference);
prefSet.removePreference(voicemailChangePinPreference);
}
advancedSettings =
(PreferenceScreen) findPreference(getString(R.string.voicemail_advanced_settings_key));
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());
}
}
advancedSettings.setIntent(advancedSettingsIntent);
voicemailChangePinPreference.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;
}
});
voicemailTranscriptionInstructionText =
(TextViewPreference) findPreference(getString(R.string.voicemail_transcription_text_key));
voicemailTranscriptionInstructionText.setTitle(getVoicemailTranscriptionInstructionsText());
}
@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(voicemailVisualVoicemail.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(autoArchiveSwitchPreference.getKey())) {
logArchiveToggle((boolean) objValue);
voicemailClient.setVoicemailArchiveEnabled(
getContext(), phoneAccountHandle, (boolean) objValue);
} else if (preference.getKey().equals(donateVoicemailSwitchPreference.getKey())) {
logArchiveToggle((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);
voicemailVisualVoicemail.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();
}
private void updateChangePin() {
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 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);
} else {
donateVoicemailSwitchPreference.setSummary(R.string.voicemail_donate_preference_summary_info);
donateVoicemailSwitchPreference.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);
}
}
@Override
public void onActivationStateChanged(PhoneAccountHandle phoneAccountHandle, boolean isActivated) {
if (this.phoneAccountHandle.equals(phoneAccountHandle)) {
updateChangePin();
updateDonateVoicemail();
}
}
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();
}
/**
* Builds a spannable string containing the voicemail transcription instructions text containing
* the appropriate "Learn More" urls.
*
* @return The voicemail transcription instructions text.
*/
private CharSequence getVoicemailTranscriptionInstructionsText() {
String settingText =
getString(
R.string.voicemail_transcription_instruction_text,
getString(R.string.transcription_learn_more_url),
getString(R.string.donation_learn_more_url));
CharSequence settingSeq = Html.fromHtml(settingText);
return settingSeq;
}
}