1 /** 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * <p>Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5 * except in compliance with the License. You may obtain a copy of the License at 6 * 7 * <p>http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * <p>Unless required by applicable law or agreed to in writing, software distributed under the 10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 11 * express or implied. See the License for the specific language governing permissions and 12 * limitations under the License 13 */ 14 package com.android.voicemail.impl.settings; 15 16 import android.annotation.TargetApi; 17 import android.content.Intent; 18 import android.os.Build.VERSION_CODES; 19 import android.os.Bundle; 20 import android.preference.Preference; 21 import android.preference.Preference.OnPreferenceClickListener; 22 import android.preference.PreferenceFragment; 23 import android.preference.PreferenceScreen; 24 import android.preference.SwitchPreference; 25 import android.support.annotation.Nullable; 26 import android.telecom.PhoneAccountHandle; 27 import android.telephony.TelephonyManager; 28 import com.android.dialer.common.Assert; 29 import com.android.dialer.logging.DialerImpression; 30 import com.android.dialer.logging.Logger; 31 import com.android.dialer.notification.NotificationChannelManager; 32 import com.android.dialer.notification.NotificationChannelManager.Channel; 33 import com.android.voicemail.VoicemailClient; 34 import com.android.voicemail.VoicemailComponent; 35 import com.android.voicemail.impl.OmtpVvmCarrierConfigHelper; 36 import com.android.voicemail.impl.R; 37 import com.android.voicemail.impl.VvmLog; 38 import com.android.voicemail.impl.sync.VvmAccountManager; 39 40 /** 41 * Fragment for voicemail settings. Requires {@link VoicemailClient#PARAM_PHONE_ACCOUNT_HANDLE} set 42 * in arguments. 43 */ 44 @TargetApi(VERSION_CODES.O) 45 public class VoicemailSettingsFragment extends PreferenceFragment 46 implements Preference.OnPreferenceChangeListener, 47 VvmAccountManager.Listener { 48 49 private static final String TAG = "VmSettingsActivity"; 50 51 @Nullable private PhoneAccountHandle phoneAccountHandle; 52 private OmtpVvmCarrierConfigHelper omtpVvmCarrierConfigHelper; 53 54 private Preference voicemailNotificationPreference; 55 private SwitchPreference voicemailVisualVoicemail; 56 private SwitchPreference autoArchiveSwitchPreference; 57 private Preference voicemailChangePinPreference; 58 private PreferenceScreen advancedSettings; 59 60 @Override onCreate(Bundle icicle)61 public void onCreate(Bundle icicle) { 62 super.onCreate(icicle); 63 64 phoneAccountHandle = 65 Assert.isNotNull(getArguments().getParcelable(VoicemailClient.PARAM_PHONE_ACCOUNT_HANDLE)); 66 67 omtpVvmCarrierConfigHelper = new OmtpVvmCarrierConfigHelper(getContext(), phoneAccountHandle); 68 } 69 70 @Override onResume()71 public void onResume() { 72 super.onResume(); 73 Logger.get(getContext()).logImpression(DialerImpression.Type.VVM_SETTINGS_VIEWED); 74 VvmAccountManager.addListener(this); 75 PreferenceScreen preferenceScreen = getPreferenceScreen(); 76 if (preferenceScreen != null) { 77 preferenceScreen.removeAll(); 78 } 79 80 addPreferencesFromResource(R.xml.voicemail_settings); 81 82 PreferenceScreen prefSet = getPreferenceScreen(); 83 84 voicemailNotificationPreference = 85 findPreference(getString(R.string.voicemail_notifications_key)); 86 voicemailNotificationPreference.setIntent( 87 NotificationChannelManager.getInstance() 88 .getSettingsIntentForChannel(getContext(), Channel.VOICEMAIL, phoneAccountHandle)); 89 voicemailNotificationPreference.setOnPreferenceClickListener( 90 new OnPreferenceClickListener() { 91 @Override 92 public boolean onPreferenceClick(Preference preference) { 93 Logger.get(getContext()) 94 .logImpression(DialerImpression.Type.VVM_CHANGE_RINGTONE_CLICKED); 95 // Let the preference handle the click. 96 return false; 97 } 98 }); 99 100 voicemailVisualVoicemail = 101 (SwitchPreference) findPreference(getString(R.string.voicemail_visual_voicemail_key)); 102 103 autoArchiveSwitchPreference = 104 (SwitchPreference) 105 findPreference(getString(R.string.voicemail_visual_voicemail_archive_key)); 106 107 if (!VoicemailComponent.get(getContext()) 108 .getVoicemailClient() 109 .isVoicemailArchiveAvailable(getContext())) { 110 getPreferenceScreen().removePreference(autoArchiveSwitchPreference); 111 } 112 113 voicemailChangePinPreference = findPreference(getString(R.string.voicemail_change_pin_key)); 114 115 if (omtpVvmCarrierConfigHelper.isValid()) { 116 Assert.isNotNull(phoneAccountHandle); 117 Intent changePinIntent = 118 new Intent(new Intent(getContext(), VoicemailChangePinActivity.class)); 119 changePinIntent.putExtra( 120 VoicemailChangePinActivity.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle); 121 122 voicemailChangePinPreference.setIntent(changePinIntent); 123 voicemailChangePinPreference.setOnPreferenceClickListener( 124 new OnPreferenceClickListener() { 125 @Override 126 public boolean onPreferenceClick(Preference preference) { 127 Logger.get(getContext()).logImpression(DialerImpression.Type.VVM_CHANGE_PIN_CLICKED); 128 // Let the preference handle the click. 129 return false; 130 } 131 }); 132 if (VoicemailChangePinActivity.isDefaultOldPinSet(getContext(), phoneAccountHandle)) { 133 voicemailChangePinPreference.setTitle(R.string.voicemail_set_pin_preference_title); 134 } else { 135 voicemailChangePinPreference.setTitle(R.string.voicemail_change_pin_preference_title); 136 } 137 updateChangePin(); 138 139 voicemailVisualVoicemail.setOnPreferenceChangeListener(this); 140 voicemailVisualVoicemail.setChecked( 141 VisualVoicemailSettingsUtil.isEnabled(getContext(), phoneAccountHandle)); 142 143 autoArchiveSwitchPreference.setOnPreferenceChangeListener(this); 144 autoArchiveSwitchPreference.setChecked( 145 VisualVoicemailSettingsUtil.isArchiveEnabled(getContext(), phoneAccountHandle)); 146 } else { 147 prefSet.removePreference(voicemailVisualVoicemail); 148 prefSet.removePreference(autoArchiveSwitchPreference); 149 prefSet.removePreference(voicemailChangePinPreference); 150 } 151 152 advancedSettings = 153 (PreferenceScreen) findPreference(getString(R.string.voicemail_advanced_settings_key)); 154 Intent advancedSettingsIntent = new Intent(TelephonyManager.ACTION_CONFIGURE_VOICEMAIL); 155 advancedSettingsIntent.putExtra(TelephonyManager.EXTRA_HIDE_PUBLIC_SETTINGS, true); 156 advancedSettings.setIntent(advancedSettingsIntent); 157 voicemailChangePinPreference.setOnPreferenceClickListener( 158 new OnPreferenceClickListener() { 159 @Override 160 public boolean onPreferenceClick(Preference preference) { 161 Logger.get(getContext()) 162 .logImpression(DialerImpression.Type.VVM_ADVANCED_SETINGS_CLICKED); 163 // Let the preference handle the click. 164 return false; 165 } 166 }); 167 } 168 169 @Override onPause()170 public void onPause() { 171 VvmAccountManager.removeListener(this); 172 super.onPause(); 173 } 174 175 /** 176 * Implemented to support onPreferenceChangeListener to look for preference changes. 177 * 178 * @param preference is the preference to be changed 179 * @param objValue should be the value of the selection, NOT its localized display value. 180 */ 181 @Override onPreferenceChange(Preference preference, Object objValue)182 public boolean onPreferenceChange(Preference preference, Object objValue) { 183 VvmLog.d(TAG, "onPreferenceChange: \"" + preference + "\" changed to \"" + objValue + "\""); 184 if (preference.getKey().equals(voicemailVisualVoicemail.getKey())) { 185 boolean isEnabled = (boolean) objValue; 186 VisualVoicemailSettingsUtil.setEnabled(getContext(), phoneAccountHandle, isEnabled); 187 188 if (isEnabled) { 189 Logger.get(getContext()).logImpression(DialerImpression.Type.VVM_USER_ENABLED_IN_SETTINGS); 190 } else { 191 Logger.get(getContext()).logImpression(DialerImpression.Type.VVM_USER_DISABLED_IN_SETTINGS); 192 } 193 194 updateChangePin(); 195 } else if (preference.getKey().equals(autoArchiveSwitchPreference.getKey())) { 196 logArchiveToggle((boolean) objValue); 197 VisualVoicemailSettingsUtil.setArchiveEnabled( 198 getContext(), phoneAccountHandle, (boolean) objValue); 199 } 200 201 // Always let the preference setting proceed. 202 return true; 203 } 204 updateChangePin()205 private void updateChangePin() { 206 if (!VisualVoicemailSettingsUtil.isEnabled(getContext(), phoneAccountHandle)) { 207 voicemailChangePinPreference.setSummary( 208 R.string.voicemail_change_pin_preference_summary_disable); 209 voicemailChangePinPreference.setEnabled(false); 210 } else if (!VvmAccountManager.isAccountActivated(getContext(), phoneAccountHandle)) { 211 voicemailChangePinPreference.setSummary( 212 R.string.voicemail_change_pin_preference_summary_not_activated); 213 voicemailChangePinPreference.setEnabled(false); 214 } else { 215 voicemailChangePinPreference.setSummary(null); 216 voicemailChangePinPreference.setEnabled(true); 217 } 218 } 219 logArchiveToggle(boolean userTurnedOn)220 private void logArchiveToggle(boolean userTurnedOn) { 221 if (userTurnedOn) { 222 Logger.get(getContext()) 223 .logImpression(DialerImpression.Type.VVM_USER_TURNED_ARCHIVE_ON_FROM_SETTINGS); 224 } else { 225 Logger.get(getContext()) 226 .logImpression(DialerImpression.Type.VVM_USER_TURNED_ARCHIVE_OFF_FROM_SETTINGS); 227 } 228 } 229 230 @Override onActivationStateChanged(PhoneAccountHandle phoneAccountHandle, boolean isActivated)231 public void onActivationStateChanged(PhoneAccountHandle phoneAccountHandle, boolean isActivated) { 232 if (this.phoneAccountHandle.equals(phoneAccountHandle)) { 233 updateChangePin(); 234 } 235 } 236 } 237