CallFeaturesSetting.java revision 4e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4
1b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project/*
2b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project *
4b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * you may not use this file except in compliance with the License.
6b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * You may obtain a copy of the License at
7b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project *
8b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project *
10b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * See the License for the specific language governing permissions and
14b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * limitations under the License.
15b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */
16b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
17b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectpackage com.android.phone;
18b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinskyimport static com.android.phone.TimeConsumingPreferenceActivity.EXCEPTION_ERROR;
209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinskyimport static com.android.phone.TimeConsumingPreferenceActivity.RESPONSE_ERROR;
219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinskyimport com.android.internal.telephony.CallForwardInfo;
239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinskyimport com.android.internal.telephony.CommandsInterface;
24cd0189299f484dcbd51400b994daf585923e9e8dDavid Krauseimport com.android.internal.telephony.Phone;
25cd0189299f484dcbd51400b994daf585923e9e8dDavid Krauseimport com.android.internal.telephony.PhoneFactory;
26cd0189299f484dcbd51400b994daf585923e9e8dDavid Krauseimport com.android.internal.telephony.cdma.TtyIntent;
27cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
289440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinskyimport android.app.Activity;
29b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.app.AlertDialog;
30b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.app.Dialog;
319440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinskyimport android.app.ProgressDialog;
32cd0189299f484dcbd51400b994daf585923e9e8dDavid Krauseimport android.content.Context;
33b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.DialogInterface;
34b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.Intent;
35e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinskyimport android.content.SharedPreferences;
369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinskyimport android.content.SharedPreferences.Editor;
37365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport android.content.pm.ActivityInfo;
38365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport android.content.pm.PackageManager;
39365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport android.content.pm.ResolveInfo;
40b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.database.Cursor;
41cd0189299f484dcbd51400b994daf585923e9e8dDavid Krauseimport android.media.AudioManager;
42b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.AsyncResult;
43b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Bundle;
44b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Handler;
45b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Message;
46b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.CheckBoxPreference;
47b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.ListPreference;
48b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.Preference;
49b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.PreferenceActivity;
50b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.PreferenceScreen;
51153b94130a5e7a0e7bb17f17ce8f1ed294453d9eDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds;
52cd0189299f484dcbd51400b994daf585923e9e8dDavid Krauseimport android.provider.Settings;
539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinskyimport android.telephony.PhoneNumberUtils;
54b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.text.TextUtils;
55365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
56b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.util.Log;
57b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.WindowManager;
586da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinskyimport android.widget.ListAdapter;
59b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
60365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport java.util.HashMap;
61365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport java.util.List;
62365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport java.util.Map;
63365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
64365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
65b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectpublic class CallFeaturesSetting extends PreferenceActivity
66b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        implements DialogInterface.OnClickListener,
67b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        Preference.OnPreferenceChangeListener,
68b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        EditPhoneNumberPreference.OnDialogClosedListener,
69b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        EditPhoneNumberPreference.GetDefaultNumberListener{
70b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
716da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    // intent action to bring up voice mail settings
72b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public static final String ACTION_ADD_VOICEMAIL =
73b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        "com.android.phone.CallFeaturesSetting.ADD_VOICEMAIL";
746da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    // intent action sent by this activity to a voice mail provider
756da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    // to trigger its configuration UI
76365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    public static final String ACTION_CONFIGURE_VOICEMAIL =
77365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        "com.android.phone.CallFeaturesSetting.CONFIGURE_VOICEMAIL";
786da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    // Extra put in the return from VM provider config containing voicemail number to set
796da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    public static final String VM_NUMBER_EXTRA = "com.android.phone.VoicemailNumber";
809440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Extra put in the return from VM provider config containing call forwarding number to set
819440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_NUMBER_EXTRA = "com.android.phone.ForwardingNumber";
829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Extra put in the return from VM provider config containing call forwarding number to set
839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_NUMBER_TIME_EXTRA = "com.android.phone.ForwardingNumberTime";
849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // If the VM provider returns non null value in this extra we will force the user to
859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // choose another VM provider
869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String SIGNOUT_EXTRA = "com.android.phone.Signout";
879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Used to tell the saving logic to leave forwarding number as is
899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final CallForwardInfo[] FWD_SETTINGS_DONT_TOUCH = null;
909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Suffix appended to provider key for storing vm number
919440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String VM_NUMBER_TAG = "#VMNumber";
929440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Suffix appended to provider key for storing forwarding settings
939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTINGS_TAG = "#FWDSettings";
949440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Suffix appended to forward settings key for storing length of settings array
959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTINGS_LENGTH_TAG = "#Length";
969440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Suffix appended to forward settings key for storing an individual setting
979440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTING_TAG = "#Setting";
989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Suffixes appended to forward setting key for storing an individual setting properties
999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTING_STATUS = "#Status";
1009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTING_REASON = "#Reason";
1019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTING_NUMBER = "#Number";
1029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTING_TIME = "#Time";
1039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
1049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Key identifying the default vocie mail provider
1059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String DEFAULT_VM_PROVIDER_KEY = "";
106b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
107e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    // Extra put into ACTION_ADD_VOICEMAIL call to indicate which provider
108e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    // to remove from the list of providers presented to the user
109e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    public static final String IGNORE_PROVIDER_EXTRA = "com.android.phone.ProviderToIgnore";
110e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
111b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // debug data
11287258b2b589c3afea4b89b840251012378e0d3b4David Brown    private static final String LOG_TAG = "CallFeaturesSetting";
113cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
114b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1156da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    // string constants
116153b94130a5e7a0e7bb17f17ce8f1ed294453d9eDmitri Plotnikov    private static final String NUM_PROJECTION[] = {CommonDataKinds.Phone.NUMBER};
117b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
118b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // String keys for preference lookup
119b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final String BUTTON_VOICEMAIL_KEY = "button_voicemail_key";
120365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private static final String BUTTON_VOICEMAIL_PROVIDER_KEY = "button_voicemail_provider_key";
121365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private static final String BUTTON_VOICEMAIL_SETTING_KEY = "button_voicemail_setting_key";
122b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final String BUTTON_FDN_KEY   = "button_fdn_key";
123b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
124cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_DTMF_KEY   = "button_dtmf_settings";
1253800ac871d6548790ac6119bb68b9be0640af261David Krause    private static final String BUTTON_RETRY_KEY  = "button_auto_retry_key";
126cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_TTY_KEY    = "button_tty_mode_key";
127cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_HAC_KEY    = "button_hac_key";
128cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
129cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_GSM_UMTS_OPTIONS = "button_gsm_more_expand_key";
130cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_CDMA_OPTIONS = "button_cdma_more_expand_key";
131a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
132e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    private static final String VM_NUMBERS_SHARED_PREFERENCES_NAME = "vm_numbers";
133e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
134b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private Intent mContactListIntent;
135b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
136b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /** Event for Async voicemail change call */
1379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int EVENT_VOICEMAIL_CHANGED        = 500;
1389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int EVENT_FORWARDING_CHANGED       = 501;
1399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int EVENT_FORWARDING_GET_COMPLETED = 502;
140d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
141a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville    // preferred TTY mode
142cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    // Phone.TTY_MODE_xxx
143cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    static final int preferredTtyMode = Phone.TTY_MODE_OFF;
144b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
145d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville    // Dtmf tone types
146d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville    static final int DTMF_TONE_TYPE_NORMAL = 0;
147d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville    static final int DTMF_TONE_TYPE_LONG   = 1;
148d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
149cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String HAC_KEY = "HACSetting";
150cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String HAC_VAL_ON = "ON";
151cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String HAC_VAL_OFF = "OFF";
152d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
153b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /** Handle to voicemail pref */
154cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final int VOICEMAIL_PREF_ID = 1;
155365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private static final int VOICEMAIL_PROVIDER_CFG_ID = 2;
156b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
157b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private Phone mPhone;
158b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
159cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private AudioManager mAudioManager;
160cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
161b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int VM_NOCHANGE_ERROR = 400;
162b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int VM_RESPONSE_ERROR = 500;
1639440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int FW_SET_RESPONSE_ERROR = 501;
1649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int FW_GET_RESPONSE_ERROR = 502;
165b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
166b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
167b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // dialog identifiers for voicemail
168b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int VOICEMAIL_DIALOG_CONFIRM = 600;
1699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int VOICEMAIL_FWD_SAVING_DIALOG = 601;
1709440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int VOICEMAIL_FWD_READING_DIALOG = 602;
171bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    private static final int VOICEMAIL_REVERTING_DIALOG = 603;
172b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
173b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // status message sent back from handlers
174b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MSG_OK = 100;
175cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
176b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // special statuses for voicemail controls.
177b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MSG_VM_EXCEPTION = 400;
1789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int MSG_FW_SET_EXCEPTION = 401;
1799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int MSG_FW_GET_EXCEPTION = 402;
180b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MSG_VM_OK = 600;
181b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MSG_VM_NOCHANGE = 700;
182cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
183b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private EditPhoneNumberPreference mSubMenuVoicemailSettings;
184cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1853800ac871d6548790ac6119bb68b9be0640af261David Krause    private CheckBoxPreference mButtonAutoRetry;
186cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private CheckBoxPreference mButtonHAC;
187cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private ListPreference mButtonDTMF;
188404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville    private ListPreference mButtonTTY;
189365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private ListPreference mVoicemailProviders;
190365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private PreferenceScreen mVoicemailSettings;
1919440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
192365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private class VoiceMailProvider {
193365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        public VoiceMailProvider(String name, Intent intent) {
194365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            this.name = name;
195365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            this.intent = intent;
196365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
197365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        public String name;
198365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        public Intent intent;
199365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
2009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
2029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Forwarding settings we are going to save.
2039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
2049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    static final int [] FORWARDING_SETTINGS_REASONS = new int[] {
2059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CommandsInterface.CF_REASON_UNCONDITIONAL,
2069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CommandsInterface.CF_REASON_BUSY,
2079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CommandsInterface.CF_REASON_NO_REPLY,
2089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CommandsInterface.CF_REASON_NOT_REACHABLE
2099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    };
2109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private class VoiceMailProviderSettings {
2129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        /**
2139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky         * Constructs settings object, setting all conditional forwarding to the specified number
2149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky         */
2159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public VoiceMailProviderSettings(String voicemailNumber, String forwardingNumber,
2169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                int timeSeconds) {
2179440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            this.voicemailNumber = voicemailNumber;
2189440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (forwardingNumber == null || forwardingNumber.length() == 0) {
2199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                this.forwardingSettings = FWD_SETTINGS_DONT_TOUCH;
2209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            } else {
2219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                this.forwardingSettings = new CallForwardInfo[FORWARDING_SETTINGS_REASONS.length];
2229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                for (int i = 0; i < this.forwardingSettings.length; i++) {
2239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    CallForwardInfo fi = new CallForwardInfo();
2249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    this.forwardingSettings[i] = fi;
2259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.reason = FORWARDING_SETTINGS_REASONS[i];
2269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.status = (fi.reason == CommandsInterface.CF_REASON_UNCONDITIONAL) ? 0 : 1;
2279440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
2289440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.toa = PhoneNumberUtils.TOA_International;
2299440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.number = forwardingNumber;
2309440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.timeSeconds = timeSeconds;
2319440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
2329440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
2339440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
2349440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2359440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public VoiceMailProviderSettings(String voicemailNumber, CallForwardInfo[] infos) {
2369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            this.voicemailNumber = voicemailNumber;
2379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            this.forwardingSettings = infos;
2389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
2399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2409440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        @Override
2419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public boolean equals(Object o) {
2429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (o == null) return false;
2439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (!(o instanceof VoiceMailProviderSettings)) return false;
2449440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final VoiceMailProviderSettings v = (VoiceMailProviderSettings)o;
2459440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return ((this.voicemailNumber == null &&
2479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        v.voicemailNumber == null) ||
2489440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    this.voicemailNumber != null &&
2499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        this.voicemailNumber.equals(v.voicemailNumber))
2509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    &&
2519440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    forwardingSettingsEqual(this.forwardingSettings,
2529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                            v.forwardingSettings);
2539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
2549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2559440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        private boolean forwardingSettingsEqual(CallForwardInfo[] infos1,
2569440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                CallForwardInfo[] infos2) {
2579440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (infos1 == infos2) return true;
2589440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (infos1 == null || infos2 == null) return false;
2599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (infos1.length != infos2.length) return false;
2609440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < infos1.length; i++) {
2619440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                CallForwardInfo i1 = infos1[i];
2629440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                CallForwardInfo i2 = infos2[i];
2639440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (i1.status != i2.status ||
2649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    i1.reason != i2.reason ||
2659440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    i1.serviceClass != i2.serviceClass ||
2669440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    i1.toa != i2.toa ||
2679440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    i1.number != i2.number ||
2689440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    i1.timeSeconds != i2.timeSeconds) {
2699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    return false;
2709440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
2719440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
2729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return true;
2739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
2749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        @Override
2769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public String toString() {
2779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return voicemailNumber + ((forwardingSettings != null ) ? (", " +
2789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    forwardingSettings.toString()) : "");
2799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
2809440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2819440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public String voicemailNumber;
2829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public CallForwardInfo[] forwardingSettings;
2839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
2849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
285e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    SharedPreferences mPerProviderSavedVMNumbers;
286365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
287365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    /**
2889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Results of reading forwarding settings
2899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
2909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    CallForwardInfo[] mForwardingReadResults = null;
2919440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2929440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
2939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Result of forwarding number change
2949440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
2959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    AsyncResult[] mForwardingChangeResults = null;
2969440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2979440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
2989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Result of vm number change
2999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
3009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    AsyncResult mVoicemailChangeResult = null;
3019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
3029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
3039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Previous VM provider setting so we can return to it in case of failure.
3049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
3059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    String mPreviousVMProviderKey = null;
3069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
3079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
3089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Id of the dialog being currently shown.
3099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
3109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    int mCurrentDialogId = 0;
3119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
3129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
3139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Flag indicating that we are invoking settings for the voicemail provider programmatically
3149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * due to vm provider change.
3159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
3169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    boolean mVMProviderSettingsForced = false;
3178e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky
3188e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    /**
3198e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky     * Flag indicating that we are making changes to vm or fwd numbers
3208e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky     * due to vm provider change.
3218e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky     */
3228e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    boolean mChangingVMorFwdDueToProviderChange = false;
3238e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky
3249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
325bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * True if we are in the process of vm & fwd number change and vm has already been changed.
326bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * This is used to decide what to do in case of rollback.
327bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
328bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    boolean mVMChangeCompletedSuccesfully = false;
329bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
330bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
3314e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky     * True if we had full or partial failure setting forwarding numbers and so need to roll them
3324e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky     * back.
333bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
3344e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky    boolean mFwdChangesRequireRollback = false;
335bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
336bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
337bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * Id of error msg to display to user once we are done reverting the VM provider to the previous
338bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * one.
339bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
340bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    int mVMOrFwdSetError = 0;
341bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
342bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
343365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Data about discovered voice mail settings providers.
344365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Is populated by querying which activities can handle ACTION_CONFIGURE_VOICEMAIL.
345365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * They key in this map is package name + activity name.
346365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * We always add an entry for the default provider with a key of empty
347365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * string and intent value of null.
348365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * @see #initVoiceMailProviders.
349365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     */
350365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private Map<String, VoiceMailProvider> mVMProvidersData =
351365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        new HashMap<String, VoiceMailProvider>();
352b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
353b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /** string to hold old voicemail number as it is being updated. */
354b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private String mOldVmNumber;
355b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
3569440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // New call forwarding settings and vm number we will be setting
3579440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Need to save these since before we get to saving we need to asynchronously
3589440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // query the existing forwarding settings.
3599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    CallForwardInfo[] mNewFwdSettings;
3609440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    String mNewVMNumber;
361b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
362cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    TTYHandler ttyHandler;
363cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
364b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
365b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Click Listeners, handle click based on objects attached to UI.
366b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
367b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
368b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Click listener for all toggle events
369b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
370b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
371cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (preference == mSubMenuVoicemailSettings) {
372cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            return true;
373cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else if (preference == mButtonDTMF) {
374b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return true;
375a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        } else if (preference == mButtonTTY) {
376404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            return true;
3773800ac871d6548790ac6119bb68b9be0640af261David Krause        } else if (preference == mButtonAutoRetry) {
378cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            android.provider.Settings.System.putInt(mPhone.getContext().getContentResolver(),
379cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    android.provider.Settings.System.CALL_AUTO_RETRY,
380cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    mButtonAutoRetry.isChecked() ? 1 : 0);
381cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            return true;
382cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else if (preference == mButtonHAC) {
383cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int hac = mButtonHAC.isChecked() ? 1 : 0;
384cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            // Update HAC value in Settings database
385cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            Settings.System.putInt(mPhone.getContext().getContentResolver(),
386cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    Settings.System.HEARING_AID, hac);
387b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
388cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            // Update HAC Value in AudioManager
389cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mAudioManager.setParameter(HAC_KEY, hac != 0 ? HAC_VAL_ON : HAC_VAL_OFF);
390b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return true;
391365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        } else if (preference == mVoicemailSettings) {
392365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            if (preference.getIntent() != null) {
3937c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                if (DBG) log("Invoking cfg intent " + preference.getIntent().getPackage());
394365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                this.startActivityForResult(preference.getIntent(), VOICEMAIL_PROVIDER_CFG_ID);
395365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            } else {
3967c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                if (DBG) log("Opening VM number cfg dialog");
397365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                updateVoiceNumberField();
3987c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                mSubMenuVoicemailSettings.showPhoneNumberDialog();
399365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            }
400365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            return true;
401b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
402b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return false;
403b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
404b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
405b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /**
406b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Implemented to support onPreferenceChangeListener to look for preference
407cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause     * changes.
408b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     *
409cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause     * @param preference is the preference to be changed
410b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * @param objValue should be the value of the selection, NOT its localized
411b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * display value.
412b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
413b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public boolean onPreferenceChange(Preference preference, Object objValue) {
414cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (preference == mButtonDTMF) {
415cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int index = mButtonDTMF.findIndexOfValue((String) objValue);
416d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville            Settings.System.putInt(mPhone.getContext().getContentResolver(),
417d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville                    Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, index);
418cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else if (preference == mButtonTTY) {
419cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            handleTTYChange(preference, objValue);
420365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        } else if (preference == mVoicemailProviders) {
4217c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            mPreviousVMProviderKey = getCurrentVoicemailProviderKey();
4229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final String newProviderKey = (String)objValue;
4239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("VM provider changes to " + newProviderKey + " from " +
4249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    mPreviousVMProviderKey);
425bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (mPreviousVMProviderKey.equals(newProviderKey)) {
426bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (DBG) log("No change ");
427bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                return true;
428bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
4299440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            updateVMPreferenceWidgets(newProviderKey);
430e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
4319440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final VoiceMailProviderSettings newProviderSettings =
4329440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                loadSettingsForVoiceMailProvider(newProviderKey);
433e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
4349440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // If the user switches to a voice mail provider and we have a
4359440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // numbers stored for it we will automatically change the phone's
4369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // voice mail and forwarding number to the stored ones.
4379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // Otherwise we will bring up provider's configuration UI.
4389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
4399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (newProviderSettings == null) {
4404e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                // Force the user into a configuration of the chosen provider
4417c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                if (DBG) log("Saved preferences not found - invoking config");
4429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mVMProviderSettingsForced = true;
443e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky                simulatePreferenceClick(mVoicemailSettings);
444e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky            } else {
4457c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                if (DBG) log("Saved preferences found - switching to them");
4464e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                // Set this flag so if we get a failure we revert to previous provider
4474e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                mChangingVMorFwdDueToProviderChange = true;
4489440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                saveVoiceMailAndForwardingNumber(newProviderKey, newProviderSettings);
449e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky            }
450b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
451b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // always let the preference setting proceed.
452b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return true;
453b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
454b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
455b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Preference click listener invoked on OnDialogClosed for EditPhoneNumberPreference.
456b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public void onDialogClosed(EditPhoneNumberPreference preference, int buttonClicked) {
4579440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("onPreferenceClick: request preference click on dialog close: " +
4589440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                buttonClicked);
4599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (buttonClicked == DialogInterface.BUTTON_NEGATIVE) {
4609440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return;
4619440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
462b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (preference instanceof EditPhoneNumberPreference) {
463b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            EditPhoneNumberPreference epn = preference;
464b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
465b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (epn == mSubMenuVoicemailSettings) {
466b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                handleVMBtnClickRequest();
467b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
468b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
469b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
470b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
471b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /**
472b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Implemented for EditPhoneNumberPreference.GetDefaultNumberListener.
473b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * This method set the default values for the various
474b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * EditPhoneNumberPreference dialogs.
475b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
476b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public String onGetDefaultNumber(EditPhoneNumberPreference preference) {
477b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (preference == mSubMenuVoicemailSettings) {
478b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // update the voicemail number field, which takes care of the
479b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // mSubMenuVoicemailSettings itself, so we should return null.
480b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("updating default for voicemail dialog");
481b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            updateVoiceNumberField();
482b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return null;
483b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
484b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
485a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        String vmDisplay = mPhone.getVoiceMailNumber();
486b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (TextUtils.isEmpty(vmDisplay)) {
487b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // if there is no voicemail number, we just return null to
488b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // indicate no contribution.
489b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return null;
490b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
491b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
492b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // Return the voicemail number prepended with "VM: "
493b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (DBG) log("updating default for call forwarding dialogs");
494b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return getString(R.string.voicemail_abbreviated) + " " + vmDisplay;
495b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
496b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
497b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
498b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // override the startsubactivity call to make changes in state consistent.
499b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
500b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public void startActivityForResult(Intent intent, int requestCode) {
501b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (requestCode == -1) {
502b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // this is an intent requested from the preference framework.
503b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            super.startActivityForResult(intent, requestCode);
504b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
505b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
506b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
507b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (DBG) log("startSubActivity: starting requested subactivity");
508b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        super.startActivityForResult(intent, requestCode);
509b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
510b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
5119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void switchToPreviousVoicemailProvider() {
5129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("switchToPreviousVoicemailProvider " + mPreviousVMProviderKey);
5139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mPreviousVMProviderKey != null) {
5144e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky            if (mVMChangeCompletedSuccesfully || mFwdChangesRequireRollback) {
5154e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                // we have to revert with carrier
516bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                showDialog(VOICEMAIL_REVERTING_DIALOG);
517bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                VoiceMailProviderSettings prevSettings =
518bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    loadSettingsForVoiceMailProvider(mPreviousVMProviderKey);
519bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (mVMChangeCompletedSuccesfully) {
520bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mNewVMNumber = prevSettings.voicemailNumber;
521bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("have to revert VM to " + mNewVMNumber);
522bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mPhone.setVoiceMailNumber(
523bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            mPhone.getVoiceMailAlphaTag().toString(),
524bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            mNewVMNumber,
525bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            Message.obtain(mRevertOptionComplete, EVENT_VOICEMAIL_CHANGED));
526bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                }
5274e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                if (mFwdChangesRequireRollback) {
528bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("have to revert fwd");
529bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    final CallForwardInfo[] prevFwdSettings = prevSettings.forwardingSettings;
530bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (prevFwdSettings != null) {
531bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                        mForwardingChangeResults = new AsyncResult[mNewFwdSettings.length];
532bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                        for (int i = 0; i < prevFwdSettings.length; i++) {
533bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            CallForwardInfo fi = prevFwdSettings[i];
534bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            if (DBG) log("Reverting fwd #: " + i + ": " + fi.toString());
535bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            mPhone.setCallForwardingOption(
536bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                                    (fi.status == 1 ?
537bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                                            CommandsInterface.CF_ACTION_REGISTRATION :
538bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                                            CommandsInterface.CF_ACTION_DISABLE),
539bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                                    fi.reason,
540bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                                    fi.number,
541bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                                    fi.timeSeconds,
542bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                                    mRevertOptionComplete.obtainMessage(
543bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                                            EVENT_FORWARDING_CHANGED, i, 0));
544bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                         }
545bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    }
546bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                }
547bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            } else {
548bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (DBG) log("No need to revert");
549bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                onRevertDone();
550bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
551bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
552bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
553bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
554bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    void onRevertDone() {
555bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (DBG) log("Flipping provider key back to " + mPreviousVMProviderKey);
556bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        mVoicemailProviders.setValue(mPreviousVMProviderKey);
557bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        updateVMPreferenceWidgets(mPreviousVMProviderKey);
558bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        updateVoiceNumberField();
559bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (mVMOrFwdSetError != 0) {
560bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            showVMDialog(mVMOrFwdSetError);
561bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            mVMOrFwdSetError = 0;
5629440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
5639440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
5649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
565365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    // asynchronous result call after contacts are selected or after we return from
566365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    // a call to the VM settings provider.
567b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
568b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
569b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // there are cases where the contact picker may end up sending us more than one
570b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // request.  We want to ignore the request if we're not in the correct state.
571365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        if (requestCode ==  VOICEMAIL_PROVIDER_CFG_ID) {
5729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            boolean failure = false;
5739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
5749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // No matter how the processing of result goes lets clear the flag
5759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("mVMProviderSettingsForced: " + mVMProviderSettingsForced);
5769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final boolean isVMProviderSettingsForced = mVMProviderSettingsForced;
5779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mVMProviderSettingsForced = false;
5789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
5797c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            String vmNum = null;
580365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            if (resultCode != RESULT_OK) {
581365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                if (DBG) log("onActivityResult: vm provider cfg result not OK.");
5829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                failure = true;
5837c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            } else {
5847c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                if (data == null) {
5857c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    if (DBG) log("onActivityResult: vm provider cfg result has no data");
5867c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    failure = true;
5879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                } else {
5887c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    if (data.getBooleanExtra(SIGNOUT_EXTRA, false)) {
5897c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        if (DBG) log("Provider requested signout");
5907c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        if (isVMProviderSettingsForced) {
5917c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            if (DBG) log("Going back to previous provider on signout");
5927c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            switchToPreviousVoicemailProvider();
5937c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        } else {
5947c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            final String victim = getCurrentVoicemailProviderKey();
5957c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            if (DBG) log("Relaunching activity and ignoring " + victim);
5967c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            Intent i = new Intent(ACTION_ADD_VOICEMAIL);
5977c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            i.putExtra(IGNORE_PROVIDER_EXTRA, victim);
5987c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
5997c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            this.startActivity(i);
6007c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        }
6017c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        return;
6027c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    }
6037c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    vmNum = data.getStringExtra(VM_NUMBER_EXTRA);
6047c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    if (vmNum == null || vmNum.length() == 0) {
6057c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        if (DBG) log("onActivityResult: vm provider cfg result has no vmnum");
6067c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        failure = true;
6077c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    }
6089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
6099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
6109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (failure) {
6119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Failure in return from voicemail provider");
6129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (isVMProviderSettingsForced) {
6139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    switchToPreviousVoicemailProvider();
6149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                } else {
6159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    if (DBG) log("Not switching back the provider since this is not forced config");
6169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
617365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                return;
618365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            }
6198e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky            mChangingVMorFwdDueToProviderChange = isVMProviderSettingsForced;
6209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final String fwdNum = data.getStringExtra(FWD_NUMBER_EXTRA);
6219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
6229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // TODO(iliat): It would be nice to load the current network setting for this and
6239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // send it to the provider when it's config is invoked so it can use this as default
6249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final int fwdNumTime = data.getIntExtra(FWD_NUMBER_TIME_EXTRA, 20);
6259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
6269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("onActivityResult: vm provider cfg result " +
6279440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    (fwdNum != null ? "has" : " does not have") + " forwarding number");
6287c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            saveVoiceMailAndForwardingNumber(getCurrentVoicemailProviderKey(),
6299440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    new VoiceMailProviderSettings(vmNum, (String)fwdNum, fwdNumTime));
630365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            return;
631365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
632b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
633b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (resultCode != RESULT_OK) {
634b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("onActivityResult: contact picker result not OK.");
635b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
636b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
637b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
638b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        Cursor cursor = getContentResolver().query(data.getData(),
639b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                NUM_PROJECTION, null, null, null);
640b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if ((cursor == null) || (!cursor.moveToFirst())) {
641b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("onActivityResult: bad contact data, no results found.");
642b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
643b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
644b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
645b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        switch (requestCode) {
646b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            case VOICEMAIL_PREF_ID:
647b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mSubMenuVoicemailSettings.onPickActivityResult(cursor.getString(0));
648b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
649b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            default:
650b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                // TODO: may need exception here.
651b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
652b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
653b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
654b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Voicemail button logic
655b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private void handleVMBtnClickRequest() {
656b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // normally called on the dialog close.
657b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
658b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // Since we're stripping the formatting out on the getPhoneNumber()
659b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // call now, we won't need to do so here anymore.
660b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
6619440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        saveVoiceMailAndForwardingNumber(
6627c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                getCurrentVoicemailProviderKey(),
6639440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                new VoiceMailProviderSettings(mSubMenuVoicemailSettings.getPhoneNumber(),
6649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        FWD_SETTINGS_DONT_TOUCH));
665365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
666365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
6679440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void saveVoiceMailAndForwardingNumber(String key,
6689440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            VoiceMailProviderSettings newSettings) {
6699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("saveVoiceMailAndForwardingNumber: " + newSettings.toString());
6709440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mNewVMNumber = newSettings.voicemailNumber;
671b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // empty vm number == clearing the vm number ?
6729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mNewVMNumber == null) {
6739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mNewVMNumber = "";
6749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
6759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
6769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mNewFwdSettings = newSettings.forwardingSettings;
6779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("newFwdNumber " +
6789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                String.valueOf((mNewFwdSettings != null ? mNewFwdSettings.length : 0))
6799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                + " settings");
6809440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
6819440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // No fwd settings on CDMA
6829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
6839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("ignoring forwarding setting since this is CDMA phone");
6849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mNewFwdSettings = FWD_SETTINGS_DONT_TOUCH;
685b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
686b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
6879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        //throw a warning if the vm is the same and we do not touch forwarding.
6889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mNewVMNumber.equals(mOldVmNumber) && mNewFwdSettings == FWD_SETTINGS_DONT_TOUCH) {
689cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            showVMDialog(MSG_VM_NOCHANGE);
690b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
691b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
692b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
6939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        maybeSaveSettingsForVoicemailProvider(key, newSettings);
694bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        mVMChangeCompletedSuccesfully = false;
6954e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky        mFwdChangesRequireRollback = false;
696bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        mVMOrFwdSetError = 0;
6979440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // If we are switching to a non default provider - save previous forwarding
6989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // settings
6999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (!key.equals(mPreviousVMProviderKey) &&
7009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mPreviousVMProviderKey.equals(DEFAULT_VM_PROVIDER_KEY)) {
7019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Reading current forwarding settings");
7029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mForwardingReadResults = new CallForwardInfo[FORWARDING_SETTINGS_REASONS.length];
7039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < FORWARDING_SETTINGS_REASONS.length; i++) {
7049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mForwardingReadResults[i] = null;
7059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mPhone.getCallForwardingOption(FORWARDING_SETTINGS_REASONS[i],
7069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        mGetOptionComplete.obtainMessage(EVENT_FORWARDING_GET_COMPLETED, i, 0));
7079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
7089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            showDialog(VOICEMAIL_FWD_READING_DIALOG);
7099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
7109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            saveVoiceMailAndForwardingNumberStage2();
7119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
7139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private Handler mGetOptionComplete = new Handler() {
7159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        @Override
7169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public void handleMessage(Message msg) {
7179440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            AsyncResult result = (AsyncResult) msg.obj;
7189440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            switch (msg.what) {
7199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                case EVENT_FORWARDING_GET_COMPLETED:
7209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    handleForwardingSettingsReadResult(result, msg.arg1);
7219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    break;
7229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
7239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    };
7259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    void handleForwardingSettingsReadResult(AsyncResult ar, int idx) {
7279440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) Log.d(LOG_TAG, "handleForwardingSettingsReadResult: " + idx);
7289440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        Throwable error = null;
7299440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (ar.exception != null) {
7309440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "FwdRead: ar.exception=" +
7319440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    ar.exception.getMessage());
7329440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            error = ar.exception;
7339440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7349440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (ar.userObj instanceof Throwable) {
7359440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "FwdRead: userObj=" +
7369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    ((Throwable)ar.userObj).getMessage());
7379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            error = (Throwable)ar.userObj;
7389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7409440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // We may have already gotten an error and decided to ignore the other results.
7419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mForwardingReadResults == null) {
7429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "ignoring fwd reading result: " + idx);
7439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return;
7449440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7459440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // In case of error ignore other results, show an error dialog
7479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (error != null) {
7489440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Error discovered for fwd read : " + idx);
7499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mForwardingReadResults = null;
7509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dismissDialog(VOICEMAIL_FWD_READING_DIALOG);
7519440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            showVMDialog(MSG_FW_GET_EXCEPTION);
7529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return;
7539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7559440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // Get the forwarding info
7569440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        final CallForwardInfo cfInfoArray[] = (CallForwardInfo[]) ar.result;
7579440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CallForwardInfo fi = null;
7589440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        for (int i = 0 ; i < cfInfoArray.length; i++) {
7599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if ((cfInfoArray[i].serviceClass & CommandsInterface.SERVICE_CLASS_VOICE) != 0) {
7609440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                fi = cfInfoArray[i];
7619440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
7629440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
7639440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (fi == null) {
7659440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7669440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // In case we go nothing it means we need this reason disabled
7679440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // so create a CallForwardInfo for capturing this
7689440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Creating default info for " + idx);
7699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            fi = new CallForwardInfo();
7709440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            fi.status = 0;
7719440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            fi.reason = FORWARDING_SETTINGS_REASONS[idx];
7729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            fi.serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
7739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
7749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Got  " + fi.toString() + " for " + idx);
7759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mForwardingReadResults[idx] = fi;
7779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // Check if we got all the results already
7799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        boolean done = true;
7809440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        for (int i = 0; i < mForwardingReadResults.length; i++) {
7819440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (mForwardingReadResults[i] == null) {
7829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                done = false;
7839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
7849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
7859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (done) {
7879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Done receiving fwd info");
7889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dismissDialog(VOICEMAIL_FWD_READING_DIALOG);
7899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            maybeSaveSettingsForVoicemailProvider(DEFAULT_VM_PROVIDER_KEY,
7909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    new VoiceMailProviderSettings(this.mOldVmNumber, mForwardingReadResults));
7919440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            saveVoiceMailAndForwardingNumberStage2();
7929440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
7939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Not done receiving fwd info");
7949440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
7969440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7979440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Called after we are done saving the previous forwarding settings if
7989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // we needed.
7999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void saveVoiceMailAndForwardingNumberStage2() {
8009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mForwardingChangeResults = null;
8019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mVoicemailChangeResult = null;
8029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mNewFwdSettings != FWD_SETTINGS_DONT_TOUCH) {
8039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mForwardingChangeResults = new AsyncResult[mNewFwdSettings.length];
8049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < mNewFwdSettings.length; i++) {
8059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                CallForwardInfo fi = mNewFwdSettings[i];
8069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Setting fwd #: " + i + ": " + fi.toString());
8079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mPhone.setCallForwardingOption(
8089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        (fi.status == 1 ?
8099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                                CommandsInterface.CF_ACTION_REGISTRATION :
8109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                                CommandsInterface.CF_ACTION_DISABLE),
8119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        fi.reason,
8129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        fi.number,
8139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        fi.timeSeconds,
8149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        mSetOptionComplete.obtainMessage(EVENT_FORWARDING_CHANGED, i, 0));
8159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
8169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky             }
8179440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky             showDialog(VOICEMAIL_FWD_SAVING_DIALOG);
8189440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
8199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Not touching fwd #");
820bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            setVMNumberWithCarrier();
8219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
822bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
823bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
824bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    void setVMNumberWithCarrier() {
8259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("save voicemail #: " + mNewVMNumber);
826b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mPhone.setVoiceMailNumber(
827b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mPhone.getVoiceMailAlphaTag().toString(),
8289440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mNewVMNumber,
829b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                Message.obtain(mSetOptionComplete, EVENT_VOICEMAIL_CHANGED));
830b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
831b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
8329440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
833b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Callback to handle option update completions
834b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
835b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private Handler mSetOptionComplete = new Handler() {
836b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        @Override
837b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        public void handleMessage(Message msg) {
8389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            AsyncResult result = (AsyncResult) msg.obj;
8394e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky            boolean done = false;
840b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            switch (msg.what) {
841b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case EVENT_VOICEMAIL_CHANGED:
8429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    mVoicemailChangeResult = result;
843bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mVMChangeCompletedSuccesfully = checkVMChangeSuccess() == null;
844bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("VM change complete msg, VM change done = " +
845bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            String.valueOf(mVMChangeCompletedSuccesfully));
8464e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    done = true;
8479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    break;
8489440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                case EVENT_FORWARDING_CHANGED:
8499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    mForwardingChangeResults[msg.arg1] = result;
8504e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    if (result.exception != null) {
8514e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        if (DBG) log("Error in setting fwd# " + msg.arg1 + ": " +
8524e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                result.exception.getMessage());
8534e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    } else {
8544e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        if (DBG) log("Success in setting fwd# " + msg.arg1);
8554e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    }
856bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    final boolean completed = checkForwardingCompleted();
857bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (completed) {
8584e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        if (checkFwdChangeSuccess() == null) {
8594e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            if (DBG) log("Overall fwd changes completed ok, starting vm change");
8604e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            setVMNumberWithCarrier();
8614e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        } else {
8624e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            if (DBG) log("Overall fwd changes completed, failure");
8634e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            mFwdChangesRequireRollback = false;
8644e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            for (int i = 0; i < mForwardingChangeResults.length; i++) {
8654e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                if (mForwardingChangeResults[i].exception == null) {
8664e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                    // If at least one succeeded we have to revert
8674e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                    if (DBG) log("Rollback will be required");
8684e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                    mFwdChangesRequireRollback =true;
8694e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                    break;
8704e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                }
8714e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            }
8724e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            done = true;
8734e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        }
874bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    }
875b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
876b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                default:
877b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // TODO: should never reach this, may want to throw exception
878b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
8799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (done) {
8804e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                if (DBG) log("All VM provider related changes done");
8819440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (mForwardingChangeResults != null) {
8829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    dismissDialog(VOICEMAIL_FWD_SAVING_DIALOG);
8839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
8849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                handleSetVMOrFwdMessage();
8859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
886b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
887b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    };
888b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
889bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
890bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * Callback to handle option revert completions
891bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
892bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    private Handler mRevertOptionComplete = new Handler() {
893bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        @Override
894bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        public void handleMessage(Message msg) {
895bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            AsyncResult result = (AsyncResult) msg.obj;
896bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            switch (msg.what) {
897bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                case EVENT_VOICEMAIL_CHANGED:
898bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mVoicemailChangeResult = result;
899bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("VM revert complete msg");
900bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    break;
901bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                case EVENT_FORWARDING_CHANGED:
902bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mForwardingChangeResults[msg.arg1] = result;
9034e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    if (result.exception != null) {
9044e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        if (DBG) log("Error in reverting fwd# " + msg.arg1 + ": " +
9054e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                result.exception.getMessage());
9064e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    } else {
9074e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        if (DBG) log("Success in reverting fwd# " + msg.arg1);
9084e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    }
909bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("FWD revert complete msg ");
910bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    break;
911bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                default:
912bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    // TODO: should never reach this, may want to throw exception
913bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
914bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            final boolean done =
915bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                (!mVMChangeCompletedSuccesfully || mVoicemailChangeResult != null) &&
9164e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                (!mFwdChangesRequireRollback || checkForwardingCompleted());
917bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (done) {
918bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (DBG) log("All VM reverts done");
919bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                dismissDialog(VOICEMAIL_REVERTING_DIALOG);
920bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                onRevertDone();
921bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
922bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
923bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    };
924bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
925bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
926bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * @return true if forwarding change has completed
927bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
928bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    private boolean checkForwardingCompleted() {
929bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (mForwardingChangeResults == null) {
930bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            return true;
931bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
932bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        for (int i = 0; i < mForwardingChangeResults.length; i++) {
933bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (mForwardingChangeResults[i] == null) {
934bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                return false;
935bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
936bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
937bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        return true;
938bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
939bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
940bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * @return error string or null if successful
941bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
942bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    private String checkFwdChangeSuccess() {
943bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        for (int i = 0; i < mForwardingChangeResults.length; i++) {
944bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (mForwardingChangeResults[i].exception != null) {
945bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                final String msg = mForwardingChangeResults[i].exception.getMessage();
946bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (msg == null) {
947bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    return "";
948bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                }
949bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                return msg;
950bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
951bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
952bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        return null;
953bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
954bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
955bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
956bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * @return error string or null if succesfull
957bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
958bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    private String checkVMChangeSuccess() {
959bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (mVoicemailChangeResult.exception != null) {
960bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            final String msg = mVoicemailChangeResult.exception.getMessage();
961bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (msg == null) {
962bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                return "";
963bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
964bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            return msg;
965bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
966bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        return null;
967bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
968bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
9699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void handleSetVMOrFwdMessage() {
970b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (DBG) {
971b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            log("handleSetVMMessage: set VM request complete");
972b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
9739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        boolean success = true;
9749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        boolean fwdFailure = false;
9759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        String exceptionMessage = "";
9769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mForwardingChangeResults != null) {
977bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            exceptionMessage = checkFwdChangeSuccess();
978bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (exceptionMessage != null) {
979bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                success = false;
980bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                fwdFailure = true;
9819440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
9829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
983bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (success) {
984bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            exceptionMessage = checkVMChangeSuccess();
985bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (exceptionMessage != null) {
986bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                success = false;
987bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
9889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
9899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (success) {
990b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("change VM success!");
9918e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky            handleVMAndFwdSetSuccess(MSG_VM_OK);
992bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            updateVoiceNumberField();
993b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        } else {
9949440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (fwdFailure) {
9959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                log("change FW failed: " + exceptionMessage);
9968e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky                handleVMOrFwdSetError(MSG_FW_SET_EXCEPTION);
9979440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            } else {
9989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                log("change VM failed: " + exceptionMessage);
9998e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky                handleVMOrFwdSetError(MSG_VM_EXCEPTION);
10009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
1001b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
1002b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1003b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
10048e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    private void handleVMOrFwdSetError(int msgId) {
10058e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        if (mChangingVMorFwdDueToProviderChange) {
1006bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            mVMOrFwdSetError = msgId;
1007bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            mChangingVMorFwdDueToProviderChange = false;
10088e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky            switchToPreviousVoicemailProvider();
1009bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            return;
10108e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        }
10118e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        mChangingVMorFwdDueToProviderChange = false;
10128e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        showVMDialog(msgId);
1013bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        updateVoiceNumberField();
10148e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    }
10158e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky
10168e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    private void handleVMAndFwdSetSuccess(int msgId) {
10178e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        mChangingVMorFwdDueToProviderChange = false;
10188e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        showVMDialog(msgId);
10198e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    }
10208e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky
1021b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
1022b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Methods used to sync UI state with that of the network
1023b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
1024b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // update the voicemail number from what we've recorded on the sim.
1025b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private void updateVoiceNumberField() {
10264ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        if (mSubMenuVoicemailSettings == null) {
10274ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            return;
10284ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        }
1029404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1030b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mOldVmNumber = mPhone.getVoiceMailNumber();
1031b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (mOldVmNumber == null) {
1032b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            mOldVmNumber = "";
1033b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
1034b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mSubMenuVoicemailSettings.setPhoneNumber(mOldVmNumber);
1035365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final String summary = (mOldVmNumber.length() > 0) ? mOldVmNumber :
1036365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            getString(R.string.voicemail_number_not_set);
1037365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mSubMenuVoicemailSettings.setSummary(summary);
1038b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1039b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1040b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
1041b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Helper Methods for Activity class.
1042b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * The inital query commands are split into two pieces now
1043b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * for individual expansion.  This combined with the ability
1044b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * to cancel queries allows for a much better user experience,
1045b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * and also ensures that the user only waits to update the
1046b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * data that is relevant.
1047b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
1048b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1049b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // dialog creation method, called by showDialog()
1050b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
1051b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    protected Dialog onCreateDialog(int id) {
10529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mCurrentDialogId = id;
1053cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if ((id == VM_RESPONSE_ERROR) || (id == VM_NOCHANGE_ERROR) ||
10549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            (id == FW_SET_RESPONSE_ERROR) || (id == FW_GET_RESPONSE_ERROR) ||
1055cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                (id == VOICEMAIL_DIALOG_CONFIRM)) {
1056b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1057b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            AlertDialog.Builder b = new AlertDialog.Builder(this);
1058b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1059b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            int msgId;
1060b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            int titleId = R.string.error_updating_title;
1061b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            switch (id) {
1062b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case VOICEMAIL_DIALOG_CONFIRM:
1063b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.vm_changed;
1064b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    titleId = R.string.voicemail;
1065b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 2
1066b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setNegativeButton(R.string.close_dialog, this);
1067b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
1068b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case VM_NOCHANGE_ERROR:
1069b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // even though this is technically an error,
1070b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // keep the title friendly.
1071b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.no_change;
1072b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    titleId = R.string.voicemail;
1073b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 2
1074b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setNegativeButton(R.string.close_dialog, this);
1075b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
1076b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case VM_RESPONSE_ERROR:
1077b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.vm_change_failed;
1078b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 1
1079b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setPositiveButton(R.string.close_dialog, this);
1080b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
10819440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                case FW_SET_RESPONSE_ERROR:
10829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    msgId = R.string.fw_change_failed;
10839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    // Set Button 1
10849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    b.setPositiveButton(R.string.close_dialog, this);
10859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    break;
10869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                case FW_GET_RESPONSE_ERROR:
10879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    msgId = R.string.fw_get_in_vm_failed;
10889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    b.setPositiveButton(R.string.alert_dialog_yes, this);
10899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    b.setNegativeButton(R.string.alert_dialog_no, this);
10909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    break;
1091b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                default:
1092b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.exception_error;
1093b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 3, tells the activity that the error is
1094b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // not recoverable on dialog exit.
1095b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setNeutralButton(R.string.close_dialog, this);
1096b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
1097b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
1098b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1099b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            b.setTitle(getText(titleId));
11009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            String message = getText(msgId).toString();
11019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            b.setMessage(message);
1102b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            b.setCancelable(false);
1103b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            AlertDialog dialog = b.create();
1104b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1105b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // make the dialog more obvious by bluring the background.
1106b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
1107b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1108b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return dialog;
1109bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        } else if (id == VOICEMAIL_FWD_SAVING_DIALOG || id == VOICEMAIL_FWD_READING_DIALOG ||
1110bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                id == VOICEMAIL_REVERTING_DIALOG) {
11119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            ProgressDialog dialog = new ProgressDialog(this);
11129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dialog.setTitle(getText(R.string.updating_title));
11139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dialog.setIndeterminate(true);
11149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dialog.setCancelable(false);
11159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dialog.setMessage(getText(
1116bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    id == VOICEMAIL_FWD_SAVING_DIALOG ? R.string.updating_settings :
1117bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    (id == VOICEMAIL_REVERTING_DIALOG ? R.string.reverting_settings :
1118bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    R.string.reading_settings)));
11199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return dialog;
1120b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
1121b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
11229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
1123b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return null;
1124b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1125b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1126b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // This is a method implemented for DialogInterface.OnClickListener.
1127b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Used with the error dialog to close the app, voicemail dialog to just dismiss.
11289440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Close button is mapped to BUTTON_POSITIVE for the errors that close the activity,
11299440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // while those that are mapped to BUTTON_NEUTRAL only move the preference focus.
1130b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public void onClick(DialogInterface dialog, int which) {
1131b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        dialog.dismiss();
1132b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        switch (which){
11339440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case DialogInterface.BUTTON_NEUTRAL:
11349440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Neutral button");
1135b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
11369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case DialogInterface.BUTTON_NEGATIVE:
11379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Negative button");
11389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (mCurrentDialogId == FW_GET_RESPONSE_ERROR) {
11399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    // We failed to get current forwarding settings and the user
114030225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky                    // does not wish to continue.
11419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    switchToPreviousVoicemailProvider();
11429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
11439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
11449440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case DialogInterface.BUTTON_POSITIVE:
11459440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Positive button");
11469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (mCurrentDialogId == FW_GET_RESPONSE_ERROR) {
11479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    // We failed to get current forwarding settings but the user
11489440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    // wishes to continue changing settings to the new vm provider
11499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    saveVoiceMailAndForwardingNumberStage2();
11509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                } else {
11519440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    finish();
11529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
115330225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky                return;
1154b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            default:
1155b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                // just let the dialog close and go back to the input
1156b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
115730225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        // In all dialogs, all buttons except BUTTON_POSITIVE lead to the end of user interaction
115830225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        // with settings UI. If we were called to explicitly configure voice mail then
115930225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        // we finish the settings activity here to come back to whatever the user was doing.
116030225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL)) {
116130225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky            finish();
116230225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        }
1163b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1164b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1165b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // set the app state with optional status.
1166cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private void showVMDialog(int msgStatus) {
1167cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        switch (msgStatus) {
1168cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_VM_EXCEPTION:
1169cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                showDialog(VM_RESPONSE_ERROR);
1170b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
11719440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case MSG_FW_SET_EXCEPTION:
11729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                showDialog(FW_SET_RESPONSE_ERROR);
11739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
11749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case MSG_FW_GET_EXCEPTION:
11759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                showDialog(FW_GET_RESPONSE_ERROR);
11769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
1177cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_VM_NOCHANGE:
1178cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                showDialog(VM_NOCHANGE_ERROR);
1179b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
1180cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_VM_OK:
1181cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                showDialog(VOICEMAIL_DIALOG_CONFIRM);
1182b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
1183cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_OK:
1184cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            default:
1185cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                // This should never happen.
1186a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
1187a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville    }
1188404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1189b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
1190b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Activity class methods
1191b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
1192b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1193b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
1194b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    protected void onCreate(Bundle icicle) {
1195b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        super.onCreate(icicle);
11969440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("Creating activity");
1197a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        mPhone = PhoneFactory.getDefaultPhone();
1198b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1199cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        addPreferencesFromResource(R.xml.call_feature_setting);
1200cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1201cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
1202cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1203b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // get buttons
1204b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        PreferenceScreen prefSet = getPreferenceScreen();
1205365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mSubMenuVoicemailSettings = (EditPhoneNumberPreference)findPreference(BUTTON_VOICEMAIL_KEY);
12064ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        if (mSubMenuVoicemailSettings != null) {
12074ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            mSubMenuVoicemailSettings.setParentActivity(this, VOICEMAIL_PREF_ID, this);
12084ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            mSubMenuVoicemailSettings.setDialogOnClosedListener(this);
12094ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            mSubMenuVoicemailSettings.setDialogTitle(R.string.voicemail_settings_number_label);
12104ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        }
1211404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1212cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonDTMF = (ListPreference) findPreference(BUTTON_DTMF_KEY);
1213cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonAutoRetry = (CheckBoxPreference) findPreference(BUTTON_RETRY_KEY);
1214cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonHAC = (CheckBoxPreference) findPreference(BUTTON_HAC_KEY);
1215cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonTTY = (ListPreference) findPreference(BUTTON_TTY_KEY);
1216365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVoicemailProviders = (ListPreference) findPreference(BUTTON_VOICEMAIL_PROVIDER_KEY);
1217b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky        if (mVoicemailProviders != null) {
1218b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            mVoicemailProviders.setOnPreferenceChangeListener(this);
1219b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            mVoicemailSettings = (PreferenceScreen)findPreference(BUTTON_VOICEMAIL_SETTING_KEY);
1220b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1221b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            initVoiceMailProviders();
1222b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky        }
1223cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (getResources().getBoolean(R.bool.dtmf_type_enabled)) {
1224cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonDTMF.setOnPreferenceChangeListener(this);
1225cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else {
1226cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(mButtonDTMF);
1227cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonDTMF = null;
12285b269ecd49279c3c4f85f55fa4fd4baa88e3a54bjsh        }
1229b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1230cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (getResources().getBoolean(R.bool.auto_retry_enabled)) {
1231cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonAutoRetry.setOnPreferenceChangeListener(this);
1232cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else {
1233cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(mButtonAutoRetry);
1234cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonAutoRetry = null;
1235cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1236b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1237cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (getResources().getBoolean(R.bool.hac_enabled)) {
1238cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonHAC.setOnPreferenceChangeListener(this);
1239cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else {
1240cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(mButtonHAC);
1241cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonHAC = null;
1242cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1243b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1244cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (getResources().getBoolean(R.bool.tty_enabled)) {
1245cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonTTY.setOnPreferenceChangeListener(this);
1246cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            ttyHandler = new TTYHandler();
1247b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        } else {
1248cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(mButtonTTY);
1249cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonTTY = null;
1250cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1251cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1252cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (!getResources().getBoolean(R.bool.world_phone)) {
1253cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(prefSet.findPreference(BUTTON_CDMA_OPTIONS));
1254cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(prefSet.findPreference(BUTTON_GSM_UMTS_OPTIONS));
1255cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
125679b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink            int phoneType = mPhone.getPhoneType();
125779b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink            if (phoneType == Phone.PHONE_TYPE_CDMA) {
1258cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                prefSet.removePreference(prefSet.findPreference(BUTTON_FDN_KEY));
1259cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                addPreferencesFromResource(R.xml.cdma_call_options);
126079b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink            } else if (phoneType == Phone.PHONE_TYPE_GSM) {
1261cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                addPreferencesFromResource(R.xml.gsm_umts_call_options);
126279b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink            } else {
126379b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink                throw new IllegalStateException("Unexpected phone type: " + phoneType);
1264b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
1265b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
1266b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1267cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        // create intent to bring up contact list
1268cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mContactListIntent = new Intent(Intent.ACTION_GET_CONTENT);
1269cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mContactListIntent.setType(android.provider.Contacts.Phones.CONTENT_ITEM_TYPE);
1270cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1271cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        // check the intent that started this activity and pop up the voicemail
1272cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        // dialog if we've been asked to.
12736da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // If we have at least one non default VM provider registered then bring up
12746da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // the selection for the VM provider, otherwise bring up a VM number dialog.
12756da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // We only bring up the dialog the first time we are called (not after orientation change)
12766da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        if (icicle == null) {
1277b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL) &&
1278b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky                    mVoicemailProviders != null) {
12796da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                if (mVMProvidersData.size() > 1) {
12806da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                    simulatePreferenceClick(mVoicemailProviders);
12816da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                } else {
12829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    onPreferenceChange(mVoicemailProviders, DEFAULT_VM_PROVIDER_KEY);
12839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    mVoicemailProviders.setValue(DEFAULT_VM_PROVIDER_KEY);
12846da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                }
12856da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            }
1286cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1287b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        updateVoiceNumberField();
12889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mVMProviderSettingsForced = false;
1289b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1290b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1291b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
1292cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    protected void onResume() {
1293cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        super.onResume();
1294b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1295cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonDTMF != null) {
1296cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int dtmf = Settings.System.getInt(getContentResolver(),
1297cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, DTMF_TONE_TYPE_NORMAL);
1298cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonDTMF.setValueIndex(dtmf);
1299cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1300d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
1301cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonAutoRetry != null) {
1302cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int autoretry = Settings.System.getInt(getContentResolver(),
1303cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    Settings.System.CALL_AUTO_RETRY, 0);
1304cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonAutoRetry.setChecked(autoretry != 0);
1305d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville        }
13063800ac871d6548790ac6119bb68b9be0640af261David Krause
1307cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonHAC != null) {
1308cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int hac = Settings.System.getInt(getContentResolver(), Settings.System.HEARING_AID, 0);
1309cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonHAC.setChecked(hac != 0);
1310cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1311d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
1312cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonTTY != null) {
1313cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mPhone.queryTTYMode(ttyHandler.obtainMessage(TTYHandler.EVENT_TTY_MODE_GET));
1314cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1315b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1316b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1317cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private void handleTTYChange(Preference preference, Object objValue) {
1318404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        int buttonTtyMode;
1319404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        buttonTtyMode = Integer.valueOf((String) objValue).intValue();
1320404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        int settingsTtyMode = android.provider.Settings.Secure.getInt(
1321cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                getContentResolver(),
1322404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                android.provider.Settings.Secure.PREFERRED_TTY_MODE, preferredTtyMode);
1323cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (DBG) log("handleTTYChange: requesting set TTY mode enable (TTY) to" +
1324404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                Integer.toString(buttonTtyMode));
1325404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1326404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        if (buttonTtyMode != settingsTtyMode) {
1327404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            switch(buttonTtyMode) {
1328404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_OFF:
1329404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_FULL:
1330404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_HCO:
1331404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_VCO:
1332cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                mPhone.setTTYMode(buttonTtyMode,
1333cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                        ttyHandler.obtainMessage(TTYHandler.EVENT_TTY_MODE_SET));
1334404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                break;
1335404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            default:
1336404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                mPhone.setTTYMode(Phone.TTY_MODE_OFF,
1337cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                        ttyHandler.obtainMessage(TTYHandler.EVENT_TTY_MODE_SET));
1338404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            }
1339404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        }
1340a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville    }
1341a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1342cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    class TTYHandler extends Handler {
1343cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        /** Event for TTY mode change */
1344cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        private static final int EVENT_TTY_MODE_GET = 700;
1345cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        private static final int EVENT_TTY_MODE_SET = 800;
1346a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1347a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        @Override
1348a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        public void handleMessage(Message msg) {
1349a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville            switch (msg.what) {
1350cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                case EVENT_TTY_MODE_GET:
1351cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    handleQueryTTYModeResponse(msg);
1352404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                    break;
1353404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                case EVENT_TTY_MODE_SET:
1354cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    handleSetTTYModeResponse(msg);
1355a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville                    break;
1356404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            }
1357404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        }
1358404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1359cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        private void updatePreferredTtyModeSummary(int TtyMode) {
1360cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            String [] txts = getResources().getStringArray(R.array.tty_mode_entries);
1361cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            switch(TtyMode) {
1362cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                case Phone.TTY_MODE_OFF:
1363cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                case Phone.TTY_MODE_HCO:
1364cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                case Phone.TTY_MODE_VCO:
1365cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                case Phone.TTY_MODE_FULL:
1366cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    mButtonTTY.setSummary(txts[TtyMode]);
1367a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville                    break;
1368a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville                default:
1369cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    mButtonTTY.setEnabled(false);
1370cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    mButtonTTY.setSummary(txts[Phone.TTY_MODE_OFF]);
1371a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville            }
1372a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
1373a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1374cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        private void handleQueryTTYModeResponse(Message msg) {
1375cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            AsyncResult ar = (AsyncResult) msg.obj;
1376cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            if (ar.exception != null) {
1377cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                if (DBG) log("handleQueryTTYModeResponse: Error getting TTY state.");
1378cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                mButtonTTY.setEnabled(false);
1379cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            } else {
1380cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                if (DBG) log("handleQueryTTYModeResponse: TTY enable state successfully queried.");
1381a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1382cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                int ttymode = ((int[]) ar.result)[0];
1383cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                if (DBG) log("handleQueryTTYModeResponse:ttymode=" + ttymode);
1384a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1385cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                Intent ttyModeChanged = new Intent(TtyIntent.TTY_ENABLED_CHANGE_ACTION);
1386cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                ttyModeChanged.putExtra("ttyEnabled", ttymode != Phone.TTY_MODE_OFF);
1387cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                sendBroadcast(ttyModeChanged);
1388cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                android.provider.Settings.Secure.putInt(getContentResolver(),
1389cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                        android.provider.Settings.Secure.PREFERRED_TTY_MODE, ttymode );
1390cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                mButtonTTY.setValue(Integer.toString(ttymode));
1391cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                updatePreferredTtyModeSummary(ttymode);
1392a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville            }
1393a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
1394a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1395cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        private void handleSetTTYModeResponse(Message msg) {
1396cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            AsyncResult ar = (AsyncResult) msg.obj;
1397a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1398cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            if (ar.exception != null) {
1399cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                if (DBG) log("handleSetTTYModeResponse: Error setting TTY mode, ar.exception"
1400cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                        + ar.exception);
1401a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville            }
1402cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mPhone.queryTTYMode(ttyHandler.obtainMessage(TTYHandler.EVENT_TTY_MODE_GET));
1403a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
1404a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
14053800ac871d6548790ac6119bb68b9be0640af261David Krause    }
14063800ac871d6548790ac6119bb68b9be0640af261David Krause
1407b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static void log(String msg) {
1408b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        Log.d(LOG_TAG, msg);
1409b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1410365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1411365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    /**
1412365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Updates the look of the VM preference widgets based on current VM provider settings.
1413365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Note that the provider name is loaded form the found activity via loadLabel in
1414365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * initVoiceMailProviders in order for it to be localizable.
1415365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     */
1416365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private void updateVMPreferenceWidgets(String currentProviderSetting) {
1417365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final String key = currentProviderSetting;
1418365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final VoiceMailProvider provider = mVMProvidersData.get(key);
1419365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1420365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        /* This is the case when we are coming up on a freshly wiped phone and there is no
1421365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky         persisted value for the list preference mVoicemailProviders.
1422365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky         In this case we want to show the UI asking the user to select a voicemail provider as
1423365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky         opposed to silently falling back to default one. */
1424365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        if (provider == null) {
1425365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailProviders.setSummary(getString(R.string.sum_voicemail_choose_provider));
1426365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setSummary("");
1427365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setEnabled(false);
1428365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setIntent(null);
1429365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        } else {
1430365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            final String providerName = provider.name;
1431365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailProviders.setSummary(providerName);
1432365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setSummary(getApplicationContext().getString(
1433365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    R.string.voicemail_settings_for, providerName));
1434365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setEnabled(true);
1435365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setIntent(provider.intent);
1436365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
1437365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
1438365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1439365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    /**
1440365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Enumerates existing VM providers and puts their data into the list and populates
1441365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * the preference list objects with their names.
14426da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * In case we are called with ACTION_ADD_VOICEMAIL intent the intent may have
1443e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     * an extra string called IGNORE_PROVIDER_EXTRA with "package.activityName" of the provider
14446da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * which should be hidden when we bring up the list of possible VM providers to choose.
14456da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * This allows a provider which is being disabled (e.g. GV user logging out) to force the user
14466da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * to pick some other provider.
1447365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     */
1448365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private void initVoiceMailProviders() {
14499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mPerProviderSavedVMNumbers =
14509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            this.getApplicationContext().getSharedPreferences(
14519440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                VM_NUMBERS_SHARED_PREFERENCES_NAME, MODE_PRIVATE);
14529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
14536da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        String providerToIgnore = null;
14546da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL)) {
14559440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("ACTION_ADD_VOICEMAIL");
14569440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (getIntent().hasExtra(IGNORE_PROVIDER_EXTRA)) {
14579440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                providerToIgnore = getIntent().getStringExtra(IGNORE_PROVIDER_EXTRA);
14589440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
14599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("providerToIgnore=" + providerToIgnore);
14607c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            if (providerToIgnore != null) {
14617c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                deleteSettingsForVoicemailProvider(providerToIgnore);
14627c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            }
14636da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        }
14646da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
1465365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVMProvidersData.clear();
1466365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1467365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        // Stick the default element which is always there
1468365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final String myCarrier = getString(R.string.voicemail_default);
14699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mVMProvidersData.put(DEFAULT_VM_PROVIDER_KEY, new VoiceMailProvider(myCarrier, null));
1470365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1471365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        // Enumerate providers
1472365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        PackageManager pm = getPackageManager();
1473365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        Intent intent = new Intent();
1474365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        intent.setAction(ACTION_CONFIGURE_VOICEMAIL);
1475365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
14766da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        int len = resolveInfos.size() + 1; // +1 for the default choice we will insert.
1477365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
14786da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // Go through the list of discovered providers populating the data map
14796da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // skip the provider we were instructed to ignore if there was one
1480365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        for (int i = 0; i < resolveInfos.size(); i++) {
1481365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            final ResolveInfo ri= resolveInfos.get(i);
14826da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            final ActivityInfo currentActivityInfo = ri.activityInfo;
14836da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            final String key = makeKeyForActivity(currentActivityInfo);
14849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Loading " + key);
14856da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            if (key.equals(providerToIgnore)) {
14869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Ignoring " + key);
14876da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                len--;
14886da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                continue;
14896da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            }
1490365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            final String nameForDisplay = ri.loadLabel(pm).toString();
1491365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            Intent providerIntent = new Intent();
1492365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            providerIntent.setAction(ACTION_CONFIGURE_VOICEMAIL);
1493365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            providerIntent.setClassName(currentActivityInfo.packageName,
1494365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    currentActivityInfo.name);
1495365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVMProvidersData.put(
1496365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    key,
1497365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    new VoiceMailProvider(nameForDisplay, providerIntent));
14986da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
14996da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        }
15006da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
15016da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // Now we know which providers to display - create entries and values array for
15026da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // the list preference
15036da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        String [] entries = new String [len];
15046da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        String [] values = new String [len];
15056da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        entries[0] = myCarrier;
15069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        values[0] = DEFAULT_VM_PROVIDER_KEY;
15076da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        int entryIdx = 1;
15086da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        for (int i = 0; i < resolveInfos.size(); i++) {
15096da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            final String key = makeKeyForActivity(resolveInfos.get(i).activityInfo);
15106da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            if (!mVMProvidersData.containsKey(key)) {
15116da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                continue;
15126da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            }
15136da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            entries[entryIdx] = mVMProvidersData.get(key).name;
15146da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            values[entryIdx] = key;
15156da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            entryIdx++;
1516365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
1517365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1518365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVoicemailProviders.setEntries(entries);
1519365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVoicemailProviders.setEntryValues(values);
1520365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
15217c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky        mPreviousVMProviderKey = getCurrentVoicemailProviderKey();
15229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        updateVMPreferenceWidgets(mPreviousVMProviderKey);
1523365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
15246da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
15256da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    private String makeKeyForActivity(ActivityInfo ai) {
15269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        return ai.name;
15276da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    }
15286da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
15296da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    /**
15306da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * Simulates user clicking on a passed preference.
15316da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * Usually needed when the preference is a dialog preference and we want to invoke
15326da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * a dialog for this preference programmatically.
15336da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * TODO(iliat): figure out if there is a cleaner way to cause preference dlg to come up
15346da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     */
15356da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    private void simulatePreferenceClick(Preference preference) {
15366da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // Go through settings until we find our setting
15376da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // and then simulate a click on it to bring up the dialog
15386da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        final ListAdapter adapter = getPreferenceScreen().getRootAdapter();
15396da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        for (int idx = 0; idx < adapter.getCount(); idx++) {
15406da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            if (adapter.getItem(idx) == preference) {
15416da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                getPreferenceScreen().onItemClick(this.getListView(),
15426da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                        null, idx, adapter.getItemId(idx));
15436da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                break;
15446da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            }
15456da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        }
15466da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    }
1547e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
1548e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    /**
15499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Saves new VM provider settings associating them with the currently selected
15509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * provider if settings are different than the ones already stored for this
1551e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     * provider.
15529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Later on these will be used when the user switches a provider.
1553e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     */
15549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void maybeSaveSettingsForVoicemailProvider(String key,
15559440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            VoiceMailProviderSettings newSettings) {
1556b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky        if (mVoicemailProviders == null) {
1557b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            return;
1558b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky        }
15599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        final VoiceMailProviderSettings curSettings = loadSettingsForVoiceMailProvider(key);
15609440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (newSettings.equals(curSettings)) {
15619440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Not saving setting for " + key + " since they have not changed");
1562e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky            return;
1563e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky        }
15649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("Saving settings for " + key + ": " + newSettings.toString());
15659440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        Editor editor = mPerProviderSavedVMNumbers.edit();
15669440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        editor.putString(key + VM_NUMBER_TAG,newSettings.voicemailNumber);
15679440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        String fwdKey = key + FWD_SETTINGS_TAG;
15689440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CallForwardInfo[] s = newSettings.forwardingSettings;
15699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (s != FWD_SETTINGS_DONT_TOUCH) {
15709440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            editor.putInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, s.length);
15719440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < s.length; i++) {
15729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                final String settingKey = fwdKey + FWD_SETTING_TAG + String.valueOf(i);
15739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                final CallForwardInfo fi = s[i];
15749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                editor.putInt(settingKey + FWD_SETTING_STATUS, fi.status);
15759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                editor.putInt(settingKey + FWD_SETTING_REASON, fi.reason);
15769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                editor.putString(settingKey + FWD_SETTING_NUMBER, fi.number);
15779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                editor.putInt(settingKey + FWD_SETTING_TIME, fi.timeSeconds);
15789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
15799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
15809440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            editor.putInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
15819440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
15829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        editor.commit();
1583e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    }
1584e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
1585e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    /**
15869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Returns settings previously stored for the currently selected
1587e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     * voice mail provider. If none is stored returns null.
15889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * If the user switches to a voice mail provider and we have settings
1589e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     * stored for it we will automatically change the phone's voice mail number
15909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * and forwarding number to the stored one. Otherwise we will bring up provider's configuration
15919440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * UI.
1592e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     */
15939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private VoiceMailProviderSettings loadSettingsForVoiceMailProvider(String key) {
15949440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        final String vmNumberSetting = mPerProviderSavedVMNumbers.getString(key + VM_NUMBER_TAG,
15959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                null);
15969440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (vmNumberSetting == null) {
15979440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Settings for " + key + " not found");
15989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return null;
15999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
16009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
16019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CallForwardInfo[] cfi = FWD_SETTINGS_DONT_TOUCH;
16029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        String fwdKey = key + FWD_SETTINGS_TAG;
16039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        final int fwdLen = mPerProviderSavedVMNumbers.getInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
16049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (fwdLen > 0) {
16059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            cfi = new CallForwardInfo[fwdLen];
16069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < cfi.length; i++) {
16079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                final String settingKey = fwdKey + FWD_SETTING_TAG + String.valueOf(i);
16089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i] = new CallForwardInfo();
16099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].status = mPerProviderSavedVMNumbers.getInt(
16109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        settingKey + FWD_SETTING_STATUS, 0);
16119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].reason = mPerProviderSavedVMNumbers.getInt(
16129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        settingKey + FWD_SETTING_REASON,
16139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        CommandsInterface.CF_REASON_ALL_CONDITIONAL);
16149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
16159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].toa = PhoneNumberUtils.TOA_International;
16169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].number = mPerProviderSavedVMNumbers.getString(
16179440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        settingKey + FWD_SETTING_NUMBER, "");
16189440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].timeSeconds = mPerProviderSavedVMNumbers.getInt(
16199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        settingKey + FWD_SETTING_TIME, 20);
16209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
16219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
16229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
16239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        VoiceMailProviderSettings settings =  new VoiceMailProviderSettings(vmNumberSetting, cfi);
16249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("Loaded settings for " + key + ": " + settings.toString());
16259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        return settings;
16269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
16279440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
16289440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
16299440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Deletes settings for the specified provider.
16309440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
16319440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void deleteSettingsForVoicemailProvider(String key) {
16329440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("Deleting settings for" + key);
16339440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mVoicemailProviders == null) {
16349440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return;
16359440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
16369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mPerProviderSavedVMNumbers.edit()
16379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            .putString(key + VM_NUMBER_TAG, null)
16389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            .putInt(key + FWD_SETTINGS_TAG + FWD_SETTINGS_LENGTH_TAG, 0)
16399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            .commit();
1640e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    }
16417c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky
16427c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky    private String getCurrentVoicemailProviderKey() {
16437c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky        final String key = mVoicemailProviders.getValue();
16447c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky        return (key != null) ? key : DEFAULT_VM_PROVIDER_KEY;
16457c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky    }
1646b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project}
1647