• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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