CallFeaturesSetting.java revision 3897278c8d39ac3ede871e4f9f963d145f6e895d
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    /**
331bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * True if we are in the process of vm & fwd number change and fwd# has already been changed.
332bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * This is used to decide what to do in case of rollback.
333bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
334bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    boolean mFwdChangeCompletedSuccesfully = 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
364b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    private boolean mForeground;
365b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King
366b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    @Override
367b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    public void onPause() {
368b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        super.onPause();
369b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        mForeground = false;
370b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    }
371b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King
372b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
373b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Click Listeners, handle click based on objects attached to UI.
374b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
375b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
376b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Click listener for all toggle events
377b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
378b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
379cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (preference == mSubMenuVoicemailSettings) {
380cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            return true;
381cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else if (preference == mButtonDTMF) {
382b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return true;
383a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        } else if (preference == mButtonTTY) {
384404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            return true;
3853800ac871d6548790ac6119bb68b9be0640af261David Krause        } else if (preference == mButtonAutoRetry) {
386cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            android.provider.Settings.System.putInt(mPhone.getContext().getContentResolver(),
387cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    android.provider.Settings.System.CALL_AUTO_RETRY,
388cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    mButtonAutoRetry.isChecked() ? 1 : 0);
389cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            return true;
390cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else if (preference == mButtonHAC) {
391cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int hac = mButtonHAC.isChecked() ? 1 : 0;
392cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            // Update HAC value in Settings database
393cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            Settings.System.putInt(mPhone.getContext().getContentResolver(),
394cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    Settings.System.HEARING_AID, hac);
395b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
396cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            // Update HAC Value in AudioManager
397cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mAudioManager.setParameter(HAC_KEY, hac != 0 ? HAC_VAL_ON : HAC_VAL_OFF);
398b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return true;
399365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        } else if (preference == mVoicemailSettings) {
400365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            if (preference.getIntent() != null) {
4017c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                if (DBG) log("Invoking cfg intent " + preference.getIntent().getPackage());
402365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                this.startActivityForResult(preference.getIntent(), VOICEMAIL_PROVIDER_CFG_ID);
403365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            } else {
4047c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                if (DBG) log("Opening VM number cfg dialog");
405365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                updateVoiceNumberField();
4067c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                mSubMenuVoicemailSettings.showPhoneNumberDialog();
407365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            }
408365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            return true;
409b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
410b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return false;
411b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
412b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
413b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /**
414b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Implemented to support onPreferenceChangeListener to look for preference
415cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause     * changes.
416b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     *
417cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause     * @param preference is the preference to be changed
418b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * @param objValue should be the value of the selection, NOT its localized
419b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * display value.
420b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
421b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public boolean onPreferenceChange(Preference preference, Object objValue) {
422cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (preference == mButtonDTMF) {
423cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int index = mButtonDTMF.findIndexOfValue((String) objValue);
424d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville            Settings.System.putInt(mPhone.getContext().getContentResolver(),
425d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville                    Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, index);
426cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else if (preference == mButtonTTY) {
427cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            handleTTYChange(preference, objValue);
428365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        } else if (preference == mVoicemailProviders) {
429495e409315aa3181a562baeb9d586f633b9eedc2Virgil King            final String currentProviderKey = getCurrentVoicemailProviderKey();
4309440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final String newProviderKey = (String)objValue;
4319440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("VM provider changes to " + newProviderKey + " from " +
4329440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    mPreviousVMProviderKey);
433bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (mPreviousVMProviderKey.equals(newProviderKey)) {
434bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (DBG) log("No change ");
435bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                return true;
436bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
4379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            updateVMPreferenceWidgets(newProviderKey);
438e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
4393897278c8d39ac3ede871e4f9f963d145f6e895dIlia Tulchinsky            mPreviousVMProviderKey = currentProviderKey;
440495e409315aa3181a562baeb9d586f633b9eedc2Virgil King
4413897278c8d39ac3ede871e4f9f963d145f6e895dIlia Tulchinsky            updateVMPreferenceWidgets(newProviderKey);
442495e409315aa3181a562baeb9d586f633b9eedc2Virgil King
4439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final VoiceMailProviderSettings newProviderSettings =
4443897278c8d39ac3ede871e4f9f963d145f6e895dIlia Tulchinsky                    loadSettingsForVoiceMailProvider(newProviderKey);
445495e409315aa3181a562baeb9d586f633b9eedc2Virgil King
4469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // If the user switches to a voice mail provider and we have a
4473897278c8d39ac3ede871e4f9f963d145f6e895dIlia Tulchinsky            // numbers stored for it we will automatically change the
4483897278c8d39ac3ede871e4f9f963d145f6e895dIlia Tulchinsky            // phone's
4499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // voice mail and forwarding number to the stored ones.
4509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // Otherwise we will bring up provider's configuration UI.
451495e409315aa3181a562baeb9d586f633b9eedc2Virgil King
4529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (newProviderSettings == null) {
4537c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                if (DBG) log("Saved preferences not found - invoking config");
4549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mVMProviderSettingsForced = true;
4553897278c8d39ac3ede871e4f9f963d145f6e895dIlia Tulchinsky                // Force the user into a configuration of the chosen
4563897278c8d39ac3ede871e4f9f963d145f6e895dIlia Tulchinsky                // provider
457e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky                simulatePreferenceClick(mVoicemailSettings);
458e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky            } else {
4597c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                if (DBG) log("Saved preferences found - switching to them");
4609440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                saveVoiceMailAndForwardingNumber(newProviderKey, newProviderSettings);
461e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky            }
462b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
463b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // always let the preference setting proceed.
464b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return true;
465b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
466b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
467b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Preference click listener invoked on OnDialogClosed for EditPhoneNumberPreference.
468b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public void onDialogClosed(EditPhoneNumberPreference preference, int buttonClicked) {
4699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("onPreferenceClick: request preference click on dialog close: " +
4709440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                buttonClicked);
4719440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (buttonClicked == DialogInterface.BUTTON_NEGATIVE) {
4729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return;
4739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
474b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (preference instanceof EditPhoneNumberPreference) {
475b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            EditPhoneNumberPreference epn = preference;
476b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
477b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (epn == mSubMenuVoicemailSettings) {
478b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                handleVMBtnClickRequest();
479b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
480b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
481b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
482b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
483b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /**
484b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Implemented for EditPhoneNumberPreference.GetDefaultNumberListener.
485b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * This method set the default values for the various
486b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * EditPhoneNumberPreference dialogs.
487b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
488b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public String onGetDefaultNumber(EditPhoneNumberPreference preference) {
489b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (preference == mSubMenuVoicemailSettings) {
490b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // update the voicemail number field, which takes care of the
491b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // mSubMenuVoicemailSettings itself, so we should return null.
492b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("updating default for voicemail dialog");
493b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            updateVoiceNumberField();
494b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return null;
495b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
496b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
497a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        String vmDisplay = mPhone.getVoiceMailNumber();
498b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (TextUtils.isEmpty(vmDisplay)) {
499b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // if there is no voicemail number, we just return null to
500b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // indicate no contribution.
501b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return null;
502b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
503b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
504b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // Return the voicemail number prepended with "VM: "
505b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (DBG) log("updating default for call forwarding dialogs");
506b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return getString(R.string.voicemail_abbreviated) + " " + vmDisplay;
507b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
508b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
509b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
510b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // override the startsubactivity call to make changes in state consistent.
511b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
512b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public void startActivityForResult(Intent intent, int requestCode) {
513b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (requestCode == -1) {
514b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // this is an intent requested from the preference framework.
515b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            super.startActivityForResult(intent, requestCode);
516b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
517b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
518b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
519b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (DBG) log("startSubActivity: starting requested subactivity");
520b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        super.startActivityForResult(intent, requestCode);
521b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
522b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
5239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void switchToPreviousVoicemailProvider() {
5249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("switchToPreviousVoicemailProvider " + mPreviousVMProviderKey);
5259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mPreviousVMProviderKey != null) {
526bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (mVMChangeCompletedSuccesfully || mFwdChangeCompletedSuccesfully) { // we have to revert with carrier
527bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                showDialog(VOICEMAIL_REVERTING_DIALOG);
528bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                VoiceMailProviderSettings prevSettings =
529bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    loadSettingsForVoiceMailProvider(mPreviousVMProviderKey);
530bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (mVMChangeCompletedSuccesfully) {
531bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mNewVMNumber = prevSettings.voicemailNumber;
532bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("have to revert VM to " + mNewVMNumber);
533bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mPhone.setVoiceMailNumber(
534bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            mPhone.getVoiceMailAlphaTag().toString(),
535bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            mNewVMNumber,
536bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            Message.obtain(mRevertOptionComplete, EVENT_VOICEMAIL_CHANGED));
537bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                }
538bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (mFwdChangeCompletedSuccesfully) {
539bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("have to revert fwd");
540bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    final CallForwardInfo[] prevFwdSettings = prevSettings.forwardingSettings;
541bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (prevFwdSettings != null) {
542bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                        mForwardingChangeResults = new AsyncResult[mNewFwdSettings.length];
543bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                        for (int i = 0; i < prevFwdSettings.length; i++) {
544bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            CallForwardInfo fi = prevFwdSettings[i];
545bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            if (DBG) log("Reverting fwd #: " + i + ": " + fi.toString());
546bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            mPhone.setCallForwardingOption(
547bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                                    (fi.status == 1 ?
548bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                                            CommandsInterface.CF_ACTION_REGISTRATION :
549bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                                            CommandsInterface.CF_ACTION_DISABLE),
550bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                                    fi.reason,
551bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                                    fi.number,
552bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                                    fi.timeSeconds,
553bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                                    mRevertOptionComplete.obtainMessage(
554bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                                            EVENT_FORWARDING_CHANGED, i, 0));
555bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                         }
556bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    }
557bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                }
558bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            } else {
559bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (DBG) log("No need to revert");
560bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                onRevertDone();
561bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
562bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
563bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
564bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
565bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    void onRevertDone() {
566bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (DBG) log("Flipping provider key back to " + mPreviousVMProviderKey);
567bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        mVoicemailProviders.setValue(mPreviousVMProviderKey);
568bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        updateVMPreferenceWidgets(mPreviousVMProviderKey);
569bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        updateVoiceNumberField();
570bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (mVMOrFwdSetError != 0) {
571bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            showVMDialog(mVMOrFwdSetError);
572bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            mVMOrFwdSetError = 0;
5739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
5749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
5759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
576365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    // asynchronous result call after contacts are selected or after we return from
577365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    // a call to the VM settings provider.
578b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
579b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
580b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // there are cases where the contact picker may end up sending us more than one
581b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // request.  We want to ignore the request if we're not in the correct state.
582365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        if (requestCode ==  VOICEMAIL_PROVIDER_CFG_ID) {
5839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            boolean failure = false;
5849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
5859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // No matter how the processing of result goes lets clear the flag
5869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("mVMProviderSettingsForced: " + mVMProviderSettingsForced);
5879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final boolean isVMProviderSettingsForced = mVMProviderSettingsForced;
5889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mVMProviderSettingsForced = false;
5899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
5907c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            String vmNum = null;
591365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            if (resultCode != RESULT_OK) {
592365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                if (DBG) log("onActivityResult: vm provider cfg result not OK.");
5939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                failure = true;
5947c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            } else {
5957c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                if (data == null) {
5967c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    if (DBG) log("onActivityResult: vm provider cfg result has no data");
5977c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    failure = true;
5989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                } else {
5997c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    if (data.getBooleanExtra(SIGNOUT_EXTRA, false)) {
6007c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        if (DBG) log("Provider requested signout");
6017c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        if (isVMProviderSettingsForced) {
6027c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            if (DBG) log("Going back to previous provider on signout");
6037c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            switchToPreviousVoicemailProvider();
6047c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        } else {
6057c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            final String victim = getCurrentVoicemailProviderKey();
6067c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            if (DBG) log("Relaunching activity and ignoring " + victim);
6077c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            Intent i = new Intent(ACTION_ADD_VOICEMAIL);
6087c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            i.putExtra(IGNORE_PROVIDER_EXTRA, victim);
6097c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
6107c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            this.startActivity(i);
6117c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        }
6127c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        return;
6137c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    }
6147c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    vmNum = data.getStringExtra(VM_NUMBER_EXTRA);
6157c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    if (vmNum == null || vmNum.length() == 0) {
6167c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        if (DBG) log("onActivityResult: vm provider cfg result has no vmnum");
6177c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        failure = true;
6187c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    }
6199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
6209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
6219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (failure) {
6229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Failure in return from voicemail provider");
6239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (isVMProviderSettingsForced) {
6249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    switchToPreviousVoicemailProvider();
6259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                } else {
6269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    if (DBG) log("Not switching back the provider since this is not forced config");
6279440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
628365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                return;
629365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            }
6308e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky            mChangingVMorFwdDueToProviderChange = isVMProviderSettingsForced;
6319440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final String fwdNum = data.getStringExtra(FWD_NUMBER_EXTRA);
6329440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
6339440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // TODO(iliat): It would be nice to load the current network setting for this and
6349440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // send it to the provider when it's config is invoked so it can use this as default
6359440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final int fwdNumTime = data.getIntExtra(FWD_NUMBER_TIME_EXTRA, 20);
6369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
6379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("onActivityResult: vm provider cfg result " +
6389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    (fwdNum != null ? "has" : " does not have") + " forwarding number");
6397c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            saveVoiceMailAndForwardingNumber(getCurrentVoicemailProviderKey(),
640b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                    new VoiceMailProviderSettings(vmNum, fwdNum, fwdNumTime));
641365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            return;
642365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
643b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
644b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (resultCode != RESULT_OK) {
645b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("onActivityResult: contact picker result not OK.");
646b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
647b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
648b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
649b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        Cursor cursor = getContentResolver().query(data.getData(),
650b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                NUM_PROJECTION, null, null, null);
651b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if ((cursor == null) || (!cursor.moveToFirst())) {
652b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("onActivityResult: bad contact data, no results found.");
653b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
654b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
655b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
656b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        switch (requestCode) {
657b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            case VOICEMAIL_PREF_ID:
658b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mSubMenuVoicemailSettings.onPickActivityResult(cursor.getString(0));
659b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
660b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            default:
661b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                // TODO: may need exception here.
662b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
663b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
664b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
665b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Voicemail button logic
666b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private void handleVMBtnClickRequest() {
667b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // normally called on the dialog close.
668b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
669b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // Since we're stripping the formatting out on the getPhoneNumber()
670b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // call now, we won't need to do so here anymore.
671b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
6729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        saveVoiceMailAndForwardingNumber(
6737c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                getCurrentVoicemailProviderKey(),
6749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                new VoiceMailProviderSettings(mSubMenuVoicemailSettings.getPhoneNumber(),
6759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        FWD_SETTINGS_DONT_TOUCH));
676365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
677365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
678b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    private void showDialogIfForeground(int id) {
679b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        if (mForeground) {
680b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            showDialog(id);
681b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        }
682b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    }
683b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King
684b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    private void dismissDialogSafely(int id) {
685b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        try {
686b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            dismissDialog(id);
687b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        } catch (IllegalArgumentException e) {
688b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            // This is expected in the case where we were in the background
689b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            // at the time we would normally have shown the dialog, so we didn't
690b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            // show it.
691b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        }
692b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    }
693b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King
6949440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void saveVoiceMailAndForwardingNumber(String key,
6959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            VoiceMailProviderSettings newSettings) {
6969440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("saveVoiceMailAndForwardingNumber: " + newSettings.toString());
6979440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mNewVMNumber = newSettings.voicemailNumber;
698b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // empty vm number == clearing the vm number ?
6999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mNewVMNumber == null) {
7009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mNewVMNumber = "";
7019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mNewFwdSettings = newSettings.forwardingSettings;
7049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("newFwdNumber " +
7059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                String.valueOf((mNewFwdSettings != null ? mNewFwdSettings.length : 0))
7069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                + " settings");
7079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // No fwd settings on CDMA
7099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
7109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("ignoring forwarding setting since this is CDMA phone");
7119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mNewFwdSettings = FWD_SETTINGS_DONT_TOUCH;
712b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
713b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
7149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        //throw a warning if the vm is the same and we do not touch forwarding.
7159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mNewVMNumber.equals(mOldVmNumber) && mNewFwdSettings == FWD_SETTINGS_DONT_TOUCH) {
716cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            showVMDialog(MSG_VM_NOCHANGE);
717b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
718b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
719b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
7209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        maybeSaveSettingsForVoicemailProvider(key, newSettings);
721bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        mVMChangeCompletedSuccesfully = false;
722bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        mFwdChangeCompletedSuccesfully = false;
723bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        mVMOrFwdSetError = 0;
7249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // If we are switching to a non default provider - save previous forwarding
7259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // settings
7269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (!key.equals(mPreviousVMProviderKey) &&
7279440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mPreviousVMProviderKey.equals(DEFAULT_VM_PROVIDER_KEY)) {
7289440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Reading current forwarding settings");
7299440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mForwardingReadResults = new CallForwardInfo[FORWARDING_SETTINGS_REASONS.length];
7309440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < FORWARDING_SETTINGS_REASONS.length; i++) {
7319440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mForwardingReadResults[i] = null;
7329440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mPhone.getCallForwardingOption(FORWARDING_SETTINGS_REASONS[i],
7339440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        mGetOptionComplete.obtainMessage(EVENT_FORWARDING_GET_COMPLETED, i, 0));
7349440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
735b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            showDialogIfForeground(VOICEMAIL_FWD_READING_DIALOG);
7369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
7379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            saveVoiceMailAndForwardingNumberStage2();
7389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
7409440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private Handler mGetOptionComplete = new Handler() {
7429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        @Override
7439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public void handleMessage(Message msg) {
7449440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            AsyncResult result = (AsyncResult) msg.obj;
7459440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            switch (msg.what) {
7469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                case EVENT_FORWARDING_GET_COMPLETED:
7479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    handleForwardingSettingsReadResult(result, msg.arg1);
7489440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    break;
7499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
7509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7519440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    };
7529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    void handleForwardingSettingsReadResult(AsyncResult ar, int idx) {
7549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) Log.d(LOG_TAG, "handleForwardingSettingsReadResult: " + idx);
7559440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        Throwable error = null;
7569440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (ar.exception != null) {
7579440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "FwdRead: ar.exception=" +
7589440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    ar.exception.getMessage());
7599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            error = ar.exception;
7609440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7619440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (ar.userObj instanceof Throwable) {
7629440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "FwdRead: userObj=" +
7639440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    ((Throwable)ar.userObj).getMessage());
7649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            error = (Throwable)ar.userObj;
7659440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7669440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7679440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // We may have already gotten an error and decided to ignore the other results.
7689440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mForwardingReadResults == null) {
7699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "ignoring fwd reading result: " + idx);
7709440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return;
7719440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // In case of error ignore other results, show an error dialog
7749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (error != null) {
7759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Error discovered for fwd read : " + idx);
7769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mForwardingReadResults = null;
777b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            dismissDialogSafely(VOICEMAIL_FWD_READING_DIALOG);
7789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            showVMDialog(MSG_FW_GET_EXCEPTION);
7799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return;
7809440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7819440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // Get the forwarding info
7839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        final CallForwardInfo cfInfoArray[] = (CallForwardInfo[]) ar.result;
7849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CallForwardInfo fi = null;
7859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        for (int i = 0 ; i < cfInfoArray.length; i++) {
7869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if ((cfInfoArray[i].serviceClass & CommandsInterface.SERVICE_CLASS_VOICE) != 0) {
7879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                fi = cfInfoArray[i];
7889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
7899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
7909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7919440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (fi == null) {
7929440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // In case we go nothing it means we need this reason disabled
7949440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // so create a CallForwardInfo for capturing this
7959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Creating default info for " + idx);
7969440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            fi = new CallForwardInfo();
7979440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            fi.status = 0;
7989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            fi.reason = FORWARDING_SETTINGS_REASONS[idx];
7999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            fi.serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
8009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
8019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Got  " + fi.toString() + " for " + idx);
8029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
8039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mForwardingReadResults[idx] = fi;
8049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
8059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // Check if we got all the results already
8069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        boolean done = true;
8079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        for (int i = 0; i < mForwardingReadResults.length; i++) {
8089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (mForwardingReadResults[i] == null) {
8099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                done = false;
8109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
8119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
8129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
8139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (done) {
8149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Done receiving fwd info");
815b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            dismissDialogSafely(VOICEMAIL_FWD_READING_DIALOG);
8169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            maybeSaveSettingsForVoicemailProvider(DEFAULT_VM_PROVIDER_KEY,
8179440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    new VoiceMailProviderSettings(this.mOldVmNumber, mForwardingReadResults));
8189440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            saveVoiceMailAndForwardingNumberStage2();
8199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
8209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Not done receiving fwd info");
8219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
8229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
8239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
8249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Called after we are done saving the previous forwarding settings if
8259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // we needed.
8269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void saveVoiceMailAndForwardingNumberStage2() {
8279440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mForwardingChangeResults = null;
8289440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mVoicemailChangeResult = null;
8299440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mNewFwdSettings != FWD_SETTINGS_DONT_TOUCH) {
8309440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mForwardingChangeResults = new AsyncResult[mNewFwdSettings.length];
8319440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < mNewFwdSettings.length; i++) {
8329440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                CallForwardInfo fi = mNewFwdSettings[i];
8339440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Setting fwd #: " + i + ": " + fi.toString());
8349440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mPhone.setCallForwardingOption(
8359440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        (fi.status == 1 ?
8369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                                CommandsInterface.CF_ACTION_REGISTRATION :
8379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                                CommandsInterface.CF_ACTION_DISABLE),
8389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        fi.reason,
8399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        fi.number,
8409440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        fi.timeSeconds,
8419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        mSetOptionComplete.obtainMessage(EVENT_FORWARDING_CHANGED, i, 0));
8429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
8439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky             }
844b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King             showDialogIfForeground(VOICEMAIL_FWD_SAVING_DIALOG);
8459440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
8469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Not touching fwd #");
847bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            setVMNumberWithCarrier();
8489440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
849bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
850bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
851bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    void setVMNumberWithCarrier() {
8529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("save voicemail #: " + mNewVMNumber);
853b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mPhone.setVoiceMailNumber(
854b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mPhone.getVoiceMailAlphaTag().toString(),
8559440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mNewVMNumber,
856b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                Message.obtain(mSetOptionComplete, EVENT_VOICEMAIL_CHANGED));
857b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
858b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
8599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
860b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Callback to handle option update completions
861b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
862b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private Handler mSetOptionComplete = new Handler() {
863b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        @Override
864b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        public void handleMessage(Message msg) {
8659440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            AsyncResult result = (AsyncResult) msg.obj;
866b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            switch (msg.what) {
867b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case EVENT_VOICEMAIL_CHANGED:
8689440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    mVoicemailChangeResult = result;
869bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mVMChangeCompletedSuccesfully = checkVMChangeSuccess() == null;
870bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("VM change complete msg, VM change done = " +
871bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            String.valueOf(mVMChangeCompletedSuccesfully));
8729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    break;
8739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                case EVENT_FORWARDING_CHANGED:
8749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    mForwardingChangeResults[msg.arg1] = result;
875bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    final boolean completed = checkForwardingCompleted();
876bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (completed) {
877bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                        mFwdChangeCompletedSuccesfully = checkFwdChangeSuccess() == null;
878bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    }
879bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("FWD change complete msg " + msg.arg1 + ", completed=" +
880bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            String.valueOf(completed) + ", succesfully=" +
881bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            String.valueOf(mFwdChangeCompletedSuccesfully));
882bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (mFwdChangeCompletedSuccesfully) {
883bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                        setVMNumberWithCarrier();
884bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    }
885b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
886b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                default:
887b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // TODO: should never reach this, may want to throw exception
888b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
8899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // Check if we are done - either we are only setting vm and that is done
8909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // or we are setting both vm and fwd and both are done.
891bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            final boolean vmCompleted = mVoicemailChangeResult != null;
892bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
893bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            boolean done = false;
894bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (mForwardingChangeResults != null) {
895bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (checkForwardingCompleted()) {
896bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (!mFwdChangeCompletedSuccesfully) {
897bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                        done = true;
898bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    } else {
899bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                        done = vmCompleted;
9009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    }
9019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
902bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            } else {
903bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                done = vmCompleted;
9049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
9059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (done) {
9069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("All VM related changes done");
9079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (mForwardingChangeResults != null) {
908b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                    dismissDialogSafely(VOICEMAIL_FWD_SAVING_DIALOG);
9099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
9109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                handleSetVMOrFwdMessage();
9119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
912b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
913b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    };
914b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
915bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
916bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * Callback to handle option revert completions
917bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
918bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    private Handler mRevertOptionComplete = new Handler() {
919bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        @Override
920bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        public void handleMessage(Message msg) {
921bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            AsyncResult result = (AsyncResult) msg.obj;
922bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            switch (msg.what) {
923bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                case EVENT_VOICEMAIL_CHANGED:
924bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mVoicemailChangeResult = result;
925bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("VM revert complete msg");
926bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    break;
927bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                case EVENT_FORWARDING_CHANGED:
928bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mForwardingChangeResults[msg.arg1] = result;
929bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("FWD revert complete msg ");
930bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    break;
931bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                default:
932bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    // TODO: should never reach this, may want to throw exception
933bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
934bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            final boolean done =
935bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                (!mVMChangeCompletedSuccesfully || mVoicemailChangeResult != null) &&
936bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                (!mFwdChangeCompletedSuccesfully || checkForwardingCompleted());
937bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (done) {
938bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (DBG) log("All VM reverts done");
939bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                dismissDialog(VOICEMAIL_REVERTING_DIALOG);
940bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                onRevertDone();
941bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
942bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
943bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    };
944bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
945bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
946bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * @return true if forwarding change has completed
947bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
948bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    private boolean checkForwardingCompleted() {
949bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (mForwardingChangeResults == null) {
950bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            return true;
951bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
952bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        for (int i = 0; i < mForwardingChangeResults.length; i++) {
953bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (mForwardingChangeResults[i] == null) {
954bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                return false;
955bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
956bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
957bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        return true;
958bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
959bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
960bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * @return error string or null if successful
961bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
962bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    private String checkFwdChangeSuccess() {
963bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        for (int i = 0; i < mForwardingChangeResults.length; i++) {
964bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (mForwardingChangeResults[i].exception != null) {
965bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                final String msg = mForwardingChangeResults[i].exception.getMessage();
966bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (msg == null) {
967bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    return "";
968bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                }
969bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                return msg;
970bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
971bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
972bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        return null;
973bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
974bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
975bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
976bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * @return error string or null if succesfull
977bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
978bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    private String checkVMChangeSuccess() {
979bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (mVoicemailChangeResult.exception != null) {
980bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            final String msg = mVoicemailChangeResult.exception.getMessage();
981bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (msg == null) {
982bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                return "";
983bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
984bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            return msg;
985bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
986bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        return null;
987bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
988bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
9899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void handleSetVMOrFwdMessage() {
990b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (DBG) {
991b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            log("handleSetVMMessage: set VM request complete");
992b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
9939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        boolean success = true;
9949440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        boolean fwdFailure = false;
9959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        String exceptionMessage = "";
9969440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mForwardingChangeResults != null) {
997bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            exceptionMessage = checkFwdChangeSuccess();
998bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (exceptionMessage != null) {
999bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                success = false;
1000bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                fwdFailure = true;
10019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
10029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
1003bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (success) {
1004bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            exceptionMessage = checkVMChangeSuccess();
1005bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (exceptionMessage != null) {
1006bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                success = false;
1007bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
10089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
10099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (success) {
1010b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("change VM success!");
10118e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky            handleVMAndFwdSetSuccess(MSG_VM_OK);
1012bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            updateVoiceNumberField();
1013b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        } else {
10149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (fwdFailure) {
10159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                log("change FW failed: " + exceptionMessage);
10168e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky                handleVMOrFwdSetError(MSG_FW_SET_EXCEPTION);
10179440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            } else {
10189440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                log("change VM failed: " + exceptionMessage);
10198e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky                handleVMOrFwdSetError(MSG_VM_EXCEPTION);
10209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
1021b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
1022b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1023b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
10248e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    private void handleVMOrFwdSetError(int msgId) {
10258e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        if (mChangingVMorFwdDueToProviderChange) {
1026bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            mVMOrFwdSetError = msgId;
1027bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            mChangingVMorFwdDueToProviderChange = false;
10288e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky            switchToPreviousVoicemailProvider();
1029bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            return;
10308e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        }
10318e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        mChangingVMorFwdDueToProviderChange = false;
10328e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        showVMDialog(msgId);
1033bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        updateVoiceNumberField();
10348e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    }
10358e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky
10368e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    private void handleVMAndFwdSetSuccess(int msgId) {
10378e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        mChangingVMorFwdDueToProviderChange = false;
10388e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        showVMDialog(msgId);
10398e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    }
10408e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky
1041b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
1042b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Methods used to sync UI state with that of the network
1043b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
1044b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // update the voicemail number from what we've recorded on the sim.
1045b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private void updateVoiceNumberField() {
10464ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        if (mSubMenuVoicemailSettings == null) {
10474ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            return;
10484ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        }
1049404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1050b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mOldVmNumber = mPhone.getVoiceMailNumber();
1051b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (mOldVmNumber == null) {
1052b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            mOldVmNumber = "";
1053b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
1054b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mSubMenuVoicemailSettings.setPhoneNumber(mOldVmNumber);
1055365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final String summary = (mOldVmNumber.length() > 0) ? mOldVmNumber :
1056365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            getString(R.string.voicemail_number_not_set);
1057365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mSubMenuVoicemailSettings.setSummary(summary);
1058b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1059b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1060b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
1061b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Helper Methods for Activity class.
1062b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King     * The initial query commands are split into two pieces now
1063b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * for individual expansion.  This combined with the ability
1064b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * to cancel queries allows for a much better user experience,
1065b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * and also ensures that the user only waits to update the
1066b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * data that is relevant.
1067b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
1068b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1069b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    @Override
1070b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    protected void onPrepareDialog(int id, Dialog dialog) {
1071b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        super.onPrepareDialog(id, dialog);
1072b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        mCurrentDialogId = id;
1073b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    }
1074b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King
1075b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // dialog creation method, called by showDialog()
1076b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
1077b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    protected Dialog onCreateDialog(int id) {
1078cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if ((id == VM_RESPONSE_ERROR) || (id == VM_NOCHANGE_ERROR) ||
10799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            (id == FW_SET_RESPONSE_ERROR) || (id == FW_GET_RESPONSE_ERROR) ||
1080cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                (id == VOICEMAIL_DIALOG_CONFIRM)) {
1081b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1082b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            AlertDialog.Builder b = new AlertDialog.Builder(this);
1083b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1084b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            int msgId;
1085b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            int titleId = R.string.error_updating_title;
1086b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            switch (id) {
1087b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case VOICEMAIL_DIALOG_CONFIRM:
1088b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.vm_changed;
1089b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    titleId = R.string.voicemail;
1090b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 2
1091b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setNegativeButton(R.string.close_dialog, this);
1092b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
1093b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case VM_NOCHANGE_ERROR:
1094b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // even though this is technically an error,
1095b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // keep the title friendly.
1096b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.no_change;
1097b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    titleId = R.string.voicemail;
1098b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 2
1099b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setNegativeButton(R.string.close_dialog, this);
1100b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
1101b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case VM_RESPONSE_ERROR:
1102b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.vm_change_failed;
1103b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 1
1104b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setPositiveButton(R.string.close_dialog, this);
1105b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
11069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                case FW_SET_RESPONSE_ERROR:
11079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    msgId = R.string.fw_change_failed;
11089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    // Set Button 1
11099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    b.setPositiveButton(R.string.close_dialog, this);
11109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    break;
11119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                case FW_GET_RESPONSE_ERROR:
11129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    msgId = R.string.fw_get_in_vm_failed;
11139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    b.setPositiveButton(R.string.alert_dialog_yes, this);
11149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    b.setNegativeButton(R.string.alert_dialog_no, this);
11159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    break;
1116b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                default:
1117b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.exception_error;
1118b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 3, tells the activity that the error is
1119b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // not recoverable on dialog exit.
1120b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setNeutralButton(R.string.close_dialog, this);
1121b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
1122b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
1123b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1124b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            b.setTitle(getText(titleId));
11259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            String message = getText(msgId).toString();
11269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            b.setMessage(message);
1127b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            b.setCancelable(false);
1128b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            AlertDialog dialog = b.create();
1129b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1130b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // make the dialog more obvious by bluring the background.
1131b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
1132b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1133b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return dialog;
1134bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        } else if (id == VOICEMAIL_FWD_SAVING_DIALOG || id == VOICEMAIL_FWD_READING_DIALOG ||
1135bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                id == VOICEMAIL_REVERTING_DIALOG) {
11369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            ProgressDialog dialog = new ProgressDialog(this);
11379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dialog.setTitle(getText(R.string.updating_title));
11389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dialog.setIndeterminate(true);
11399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dialog.setCancelable(false);
11409440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dialog.setMessage(getText(
1141bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    id == VOICEMAIL_FWD_SAVING_DIALOG ? R.string.updating_settings :
1142bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    (id == VOICEMAIL_REVERTING_DIALOG ? R.string.reverting_settings :
1143bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    R.string.reading_settings)));
11449440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return dialog;
1145b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
1146b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
11479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
1148b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return null;
1149b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1150b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1151b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // This is a method implemented for DialogInterface.OnClickListener.
1152b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Used with the error dialog to close the app, voicemail dialog to just dismiss.
11539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Close button is mapped to BUTTON_POSITIVE for the errors that close the activity,
11549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // while those that are mapped to BUTTON_NEUTRAL only move the preference focus.
1155b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public void onClick(DialogInterface dialog, int which) {
1156b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        dialog.dismiss();
1157b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        switch (which){
11589440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case DialogInterface.BUTTON_NEUTRAL:
11599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Neutral button");
1160b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
11619440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case DialogInterface.BUTTON_NEGATIVE:
11629440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Negative button");
11639440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (mCurrentDialogId == FW_GET_RESPONSE_ERROR) {
11649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    // We failed to get current forwarding settings and the user
116530225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky                    // does not wish to continue.
11669440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    switchToPreviousVoicemailProvider();
11679440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
11689440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
11699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case DialogInterface.BUTTON_POSITIVE:
11709440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Positive button");
11719440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (mCurrentDialogId == FW_GET_RESPONSE_ERROR) {
11729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    // We failed to get current forwarding settings but the user
11739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    // wishes to continue changing settings to the new vm provider
11749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    saveVoiceMailAndForwardingNumberStage2();
11759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                } else {
11769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    finish();
11779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
117830225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky                return;
1179b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            default:
1180b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                // just let the dialog close and go back to the input
1181b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
118230225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        // In all dialogs, all buttons except BUTTON_POSITIVE lead to the end of user interaction
118330225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        // with settings UI. If we were called to explicitly configure voice mail then
118430225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        // we finish the settings activity here to come back to whatever the user was doing.
118530225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL)) {
118630225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky            finish();
118730225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        }
1188b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1189b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1190b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // set the app state with optional status.
1191cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private void showVMDialog(int msgStatus) {
1192cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        switch (msgStatus) {
1193b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            // It's a bit worrisome to punt in the error cases here when we're
1194b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            // not in the foreground; maybe toast instead?
1195cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_VM_EXCEPTION:
1196b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                showDialogIfForeground(VM_RESPONSE_ERROR);
1197b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
11989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case MSG_FW_SET_EXCEPTION:
1199b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                showDialogIfForeground(FW_SET_RESPONSE_ERROR);
12009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
12019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case MSG_FW_GET_EXCEPTION:
1202b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                showDialogIfForeground(FW_GET_RESPONSE_ERROR);
12039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
1204cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_VM_NOCHANGE:
1205b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                showDialogIfForeground(VM_NOCHANGE_ERROR);
1206b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
1207cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_VM_OK:
1208b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                showDialogIfForeground(VOICEMAIL_DIALOG_CONFIRM);
1209b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
1210cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_OK:
1211cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            default:
1212cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                // This should never happen.
1213a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
1214a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville    }
1215404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1216b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
1217b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Activity class methods
1218b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
1219b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1220b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
1221b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    protected void onCreate(Bundle icicle) {
1222b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        super.onCreate(icicle);
12239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("Creating activity");
1224a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        mPhone = PhoneFactory.getDefaultPhone();
1225b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1226cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        addPreferencesFromResource(R.xml.call_feature_setting);
1227cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1228cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
1229cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1230b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // get buttons
1231b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        PreferenceScreen prefSet = getPreferenceScreen();
1232365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mSubMenuVoicemailSettings = (EditPhoneNumberPreference)findPreference(BUTTON_VOICEMAIL_KEY);
12334ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        if (mSubMenuVoicemailSettings != null) {
12344ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            mSubMenuVoicemailSettings.setParentActivity(this, VOICEMAIL_PREF_ID, this);
12354ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            mSubMenuVoicemailSettings.setDialogOnClosedListener(this);
12364ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            mSubMenuVoicemailSettings.setDialogTitle(R.string.voicemail_settings_number_label);
12374ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        }
1238404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1239cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonDTMF = (ListPreference) findPreference(BUTTON_DTMF_KEY);
1240cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonAutoRetry = (CheckBoxPreference) findPreference(BUTTON_RETRY_KEY);
1241cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonHAC = (CheckBoxPreference) findPreference(BUTTON_HAC_KEY);
1242cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonTTY = (ListPreference) findPreference(BUTTON_TTY_KEY);
1243365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVoicemailProviders = (ListPreference) findPreference(BUTTON_VOICEMAIL_PROVIDER_KEY);
1244b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky        if (mVoicemailProviders != null) {
1245b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            mVoicemailProviders.setOnPreferenceChangeListener(this);
1246b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            mVoicemailSettings = (PreferenceScreen)findPreference(BUTTON_VOICEMAIL_SETTING_KEY);
1247b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1248b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            initVoiceMailProviders();
1249b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky        }
1250cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (getResources().getBoolean(R.bool.dtmf_type_enabled)) {
1251cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonDTMF.setOnPreferenceChangeListener(this);
1252cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else {
1253cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(mButtonDTMF);
1254cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonDTMF = null;
12555b269ecd49279c3c4f85f55fa4fd4baa88e3a54bjsh        }
1256b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1257cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (getResources().getBoolean(R.bool.auto_retry_enabled)) {
1258cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonAutoRetry.setOnPreferenceChangeListener(this);
1259cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else {
1260cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(mButtonAutoRetry);
1261cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonAutoRetry = null;
1262cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1263b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1264cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (getResources().getBoolean(R.bool.hac_enabled)) {
1265cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonHAC.setOnPreferenceChangeListener(this);
1266cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else {
1267cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(mButtonHAC);
1268cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonHAC = null;
1269cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1270b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1271cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (getResources().getBoolean(R.bool.tty_enabled)) {
1272cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonTTY.setOnPreferenceChangeListener(this);
1273cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            ttyHandler = new TTYHandler();
1274b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        } else {
1275cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(mButtonTTY);
1276cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonTTY = null;
1277cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1278cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1279cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (!getResources().getBoolean(R.bool.world_phone)) {
1280cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(prefSet.findPreference(BUTTON_CDMA_OPTIONS));
1281cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(prefSet.findPreference(BUTTON_GSM_UMTS_OPTIONS));
1282cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
128379b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink            int phoneType = mPhone.getPhoneType();
128479b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink            if (phoneType == Phone.PHONE_TYPE_CDMA) {
1285cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                prefSet.removePreference(prefSet.findPreference(BUTTON_FDN_KEY));
1286cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                addPreferencesFromResource(R.xml.cdma_call_options);
128779b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink            } else if (phoneType == Phone.PHONE_TYPE_GSM) {
1288cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                addPreferencesFromResource(R.xml.gsm_umts_call_options);
128979b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink            } else {
129079b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink                throw new IllegalStateException("Unexpected phone type: " + phoneType);
1291b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
1292b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
1293b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1294cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        // create intent to bring up contact list
1295cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mContactListIntent = new Intent(Intent.ACTION_GET_CONTENT);
1296cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mContactListIntent.setType(android.provider.Contacts.Phones.CONTENT_ITEM_TYPE);
1297cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1298cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        // check the intent that started this activity and pop up the voicemail
1299cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        // dialog if we've been asked to.
13006da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // If we have at least one non default VM provider registered then bring up
13016da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // the selection for the VM provider, otherwise bring up a VM number dialog.
13026da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // We only bring up the dialog the first time we are called (not after orientation change)
13036da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        if (icicle == null) {
1304b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL) &&
1305b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky                    mVoicemailProviders != null) {
13066da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                if (mVMProvidersData.size() > 1) {
13076da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                    simulatePreferenceClick(mVoicemailProviders);
13086da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                } else {
13099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    onPreferenceChange(mVoicemailProviders, DEFAULT_VM_PROVIDER_KEY);
13109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    mVoicemailProviders.setValue(DEFAULT_VM_PROVIDER_KEY);
13116da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                }
13126da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            }
1313cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1314b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        updateVoiceNumberField();
13159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mVMProviderSettingsForced = false;
1316b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1317b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1318b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
1319cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    protected void onResume() {
1320cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        super.onResume();
1321b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        mForeground = true;
1322b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1323cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonDTMF != null) {
1324cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int dtmf = Settings.System.getInt(getContentResolver(),
1325cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, DTMF_TONE_TYPE_NORMAL);
1326cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonDTMF.setValueIndex(dtmf);
1327cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1328d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
1329cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonAutoRetry != null) {
1330cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int autoretry = Settings.System.getInt(getContentResolver(),
1331cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    Settings.System.CALL_AUTO_RETRY, 0);
1332cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonAutoRetry.setChecked(autoretry != 0);
1333d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville        }
13343800ac871d6548790ac6119bb68b9be0640af261David Krause
1335cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonHAC != null) {
1336cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int hac = Settings.System.getInt(getContentResolver(), Settings.System.HEARING_AID, 0);
1337cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonHAC.setChecked(hac != 0);
1338cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1339d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
1340cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonTTY != null) {
1341cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mPhone.queryTTYMode(ttyHandler.obtainMessage(TTYHandler.EVENT_TTY_MODE_GET));
1342cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1343b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1344b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1345cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private void handleTTYChange(Preference preference, Object objValue) {
1346404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        int buttonTtyMode;
1347404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        buttonTtyMode = Integer.valueOf((String) objValue).intValue();
1348404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        int settingsTtyMode = android.provider.Settings.Secure.getInt(
1349cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                getContentResolver(),
1350404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                android.provider.Settings.Secure.PREFERRED_TTY_MODE, preferredTtyMode);
1351cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (DBG) log("handleTTYChange: requesting set TTY mode enable (TTY) to" +
1352404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                Integer.toString(buttonTtyMode));
1353404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1354404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        if (buttonTtyMode != settingsTtyMode) {
1355404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            switch(buttonTtyMode) {
1356404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_OFF:
1357404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_FULL:
1358404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_HCO:
1359404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_VCO:
1360cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                mPhone.setTTYMode(buttonTtyMode,
1361cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                        ttyHandler.obtainMessage(TTYHandler.EVENT_TTY_MODE_SET));
1362404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                break;
1363404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            default:
1364404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                mPhone.setTTYMode(Phone.TTY_MODE_OFF,
1365cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                        ttyHandler.obtainMessage(TTYHandler.EVENT_TTY_MODE_SET));
1366404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            }
1367404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        }
1368a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville    }
1369a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1370cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    class TTYHandler extends Handler {
1371cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        /** Event for TTY mode change */
1372cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        private static final int EVENT_TTY_MODE_GET = 700;
1373cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        private static final int EVENT_TTY_MODE_SET = 800;
1374a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1375a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        @Override
1376a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        public void handleMessage(Message msg) {
1377a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville            switch (msg.what) {
1378cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                case EVENT_TTY_MODE_GET:
1379cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    handleQueryTTYModeResponse(msg);
1380404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                    break;
1381404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                case EVENT_TTY_MODE_SET:
1382cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    handleSetTTYModeResponse(msg);
1383a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville                    break;
1384404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            }
1385404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        }
1386404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1387cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        private void updatePreferredTtyModeSummary(int TtyMode) {
1388cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            String [] txts = getResources().getStringArray(R.array.tty_mode_entries);
1389cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            switch(TtyMode) {
1390cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                case Phone.TTY_MODE_OFF:
1391cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                case Phone.TTY_MODE_HCO:
1392cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                case Phone.TTY_MODE_VCO:
1393cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                case Phone.TTY_MODE_FULL:
1394cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    mButtonTTY.setSummary(txts[TtyMode]);
1395a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville                    break;
1396a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville                default:
1397cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    mButtonTTY.setEnabled(false);
1398cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    mButtonTTY.setSummary(txts[Phone.TTY_MODE_OFF]);
1399a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville            }
1400a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
1401a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1402cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        private void handleQueryTTYModeResponse(Message msg) {
1403cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            AsyncResult ar = (AsyncResult) msg.obj;
1404cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            if (ar.exception != null) {
1405cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                if (DBG) log("handleQueryTTYModeResponse: Error getting TTY state.");
1406cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                mButtonTTY.setEnabled(false);
1407cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            } else {
1408cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                if (DBG) log("handleQueryTTYModeResponse: TTY enable state successfully queried.");
1409a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1410cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                int ttymode = ((int[]) ar.result)[0];
1411cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                if (DBG) log("handleQueryTTYModeResponse:ttymode=" + ttymode);
1412a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1413cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                Intent ttyModeChanged = new Intent(TtyIntent.TTY_ENABLED_CHANGE_ACTION);
1414cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                ttyModeChanged.putExtra("ttyEnabled", ttymode != Phone.TTY_MODE_OFF);
1415cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                sendBroadcast(ttyModeChanged);
1416cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                android.provider.Settings.Secure.putInt(getContentResolver(),
1417cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                        android.provider.Settings.Secure.PREFERRED_TTY_MODE, ttymode );
1418cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                mButtonTTY.setValue(Integer.toString(ttymode));
1419cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                updatePreferredTtyModeSummary(ttymode);
1420a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville            }
1421a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
1422a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1423cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        private void handleSetTTYModeResponse(Message msg) {
1424cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            AsyncResult ar = (AsyncResult) msg.obj;
1425a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1426cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            if (ar.exception != null) {
1427cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                if (DBG) log("handleSetTTYModeResponse: Error setting TTY mode, ar.exception"
1428cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                        + ar.exception);
1429a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville            }
1430cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mPhone.queryTTYMode(ttyHandler.obtainMessage(TTYHandler.EVENT_TTY_MODE_GET));
1431a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
1432a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
14333800ac871d6548790ac6119bb68b9be0640af261David Krause    }
14343800ac871d6548790ac6119bb68b9be0640af261David Krause
1435b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static void log(String msg) {
1436b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        Log.d(LOG_TAG, msg);
1437b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1438365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1439365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    /**
1440365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Updates the look of the VM preference widgets based on current VM provider settings.
1441365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Note that the provider name is loaded form the found activity via loadLabel in
1442365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * initVoiceMailProviders in order for it to be localizable.
1443365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     */
1444365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private void updateVMPreferenceWidgets(String currentProviderSetting) {
1445365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final String key = currentProviderSetting;
1446365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final VoiceMailProvider provider = mVMProvidersData.get(key);
1447365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1448365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        /* This is the case when we are coming up on a freshly wiped phone and there is no
1449365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky         persisted value for the list preference mVoicemailProviders.
1450365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky         In this case we want to show the UI asking the user to select a voicemail provider as
1451365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky         opposed to silently falling back to default one. */
1452365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        if (provider == null) {
1453365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailProviders.setSummary(getString(R.string.sum_voicemail_choose_provider));
1454365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setSummary("");
1455365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setEnabled(false);
1456365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setIntent(null);
1457365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        } else {
1458365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            final String providerName = provider.name;
1459365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailProviders.setSummary(providerName);
1460365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setSummary(getApplicationContext().getString(
1461365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    R.string.voicemail_settings_for, providerName));
1462365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setEnabled(true);
1463365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setIntent(provider.intent);
1464365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
1465365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
1466365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1467365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    /**
1468365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Enumerates existing VM providers and puts their data into the list and populates
1469365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * the preference list objects with their names.
14706da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * In case we are called with ACTION_ADD_VOICEMAIL intent the intent may have
1471e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     * an extra string called IGNORE_PROVIDER_EXTRA with "package.activityName" of the provider
14726da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * which should be hidden when we bring up the list of possible VM providers to choose.
14736da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * This allows a provider which is being disabled (e.g. GV user logging out) to force the user
14746da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * to pick some other provider.
1475365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     */
1476365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private void initVoiceMailProviders() {
14779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mPerProviderSavedVMNumbers =
14789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            this.getApplicationContext().getSharedPreferences(
14799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                VM_NUMBERS_SHARED_PREFERENCES_NAME, MODE_PRIVATE);
14809440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
14816da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        String providerToIgnore = null;
14826da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL)) {
14839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("ACTION_ADD_VOICEMAIL");
14849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (getIntent().hasExtra(IGNORE_PROVIDER_EXTRA)) {
14859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                providerToIgnore = getIntent().getStringExtra(IGNORE_PROVIDER_EXTRA);
14869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
14879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("providerToIgnore=" + providerToIgnore);
14887c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            if (providerToIgnore != null) {
14897c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                deleteSettingsForVoicemailProvider(providerToIgnore);
14907c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            }
14916da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        }
14926da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
1493365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVMProvidersData.clear();
1494365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1495365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        // Stick the default element which is always there
1496365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final String myCarrier = getString(R.string.voicemail_default);
14979440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mVMProvidersData.put(DEFAULT_VM_PROVIDER_KEY, new VoiceMailProvider(myCarrier, null));
1498365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1499365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        // Enumerate providers
1500365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        PackageManager pm = getPackageManager();
1501365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        Intent intent = new Intent();
1502365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        intent.setAction(ACTION_CONFIGURE_VOICEMAIL);
1503365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
15046da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        int len = resolveInfos.size() + 1; // +1 for the default choice we will insert.
1505365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
15066da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // Go through the list of discovered providers populating the data map
15076da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // skip the provider we were instructed to ignore if there was one
1508365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        for (int i = 0; i < resolveInfos.size(); i++) {
1509365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            final ResolveInfo ri= resolveInfos.get(i);
15106da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            final ActivityInfo currentActivityInfo = ri.activityInfo;
15116da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            final String key = makeKeyForActivity(currentActivityInfo);
15129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Loading " + key);
15136da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            if (key.equals(providerToIgnore)) {
15149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Ignoring " + key);
15156da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                len--;
15166da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                continue;
15176da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            }
1518365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            final String nameForDisplay = ri.loadLabel(pm).toString();
1519365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            Intent providerIntent = new Intent();
1520365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            providerIntent.setAction(ACTION_CONFIGURE_VOICEMAIL);
1521365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            providerIntent.setClassName(currentActivityInfo.packageName,
1522365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    currentActivityInfo.name);
1523365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVMProvidersData.put(
1524365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    key,
1525365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    new VoiceMailProvider(nameForDisplay, providerIntent));
15266da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
15276da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        }
15286da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
15296da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // Now we know which providers to display - create entries and values array for
15306da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // the list preference
15316da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        String [] entries = new String [len];
15326da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        String [] values = new String [len];
15336da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        entries[0] = myCarrier;
15349440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        values[0] = DEFAULT_VM_PROVIDER_KEY;
15356da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        int entryIdx = 1;
15366da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        for (int i = 0; i < resolveInfos.size(); i++) {
15376da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            final String key = makeKeyForActivity(resolveInfos.get(i).activityInfo);
15386da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            if (!mVMProvidersData.containsKey(key)) {
15396da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                continue;
15406da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            }
15416da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            entries[entryIdx] = mVMProvidersData.get(key).name;
15426da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            values[entryIdx] = key;
15436da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            entryIdx++;
1544365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
1545365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1546365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVoicemailProviders.setEntries(entries);
1547365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVoicemailProviders.setEntryValues(values);
1548365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
15497c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky        mPreviousVMProviderKey = getCurrentVoicemailProviderKey();
15509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        updateVMPreferenceWidgets(mPreviousVMProviderKey);
1551365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
15526da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
15536da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    private String makeKeyForActivity(ActivityInfo ai) {
15549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        return ai.name;
15556da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    }
15566da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
15576da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    /**
15586da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * Simulates user clicking on a passed preference.
15596da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * Usually needed when the preference is a dialog preference and we want to invoke
15606da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * a dialog for this preference programmatically.
15616da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * TODO(iliat): figure out if there is a cleaner way to cause preference dlg to come up
15626da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     */
15636da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    private void simulatePreferenceClick(Preference preference) {
15646da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // Go through settings until we find our setting
15656da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // and then simulate a click on it to bring up the dialog
15666da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        final ListAdapter adapter = getPreferenceScreen().getRootAdapter();
15676da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        for (int idx = 0; idx < adapter.getCount(); idx++) {
15686da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            if (adapter.getItem(idx) == preference) {
15696da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                getPreferenceScreen().onItemClick(this.getListView(),
15706da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                        null, idx, adapter.getItemId(idx));
15716da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                break;
15726da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            }
15736da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        }
15746da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    }
1575e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
1576e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    /**
15779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Saves new VM provider settings associating them with the currently selected
15789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * provider if settings are different than the ones already stored for this
1579e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     * provider.
15809440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Later on these will be used when the user switches a provider.
1581e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     */
15829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void maybeSaveSettingsForVoicemailProvider(String key,
15839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            VoiceMailProviderSettings newSettings) {
1584b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky        if (mVoicemailProviders == null) {
1585b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            return;
1586b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky        }
15879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        final VoiceMailProviderSettings curSettings = loadSettingsForVoiceMailProvider(key);
15889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (newSettings.equals(curSettings)) {
15899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Not saving setting for " + key + " since they have not changed");
1590e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky            return;
1591e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky        }
15929440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("Saving settings for " + key + ": " + newSettings.toString());
15939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        Editor editor = mPerProviderSavedVMNumbers.edit();
15949440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        editor.putString(key + VM_NUMBER_TAG,newSettings.voicemailNumber);
15959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        String fwdKey = key + FWD_SETTINGS_TAG;
15969440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CallForwardInfo[] s = newSettings.forwardingSettings;
15979440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (s != FWD_SETTINGS_DONT_TOUCH) {
15989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            editor.putInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, s.length);
15999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < s.length; i++) {
16009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                final String settingKey = fwdKey + FWD_SETTING_TAG + String.valueOf(i);
16019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                final CallForwardInfo fi = s[i];
16029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                editor.putInt(settingKey + FWD_SETTING_STATUS, fi.status);
16039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                editor.putInt(settingKey + FWD_SETTING_REASON, fi.reason);
16049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                editor.putString(settingKey + FWD_SETTING_NUMBER, fi.number);
16059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                editor.putInt(settingKey + FWD_SETTING_TIME, fi.timeSeconds);
16069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
16079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
16089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            editor.putInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
16099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
16109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        editor.commit();
1611e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    }
1612e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
1613e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    /**
16149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Returns settings previously stored for the currently selected
1615e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     * voice mail provider. If none is stored returns null.
16169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * If the user switches to a voice mail provider and we have settings
1617e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     * stored for it we will automatically change the phone's voice mail number
16189440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * and forwarding number to the stored one. Otherwise we will bring up provider's configuration
16199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * UI.
1620e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     */
16219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private VoiceMailProviderSettings loadSettingsForVoiceMailProvider(String key) {
16229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        final String vmNumberSetting = mPerProviderSavedVMNumbers.getString(key + VM_NUMBER_TAG,
16239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                null);
16249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (vmNumberSetting == null) {
16259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Settings for " + key + " not found");
16269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return null;
16279440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
16289440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
16299440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CallForwardInfo[] cfi = FWD_SETTINGS_DONT_TOUCH;
16309440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        String fwdKey = key + FWD_SETTINGS_TAG;
16319440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        final int fwdLen = mPerProviderSavedVMNumbers.getInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
16329440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (fwdLen > 0) {
16339440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            cfi = new CallForwardInfo[fwdLen];
16349440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < cfi.length; i++) {
16359440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                final String settingKey = fwdKey + FWD_SETTING_TAG + String.valueOf(i);
16369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i] = new CallForwardInfo();
16379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].status = mPerProviderSavedVMNumbers.getInt(
16389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        settingKey + FWD_SETTING_STATUS, 0);
16399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].reason = mPerProviderSavedVMNumbers.getInt(
16409440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        settingKey + FWD_SETTING_REASON,
16419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        CommandsInterface.CF_REASON_ALL_CONDITIONAL);
16429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
16439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].toa = PhoneNumberUtils.TOA_International;
16449440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].number = mPerProviderSavedVMNumbers.getString(
16459440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        settingKey + FWD_SETTING_NUMBER, "");
16469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].timeSeconds = mPerProviderSavedVMNumbers.getInt(
16479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        settingKey + FWD_SETTING_TIME, 20);
16489440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
16499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
16509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
16519440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        VoiceMailProviderSettings settings =  new VoiceMailProviderSettings(vmNumberSetting, cfi);
16529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("Loaded settings for " + key + ": " + settings.toString());
16539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        return settings;
16549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
16559440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
16569440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
16579440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Deletes settings for the specified provider.
16589440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
16599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void deleteSettingsForVoicemailProvider(String key) {
16609440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("Deleting settings for" + key);
16619440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mVoicemailProviders == null) {
16629440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return;
16639440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
16649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mPerProviderSavedVMNumbers.edit()
16659440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            .putString(key + VM_NUMBER_TAG, null)
16669440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            .putInt(key + FWD_SETTINGS_TAG + FWD_SETTINGS_LENGTH_TAG, 0)
16679440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            .commit();
1668e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    }
16697c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky
16707c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky    private String getCurrentVoicemailProviderKey() {
16717c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky        final String key = mVoicemailProviders.getValue();
16727c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky        return (key != null) ? key : DEFAULT_VM_PROVIDER_KEY;
16737c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky    }
1674b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project}
1675