CallFeaturesSetting.java revision 9f994b77f3f22b9a23887a324380d9fd317d4e06
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
19b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.app.AlertDialog;
20b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.app.Dialog;
219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinskyimport android.app.ProgressDialog;
22cd0189299f484dcbd51400b994daf585923e9e8dDavid Krauseimport android.content.Context;
23b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.DialogInterface;
24b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.Intent;
25e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinskyimport android.content.SharedPreferences;
269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinskyimport android.content.SharedPreferences.Editor;
27365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport android.content.pm.ActivityInfo;
28365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport android.content.pm.PackageManager;
29365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport android.content.pm.ResolveInfo;
30b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.database.Cursor;
31cd0189299f484dcbd51400b994daf585923e9e8dDavid Krauseimport android.media.AudioManager;
32b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.AsyncResult;
33b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Bundle;
34b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Handler;
35b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Message;
36b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.CheckBoxPreference;
37b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.ListPreference;
38b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.Preference;
39b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.PreferenceActivity;
40b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.PreferenceScreen;
41cd0189299f484dcbd51400b994daf585923e9e8dDavid Krauseimport android.provider.Settings;
422bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Parkimport android.provider.ContactsContract.CommonDataKinds;
439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinskyimport android.telephony.PhoneNumberUtils;
44b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.text.TextUtils;
45b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.util.Log;
46b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.WindowManager;
476da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinskyimport android.widget.ListAdapter;
48b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
492bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Parkimport com.android.internal.telephony.CallForwardInfo;
502bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Parkimport com.android.internal.telephony.CommandsInterface;
512bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Parkimport com.android.internal.telephony.Phone;
522bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Parkimport com.android.internal.telephony.PhoneFactory;
532bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Parkimport com.android.internal.telephony.cdma.TtyIntent;
542bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park
55f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil Kingimport java.util.Collection;
56365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport java.util.HashMap;
57f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil Kingimport java.util.HashSet;
58f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil Kingimport java.util.Iterator;
59365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport java.util.List;
60365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport java.util.Map;
61365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
62365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
63b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectpublic class CallFeaturesSetting extends PreferenceActivity
64b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        implements DialogInterface.OnClickListener,
65b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        Preference.OnPreferenceChangeListener,
66b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        EditPhoneNumberPreference.OnDialogClosedListener,
67b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        EditPhoneNumberPreference.GetDefaultNumberListener{
68b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
696da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    // intent action to bring up voice mail settings
70b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public static final String ACTION_ADD_VOICEMAIL =
71b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        "com.android.phone.CallFeaturesSetting.ADD_VOICEMAIL";
726da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    // intent action sent by this activity to a voice mail provider
736da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    // to trigger its configuration UI
74365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    public static final String ACTION_CONFIGURE_VOICEMAIL =
75365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        "com.android.phone.CallFeaturesSetting.CONFIGURE_VOICEMAIL";
766da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    // Extra put in the return from VM provider config containing voicemail number to set
776da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    public static final String VM_NUMBER_EXTRA = "com.android.phone.VoicemailNumber";
789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Extra put in the return from VM provider config containing call forwarding number to set
799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_NUMBER_EXTRA = "com.android.phone.ForwardingNumber";
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_TIME_EXTRA = "com.android.phone.ForwardingNumberTime";
829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // If the VM provider returns non null value in this extra we will force the user to
839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // choose another VM provider
849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String SIGNOUT_EXTRA = "com.android.phone.Signout";
859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Used to tell the saving logic to leave forwarding number as is
879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final CallForwardInfo[] FWD_SETTINGS_DONT_TOUCH = null;
889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Suffix appended to provider key for storing vm number
899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String VM_NUMBER_TAG = "#VMNumber";
909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Suffix appended to provider key for storing forwarding settings
919440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTINGS_TAG = "#FWDSettings";
929440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Suffix appended to forward settings key for storing length of settings array
939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTINGS_LENGTH_TAG = "#Length";
949440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Suffix appended to forward settings key for storing an individual setting
959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTING_TAG = "#Setting";
969440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Suffixes appended to forward setting key for storing an individual setting properties
979440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTING_STATUS = "#Status";
989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTING_REASON = "#Reason";
999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTING_NUMBER = "#Number";
1009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTING_TIME = "#Time";
1019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
1029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Key identifying the default vocie mail provider
1039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String DEFAULT_VM_PROVIDER_KEY = "";
104b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
105e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    // Extra put into ACTION_ADD_VOICEMAIL call to indicate which provider
106e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    // to remove from the list of providers presented to the user
107e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    public static final String IGNORE_PROVIDER_EXTRA = "com.android.phone.ProviderToIgnore";
108e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
109b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // debug data
11087258b2b589c3afea4b89b840251012378e0d3b4David Brown    private static final String LOG_TAG = "CallFeaturesSetting";
111cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
112b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1136da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    // string constants
114153b94130a5e7a0e7bb17f17ce8f1ed294453d9eDmitri Plotnikov    private static final String NUM_PROJECTION[] = {CommonDataKinds.Phone.NUMBER};
115b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
116b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // String keys for preference lookup
117b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final String BUTTON_VOICEMAIL_KEY = "button_voicemail_key";
118365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private static final String BUTTON_VOICEMAIL_PROVIDER_KEY = "button_voicemail_provider_key";
119365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private static final String BUTTON_VOICEMAIL_SETTING_KEY = "button_voicemail_setting_key";
120b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final String BUTTON_FDN_KEY   = "button_fdn_key";
121b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
122cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_DTMF_KEY   = "button_dtmf_settings";
1233800ac871d6548790ac6119bb68b9be0640af261David Krause    private static final String BUTTON_RETRY_KEY  = "button_auto_retry_key";
124cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_TTY_KEY    = "button_tty_mode_key";
125cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_HAC_KEY    = "button_hac_key";
126cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
127cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_GSM_UMTS_OPTIONS = "button_gsm_more_expand_key";
128cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_CDMA_OPTIONS = "button_cdma_more_expand_key";
129a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
130e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    private static final String VM_NUMBERS_SHARED_PREFERENCES_NAME = "vm_numbers";
131e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
132b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private Intent mContactListIntent;
133b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
134b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /** Event for Async voicemail change call */
1359440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int EVENT_VOICEMAIL_CHANGED        = 500;
1369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int EVENT_FORWARDING_CHANGED       = 501;
1379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int EVENT_FORWARDING_GET_COMPLETED = 502;
138d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
139a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville    // preferred TTY mode
140cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    // Phone.TTY_MODE_xxx
141cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    static final int preferredTtyMode = Phone.TTY_MODE_OFF;
142b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
143d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville    // Dtmf tone types
144d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville    static final int DTMF_TONE_TYPE_NORMAL = 0;
145d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville    static final int DTMF_TONE_TYPE_LONG   = 1;
146d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
14706376849cdac54b573be9204837b451ef8013cc6Eric Laurent    public static final String HAC_KEY = "HACSetting";
14806376849cdac54b573be9204837b451ef8013cc6Eric Laurent    public static final String HAC_VAL_ON = "ON";
14906376849cdac54b573be9204837b451ef8013cc6Eric Laurent    public static final String HAC_VAL_OFF = "OFF";
150d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
151b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /** Handle to voicemail pref */
152cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final int VOICEMAIL_PREF_ID = 1;
153365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private static final int VOICEMAIL_PROVIDER_CFG_ID = 2;
154b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
155b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private Phone mPhone;
156b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
157cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private AudioManager mAudioManager;
158cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
159b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int VM_NOCHANGE_ERROR = 400;
160b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int VM_RESPONSE_ERROR = 500;
1619440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int FW_SET_RESPONSE_ERROR = 501;
1629440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int FW_GET_RESPONSE_ERROR = 502;
163b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
164b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
165b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // dialog identifiers for voicemail
166b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int VOICEMAIL_DIALOG_CONFIRM = 600;
1679440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int VOICEMAIL_FWD_SAVING_DIALOG = 601;
1689440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int VOICEMAIL_FWD_READING_DIALOG = 602;
169bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    private static final int VOICEMAIL_REVERTING_DIALOG = 603;
170b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
171b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // status message sent back from handlers
172b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MSG_OK = 100;
173cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
174b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // special statuses for voicemail controls.
175b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MSG_VM_EXCEPTION = 400;
1769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int MSG_FW_SET_EXCEPTION = 401;
1779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int MSG_FW_GET_EXCEPTION = 402;
178b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MSG_VM_OK = 600;
179b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MSG_VM_NOCHANGE = 700;
180cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
181b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private EditPhoneNumberPreference mSubMenuVoicemailSettings;
182cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1833800ac871d6548790ac6119bb68b9be0640af261David Krause    private CheckBoxPreference mButtonAutoRetry;
184cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private CheckBoxPreference mButtonHAC;
185cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private ListPreference mButtonDTMF;
186404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville    private ListPreference mButtonTTY;
187365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private ListPreference mVoicemailProviders;
188365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private PreferenceScreen mVoicemailSettings;
1899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
190365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private class VoiceMailProvider {
191365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        public VoiceMailProvider(String name, Intent intent) {
192365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            this.name = name;
193365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            this.intent = intent;
194365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
195365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        public String name;
196365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        public Intent intent;
197365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
1989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
1999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
2009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Forwarding settings we are going to save.
2019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
2029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    static final int [] FORWARDING_SETTINGS_REASONS = new int[] {
2039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CommandsInterface.CF_REASON_UNCONDITIONAL,
2049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CommandsInterface.CF_REASON_BUSY,
2059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CommandsInterface.CF_REASON_NO_REPLY,
2069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CommandsInterface.CF_REASON_NOT_REACHABLE
2079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    };
2089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private class VoiceMailProviderSettings {
2109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        /**
2119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky         * Constructs settings object, setting all conditional forwarding to the specified number
2129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky         */
2139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public VoiceMailProviderSettings(String voicemailNumber, String forwardingNumber,
2149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                int timeSeconds) {
2159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            this.voicemailNumber = voicemailNumber;
2169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (forwardingNumber == null || forwardingNumber.length() == 0) {
2179440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                this.forwardingSettings = FWD_SETTINGS_DONT_TOUCH;
2189440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            } else {
2199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                this.forwardingSettings = new CallForwardInfo[FORWARDING_SETTINGS_REASONS.length];
2209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                for (int i = 0; i < this.forwardingSettings.length; i++) {
2219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    CallForwardInfo fi = new CallForwardInfo();
2229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    this.forwardingSettings[i] = fi;
2239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.reason = FORWARDING_SETTINGS_REASONS[i];
2249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.status = (fi.reason == CommandsInterface.CF_REASON_UNCONDITIONAL) ? 0 : 1;
2259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
2269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.toa = PhoneNumberUtils.TOA_International;
2279440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.number = forwardingNumber;
2289440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.timeSeconds = timeSeconds;
2299440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
2309440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
2319440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
2329440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2339440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public VoiceMailProviderSettings(String voicemailNumber, CallForwardInfo[] infos) {
2349440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            this.voicemailNumber = voicemailNumber;
2359440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            this.forwardingSettings = infos;
2369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
2379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        @Override
2399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public boolean equals(Object o) {
2409440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (o == null) return false;
2419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (!(o instanceof VoiceMailProviderSettings)) return false;
2429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final VoiceMailProviderSettings v = (VoiceMailProviderSettings)o;
2439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2449440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return ((this.voicemailNumber == null &&
2459440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        v.voicemailNumber == null) ||
2469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    this.voicemailNumber != null &&
2479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        this.voicemailNumber.equals(v.voicemailNumber))
2489440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    &&
2499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    forwardingSettingsEqual(this.forwardingSettings,
2509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                            v.forwardingSettings);
2519440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
2529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        private boolean forwardingSettingsEqual(CallForwardInfo[] infos1,
2549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                CallForwardInfo[] infos2) {
2559440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (infos1 == infos2) return true;
2569440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (infos1 == null || infos2 == null) return false;
2579440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (infos1.length != infos2.length) return false;
2589440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < infos1.length; i++) {
2599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                CallForwardInfo i1 = infos1[i];
2609440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                CallForwardInfo i2 = infos2[i];
2619440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (i1.status != i2.status ||
2629440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    i1.reason != i2.reason ||
2639440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    i1.serviceClass != i2.serviceClass ||
2649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    i1.toa != i2.toa ||
2659440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    i1.number != i2.number ||
2669440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    i1.timeSeconds != i2.timeSeconds) {
2679440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    return false;
2689440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
2699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
2709440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return true;
2719440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
2729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        @Override
2749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public String toString() {
2759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return voicemailNumber + ((forwardingSettings != null ) ? (", " +
2769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    forwardingSettings.toString()) : "");
2779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
2789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public String voicemailNumber;
2809440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public CallForwardInfo[] forwardingSettings;
2819440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
2829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
283e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    SharedPreferences mPerProviderSavedVMNumbers;
284365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
285365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    /**
2869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Results of reading forwarding settings
2879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
2889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    CallForwardInfo[] mForwardingReadResults = null;
2899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
291f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * Result of forwarding number change.
292f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * Keys are reasons (eg. unconditional forwarding).
2939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
294f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    private Map<Integer, AsyncResult> mForwardingChangeResults = null;
295f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King
296f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    /**
297f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * Expected CF read result types.
298f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * This set keeps track of the CF types for which we've issued change
299f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * commands so we can tell when we've received all of the responses.
300f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     */
301f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    private Collection<Integer> mExpectedChangeResultReasons = null;
3029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
3039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
3049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Result of vm number change
3059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
3069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    AsyncResult mVoicemailChangeResult = null;
3079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
3089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
3099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Previous VM provider setting so we can return to it in case of failure.
3109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
3119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    String mPreviousVMProviderKey = null;
3129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
3139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
3149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Id of the dialog being currently shown.
3159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
3169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    int mCurrentDialogId = 0;
3179440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
3189440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
3199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Flag indicating that we are invoking settings for the voicemail provider programmatically
3209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * due to vm provider change.
3219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
3229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    boolean mVMProviderSettingsForced = false;
3238e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky
3248e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    /**
3258e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky     * Flag indicating that we are making changes to vm or fwd numbers
3268e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky     * due to vm provider change.
3278e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky     */
3288e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    boolean mChangingVMorFwdDueToProviderChange = false;
3298e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky
3309440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
331bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * True if we are in the process of vm & fwd number change and vm has already been changed.
332bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * This is used to decide what to do in case of rollback.
333bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
334bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    boolean mVMChangeCompletedSuccesfully = false;
335bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
336bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
3374e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky     * True if we had full or partial failure setting forwarding numbers and so need to roll them
3384e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky     * back.
339bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
3404e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky    boolean mFwdChangesRequireRollback = false;
341bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
342bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
343bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * Id of error msg to display to user once we are done reverting the VM provider to the previous
344bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * one.
345bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
346bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    int mVMOrFwdSetError = 0;
347bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
348bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
349365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Data about discovered voice mail settings providers.
350365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Is populated by querying which activities can handle ACTION_CONFIGURE_VOICEMAIL.
351365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * They key in this map is package name + activity name.
352365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * We always add an entry for the default provider with a key of empty
353365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * string and intent value of null.
354365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * @see #initVoiceMailProviders.
355365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     */
3562bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park    private final Map<String, VoiceMailProvider> mVMProvidersData =
357365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        new HashMap<String, VoiceMailProvider>();
358b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
359b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /** string to hold old voicemail number as it is being updated. */
360b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private String mOldVmNumber;
361b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
3629440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // New call forwarding settings and vm number we will be setting
3639440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Need to save these since before we get to saving we need to asynchronously
3649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // query the existing forwarding settings.
365f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    private CallForwardInfo[] mNewFwdSettings;
3669440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    String mNewVMNumber;
367b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
368b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    private boolean mForeground;
369b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King
370b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    @Override
371b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    public void onPause() {
372b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        super.onPause();
373b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        mForeground = false;
374b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    }
375b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King
376f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    /**
377f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * We have to pull current settings from the network for all kinds of
378f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * voicemail providers so we can tell whether we have to update them,
379f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * so use this bit to keep track of whether we're reading settings for the
380f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * default provider and should therefore save them out when done.
381f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     */
382f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    private boolean mReadingSettingsForDefaultProvider = false;
383f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King
384b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
385b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Click Listeners, handle click based on objects attached to UI.
386b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
387b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
388b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Click listener for all toggle events
389b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
390b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
391cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (preference == mSubMenuVoicemailSettings) {
392cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            return true;
393cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else if (preference == mButtonDTMF) {
394b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return true;
395a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        } else if (preference == mButtonTTY) {
396404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            return true;
3973800ac871d6548790ac6119bb68b9be0640af261David Krause        } else if (preference == mButtonAutoRetry) {
398cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            android.provider.Settings.System.putInt(mPhone.getContext().getContentResolver(),
399cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    android.provider.Settings.System.CALL_AUTO_RETRY,
400cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    mButtonAutoRetry.isChecked() ? 1 : 0);
401cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            return true;
402cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else if (preference == mButtonHAC) {
403cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int hac = mButtonHAC.isChecked() ? 1 : 0;
404cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            // Update HAC value in Settings database
405cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            Settings.System.putInt(mPhone.getContext().getContentResolver(),
406cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    Settings.System.HEARING_AID, hac);
407b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
408cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            // Update HAC Value in AudioManager
409cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mAudioManager.setParameter(HAC_KEY, hac != 0 ? HAC_VAL_ON : HAC_VAL_OFF);
410b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return true;
41196454d0324a3e5c3c1e66c0372bcf1e9cbd63584Freeman Ng        } else if (preference == mVoicemailSettings && preference.getIntent() != null) {
41296454d0324a3e5c3c1e66c0372bcf1e9cbd63584Freeman Ng            if (DBG) log("Invoking cfg intent " + preference.getIntent().getPackage());
41396454d0324a3e5c3c1e66c0372bcf1e9cbd63584Freeman Ng            this.startActivityForResult(preference.getIntent(), VOICEMAIL_PROVIDER_CFG_ID);
414365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            return true;
415b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
416b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return false;
417b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
418b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
419b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /**
420b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Implemented to support onPreferenceChangeListener to look for preference
421cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause     * changes.
422b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     *
423cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause     * @param preference is the preference to be changed
424b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * @param objValue should be the value of the selection, NOT its localized
425b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * display value.
426b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
427b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public boolean onPreferenceChange(Preference preference, Object objValue) {
428cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (preference == mButtonDTMF) {
429cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int index = mButtonDTMF.findIndexOfValue((String) objValue);
430d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville            Settings.System.putInt(mPhone.getContext().getContentResolver(),
431d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville                    Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, index);
432cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else if (preference == mButtonTTY) {
433cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            handleTTYChange(preference, objValue);
434365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        } else if (preference == mVoicemailProviders) {
435495e409315aa3181a562baeb9d586f633b9eedc2Virgil King            final String currentProviderKey = getCurrentVoicemailProviderKey();
4369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final String newProviderKey = (String)objValue;
4379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("VM provider changes to " + newProviderKey + " from " +
4389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    mPreviousVMProviderKey);
439bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (mPreviousVMProviderKey.equals(newProviderKey)) {
440bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (DBG) log("No change ");
441bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                return true;
442bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
4439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            updateVMPreferenceWidgets(newProviderKey);
444e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
4453897278c8d39ac3ede871e4f9f963d145f6e895dIlia Tulchinsky            mPreviousVMProviderKey = currentProviderKey;
446495e409315aa3181a562baeb9d586f633b9eedc2Virgil King
4479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final VoiceMailProviderSettings newProviderSettings =
4483897278c8d39ac3ede871e4f9f963d145f6e895dIlia Tulchinsky                    loadSettingsForVoiceMailProvider(newProviderKey);
449495e409315aa3181a562baeb9d586f633b9eedc2Virgil King
4509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // If the user switches to a voice mail provider and we have a
4513897278c8d39ac3ede871e4f9f963d145f6e895dIlia Tulchinsky            // numbers stored for it we will automatically change the
4523897278c8d39ac3ede871e4f9f963d145f6e895dIlia Tulchinsky            // phone's
4539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // voice mail and forwarding number to the stored ones.
4549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // Otherwise we will bring up provider's configuration UI.
455495e409315aa3181a562baeb9d586f633b9eedc2Virgil King
4569440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (newProviderSettings == null) {
4574e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                // Force the user into a configuration of the chosen provider
4587c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                if (DBG) log("Saved preferences not found - invoking config");
4599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mVMProviderSettingsForced = true;
460e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky                simulatePreferenceClick(mVoicemailSettings);
461e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky            } else {
4627c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                if (DBG) log("Saved preferences found - switching to them");
4634e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                // Set this flag so if we get a failure we revert to previous provider
4644e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                mChangingVMorFwdDueToProviderChange = true;
4659440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                saveVoiceMailAndForwardingNumber(newProviderKey, newProviderSettings);
466e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky            }
467b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
468b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // always let the preference setting proceed.
469b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return true;
470b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
471b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
472b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Preference click listener invoked on OnDialogClosed for EditPhoneNumberPreference.
473b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public void onDialogClosed(EditPhoneNumberPreference preference, int buttonClicked) {
4749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("onPreferenceClick: request preference click on dialog close: " +
4759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                buttonClicked);
4769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (buttonClicked == DialogInterface.BUTTON_NEGATIVE) {
4779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return;
4789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
479b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (preference instanceof EditPhoneNumberPreference) {
480b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            EditPhoneNumberPreference epn = preference;
481b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
482b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (epn == mSubMenuVoicemailSettings) {
483b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                handleVMBtnClickRequest();
484b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
485b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
486b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
487b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
488b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /**
489b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Implemented for EditPhoneNumberPreference.GetDefaultNumberListener.
490b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * This method set the default values for the various
491b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * EditPhoneNumberPreference dialogs.
492b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
493b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public String onGetDefaultNumber(EditPhoneNumberPreference preference) {
494b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (preference == mSubMenuVoicemailSettings) {
495b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // update the voicemail number field, which takes care of the
496b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // mSubMenuVoicemailSettings itself, so we should return null.
497b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("updating default for voicemail dialog");
498b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            updateVoiceNumberField();
499b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return null;
500b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
501b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
502a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        String vmDisplay = mPhone.getVoiceMailNumber();
503b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (TextUtils.isEmpty(vmDisplay)) {
504b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // if there is no voicemail number, we just return null to
505b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // indicate no contribution.
506b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return null;
507b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
508b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
509b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // Return the voicemail number prepended with "VM: "
510b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (DBG) log("updating default for call forwarding dialogs");
511b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return getString(R.string.voicemail_abbreviated) + " " + vmDisplay;
512b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
513b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
514b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
515b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // override the startsubactivity call to make changes in state consistent.
516b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
517b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public void startActivityForResult(Intent intent, int requestCode) {
518b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (requestCode == -1) {
519b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // this is an intent requested from the preference framework.
520b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            super.startActivityForResult(intent, requestCode);
521b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
522b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
523b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
524b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (DBG) log("startSubActivity: starting requested subactivity");
525b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        super.startActivityForResult(intent, requestCode);
526b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
527b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
5289440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void switchToPreviousVoicemailProvider() {
5299440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("switchToPreviousVoicemailProvider " + mPreviousVMProviderKey);
5309440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mPreviousVMProviderKey != null) {
5314e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky            if (mVMChangeCompletedSuccesfully || mFwdChangesRequireRollback) {
5324e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                // we have to revert with carrier
533bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                showDialog(VOICEMAIL_REVERTING_DIALOG);
534bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                VoiceMailProviderSettings prevSettings =
535bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    loadSettingsForVoiceMailProvider(mPreviousVMProviderKey);
536bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (mVMChangeCompletedSuccesfully) {
537bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mNewVMNumber = prevSettings.voicemailNumber;
538bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("have to revert VM to " + mNewVMNumber);
539bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mPhone.setVoiceMailNumber(
540bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            mPhone.getVoiceMailAlphaTag().toString(),
541bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            mNewVMNumber,
542bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            Message.obtain(mRevertOptionComplete, EVENT_VOICEMAIL_CHANGED));
543bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                }
5444e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                if (mFwdChangesRequireRollback) {
545bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("have to revert fwd");
546f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    final CallForwardInfo[] prevFwdSettings =
547f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                        prevSettings.forwardingSettings;
548bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (prevFwdSettings != null) {
549f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                        Map<Integer, AsyncResult> results =
550f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            mForwardingChangeResults;
551f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                        resetForwardingChangeState();
552bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                        for (int i = 0; i < prevFwdSettings.length; i++) {
553bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            CallForwardInfo fi = prevFwdSettings[i];
554bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            if (DBG) log("Reverting fwd #: " + i + ": " + fi.toString());
555f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            // Only revert the settings for which the update
556f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            // succeeded
557f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            AsyncResult result = results.get(fi.reason);
558f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            if (result != null && result.exception == null) {
559f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                mExpectedChangeResultReasons.add(fi.reason);
560f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                mPhone.setCallForwardingOption(
561f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                        (fi.status == 1 ?
562f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                                CommandsInterface.CF_ACTION_REGISTRATION :
563f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                                CommandsInterface.CF_ACTION_DISABLE),
564f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                        fi.reason,
565f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                        fi.number,
566f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                        fi.timeSeconds,
567f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                        mRevertOptionComplete.obtainMessage(
568f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                                EVENT_FORWARDING_CHANGED, i, 0));
569f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            }
570f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                        }
571bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    }
572bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                }
573bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            } else {
574bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (DBG) log("No need to revert");
575bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                onRevertDone();
576bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
577bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
578bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
579bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
580bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    void onRevertDone() {
581bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (DBG) log("Flipping provider key back to " + mPreviousVMProviderKey);
582bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        mVoicemailProviders.setValue(mPreviousVMProviderKey);
583bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        updateVMPreferenceWidgets(mPreviousVMProviderKey);
584bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        updateVoiceNumberField();
585bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (mVMOrFwdSetError != 0) {
586bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            showVMDialog(mVMOrFwdSetError);
587bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            mVMOrFwdSetError = 0;
5889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
5899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
5909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
591365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    // asynchronous result call after contacts are selected or after we return from
592365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    // a call to the VM settings provider.
593b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
594b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
595b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // there are cases where the contact picker may end up sending us more than one
596b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // request.  We want to ignore the request if we're not in the correct state.
597365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        if (requestCode ==  VOICEMAIL_PROVIDER_CFG_ID) {
5989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            boolean failure = false;
5999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
6009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // No matter how the processing of result goes lets clear the flag
6019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("mVMProviderSettingsForced: " + mVMProviderSettingsForced);
6029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final boolean isVMProviderSettingsForced = mVMProviderSettingsForced;
6039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mVMProviderSettingsForced = false;
6049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
6057c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            String vmNum = null;
606365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            if (resultCode != RESULT_OK) {
607365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                if (DBG) log("onActivityResult: vm provider cfg result not OK.");
6089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                failure = true;
6097c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            } else {
6107c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                if (data == null) {
6117c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    if (DBG) log("onActivityResult: vm provider cfg result has no data");
6127c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    failure = true;
6139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                } else {
6147c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    if (data.getBooleanExtra(SIGNOUT_EXTRA, false)) {
6157c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        if (DBG) log("Provider requested signout");
6167c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        if (isVMProviderSettingsForced) {
6177c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            if (DBG) log("Going back to previous provider on signout");
6187c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            switchToPreviousVoicemailProvider();
6197c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        } else {
6207c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            final String victim = getCurrentVoicemailProviderKey();
6217c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            if (DBG) log("Relaunching activity and ignoring " + victim);
6227c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            Intent i = new Intent(ACTION_ADD_VOICEMAIL);
6237c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            i.putExtra(IGNORE_PROVIDER_EXTRA, victim);
6247c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
6257c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            this.startActivity(i);
6267c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        }
6277c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        return;
6287c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    }
6297c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    vmNum = data.getStringExtra(VM_NUMBER_EXTRA);
6307c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    if (vmNum == null || vmNum.length() == 0) {
6317c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        if (DBG) log("onActivityResult: vm provider cfg result has no vmnum");
6327c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        failure = true;
6337c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    }
6349440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
6359440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
6369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (failure) {
6379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Failure in return from voicemail provider");
6389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (isVMProviderSettingsForced) {
6399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    switchToPreviousVoicemailProvider();
6409440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                } else {
6419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    if (DBG) log("Not switching back the provider since this is not forced config");
6429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
643365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                return;
644365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            }
6458e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky            mChangingVMorFwdDueToProviderChange = isVMProviderSettingsForced;
6469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final String fwdNum = data.getStringExtra(FWD_NUMBER_EXTRA);
6479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
6489440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // TODO(iliat): It would be nice to load the current network setting for this and
6499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // send it to the provider when it's config is invoked so it can use this as default
6509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final int fwdNumTime = data.getIntExtra(FWD_NUMBER_TIME_EXTRA, 20);
6519440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
6529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("onActivityResult: vm provider cfg result " +
6539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    (fwdNum != null ? "has" : " does not have") + " forwarding number");
6547c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            saveVoiceMailAndForwardingNumber(getCurrentVoicemailProviderKey(),
655b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                    new VoiceMailProviderSettings(vmNum, fwdNum, fwdNumTime));
656365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            return;
657365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
658b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
659b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (resultCode != RESULT_OK) {
660b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("onActivityResult: contact picker result not OK.");
661b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
662b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
663b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
664b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        Cursor cursor = getContentResolver().query(data.getData(),
665b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                NUM_PROJECTION, null, null, null);
666b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if ((cursor == null) || (!cursor.moveToFirst())) {
667b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("onActivityResult: bad contact data, no results found.");
668b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
669b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
670b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
671b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        switch (requestCode) {
672b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            case VOICEMAIL_PREF_ID:
673b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mSubMenuVoicemailSettings.onPickActivityResult(cursor.getString(0));
674b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
675b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            default:
676b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                // TODO: may need exception here.
677b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
678b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
679b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
680b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Voicemail button logic
681b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private void handleVMBtnClickRequest() {
682b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // normally called on the dialog close.
683b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
684b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // Since we're stripping the formatting out on the getPhoneNumber()
685b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // call now, we won't need to do so here anymore.
686b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
6879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        saveVoiceMailAndForwardingNumber(
6887c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                getCurrentVoicemailProviderKey(),
6899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                new VoiceMailProviderSettings(mSubMenuVoicemailSettings.getPhoneNumber(),
6909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        FWD_SETTINGS_DONT_TOUCH));
691365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
692365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
693b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    private void showDialogIfForeground(int id) {
694b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        if (mForeground) {
695b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            showDialog(id);
696b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        }
697b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    }
698b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King
699b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    private void dismissDialogSafely(int id) {
700b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        try {
701b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            dismissDialog(id);
702b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        } catch (IllegalArgumentException e) {
703b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            // This is expected in the case where we were in the background
704b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            // at the time we would normally have shown the dialog, so we didn't
705b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            // show it.
706b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        }
707b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    }
708b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King
7099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void saveVoiceMailAndForwardingNumber(String key,
7109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            VoiceMailProviderSettings newSettings) {
7119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("saveVoiceMailAndForwardingNumber: " + newSettings.toString());
7129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mNewVMNumber = newSettings.voicemailNumber;
713b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // empty vm number == clearing the vm number ?
7149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mNewVMNumber == null) {
7159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mNewVMNumber = "";
7169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7179440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7189440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mNewFwdSettings = newSettings.forwardingSettings;
7199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("newFwdNumber " +
7209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                String.valueOf((mNewFwdSettings != null ? mNewFwdSettings.length : 0))
7219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                + " settings");
7229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // No fwd settings on CDMA
7249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
7259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("ignoring forwarding setting since this is CDMA phone");
7269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mNewFwdSettings = FWD_SETTINGS_DONT_TOUCH;
727b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
728b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
7299440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        //throw a warning if the vm is the same and we do not touch forwarding.
7309440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mNewVMNumber.equals(mOldVmNumber) && mNewFwdSettings == FWD_SETTINGS_DONT_TOUCH) {
731cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            showVMDialog(MSG_VM_NOCHANGE);
732b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
733b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
734b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
7359440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        maybeSaveSettingsForVoicemailProvider(key, newSettings);
736bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        mVMChangeCompletedSuccesfully = false;
7374e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky        mFwdChangesRequireRollback = false;
738bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        mVMOrFwdSetError = 0;
739f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        if (!key.equals(mPreviousVMProviderKey)) {
740f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            mReadingSettingsForDefaultProvider =
741f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                mPreviousVMProviderKey.equals(DEFAULT_VM_PROVIDER_KEY);
7429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Reading current forwarding settings");
7439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mForwardingReadResults = new CallForwardInfo[FORWARDING_SETTINGS_REASONS.length];
7449440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < FORWARDING_SETTINGS_REASONS.length; i++) {
7459440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mForwardingReadResults[i] = null;
7469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mPhone.getCallForwardingOption(FORWARDING_SETTINGS_REASONS[i],
7479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        mGetOptionComplete.obtainMessage(EVENT_FORWARDING_GET_COMPLETED, i, 0));
7489440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
749b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            showDialogIfForeground(VOICEMAIL_FWD_READING_DIALOG);
7509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
7519440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            saveVoiceMailAndForwardingNumberStage2();
7529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
7549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7552bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park    private final Handler mGetOptionComplete = new Handler() {
7569440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        @Override
7579440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public void handleMessage(Message msg) {
7589440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            AsyncResult result = (AsyncResult) msg.obj;
7599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            switch (msg.what) {
7609440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                case EVENT_FORWARDING_GET_COMPLETED:
7619440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    handleForwardingSettingsReadResult(result, msg.arg1);
7629440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    break;
7639440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
7649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7659440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    };
7669440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7679440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    void handleForwardingSettingsReadResult(AsyncResult ar, int idx) {
7689440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) Log.d(LOG_TAG, "handleForwardingSettingsReadResult: " + idx);
7699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        Throwable error = null;
7709440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (ar.exception != null) {
7719440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "FwdRead: ar.exception=" +
7729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    ar.exception.getMessage());
7739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            error = ar.exception;
7749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (ar.userObj instanceof Throwable) {
7769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "FwdRead: userObj=" +
7779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    ((Throwable)ar.userObj).getMessage());
7789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            error = (Throwable)ar.userObj;
7799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7809440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7819440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // We may have already gotten an error and decided to ignore the other results.
7829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mForwardingReadResults == null) {
7839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "ignoring fwd reading result: " + idx);
7849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return;
7859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // In case of error ignore other results, show an error dialog
7889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (error != null) {
7899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Error discovered for fwd read : " + idx);
7909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mForwardingReadResults = null;
791b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            dismissDialogSafely(VOICEMAIL_FWD_READING_DIALOG);
7929440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            showVMDialog(MSG_FW_GET_EXCEPTION);
7939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return;
7949440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7969440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // Get the forwarding info
7979440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        final CallForwardInfo cfInfoArray[] = (CallForwardInfo[]) ar.result;
7989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CallForwardInfo fi = null;
7999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        for (int i = 0 ; i < cfInfoArray.length; i++) {
8009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if ((cfInfoArray[i].serviceClass & CommandsInterface.SERVICE_CLASS_VOICE) != 0) {
8019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                fi = cfInfoArray[i];
8029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
8039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
8049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
8059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (fi == null) {
8069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
8079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // In case we go nothing it means we need this reason disabled
8089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // so create a CallForwardInfo for capturing this
8099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Creating default info for " + idx);
8109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            fi = new CallForwardInfo();
8119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            fi.status = 0;
8129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            fi.reason = FORWARDING_SETTINGS_REASONS[idx];
8139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            fi.serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
8149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
8152bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park            // if there is not a forwarding number, ensure the entry is set to "not active."
8162bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park            if (fi.number == null || fi.number.length() == 0) {
8172bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park                fi.status = 0;
8182bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park            }
8192bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park
8209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Got  " + fi.toString() + " for " + idx);
8219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
8229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mForwardingReadResults[idx] = fi;
8239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
8249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // Check if we got all the results already
8259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        boolean done = true;
8269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        for (int i = 0; i < mForwardingReadResults.length; i++) {
8279440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (mForwardingReadResults[i] == null) {
8289440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                done = false;
8299440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
8309440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
8319440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
8329440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (done) {
8339440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Done receiving fwd info");
834b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            dismissDialogSafely(VOICEMAIL_FWD_READING_DIALOG);
835f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            if (mReadingSettingsForDefaultProvider) {
836f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                maybeSaveSettingsForVoicemailProvider(DEFAULT_VM_PROVIDER_KEY,
837f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                        new VoiceMailProviderSettings(this.mOldVmNumber,
838f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                mForwardingReadResults));
839f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                mReadingSettingsForDefaultProvider = false;
840f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            }
8419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            saveVoiceMailAndForwardingNumberStage2();
8429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
8439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Not done receiving fwd info");
8449440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
8459440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
8469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
847f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    private CallForwardInfo infoForReason(CallForwardInfo[] infos, int reason) {
848f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        CallForwardInfo result = null;
849f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        if (null != infos) {
850f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            for (CallForwardInfo info : infos) {
851f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                if (info.reason == reason) {
852f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    result = info;
853f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    break;
854f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                }
855f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            }
856f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        }
857f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        return result;
858f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    }
859f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King
860f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    private boolean isUpdateRequired(CallForwardInfo oldInfo,
861f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            CallForwardInfo newInfo) {
862f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        boolean result = true;
863f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        if (0 == newInfo.status) {
864f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            // If we're disabling a type of forwarding, and it's already
865f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            // disabled for the account, don't make any change
866f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            if (oldInfo != null && oldInfo.status == 0) {
867f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                result = false;
868f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            }
869f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        }
870f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        return result;
871f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    }
872f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King
873f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    private void resetForwardingChangeState() {
874f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        mForwardingChangeResults = new HashMap<Integer, AsyncResult>();
875f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        mExpectedChangeResultReasons = new HashSet<Integer>();
876f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    }
877f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King
8789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Called after we are done saving the previous forwarding settings if
8799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // we needed.
8809440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void saveVoiceMailAndForwardingNumberStage2() {
8819440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mForwardingChangeResults = null;
8829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mVoicemailChangeResult = null;
8839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mNewFwdSettings != FWD_SETTINGS_DONT_TOUCH) {
884f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            resetForwardingChangeState();
8859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < mNewFwdSettings.length; i++) {
8869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                CallForwardInfo fi = mNewFwdSettings[i];
8879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
888f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                final boolean doUpdate = isUpdateRequired(infoForReason(
889f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            mForwardingReadResults, fi.reason), fi);
890f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King
891f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                if (doUpdate) {
892f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    if (DBG) log("Setting fwd #: " + i + ": " + fi.toString());
893f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    mExpectedChangeResultReasons.add(i);
894f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King
895f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    mPhone.setCallForwardingOption(
896f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            fi.status == 1 ?
897f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                    CommandsInterface.CF_ACTION_REGISTRATION :
898f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                    CommandsInterface.CF_ACTION_DISABLE,
899f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            fi.reason,
900f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            fi.number,
901f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            fi.timeSeconds,
902f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            mSetOptionComplete.obtainMessage(
903f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                    EVENT_FORWARDING_CHANGED, fi.reason, 0));
904f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                }
9059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky             }
906b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King             showDialogIfForeground(VOICEMAIL_FWD_SAVING_DIALOG);
9079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
9089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Not touching fwd #");
909bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            setVMNumberWithCarrier();
9109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
911bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
912bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
913bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    void setVMNumberWithCarrier() {
9149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("save voicemail #: " + mNewVMNumber);
915b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mPhone.setVoiceMailNumber(
916b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mPhone.getVoiceMailAlphaTag().toString(),
9179440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mNewVMNumber,
918b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                Message.obtain(mSetOptionComplete, EVENT_VOICEMAIL_CHANGED));
919b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
920b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
9219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
922b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Callback to handle option update completions
923b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
9242bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park    private final Handler mSetOptionComplete = new Handler() {
925b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        @Override
926b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        public void handleMessage(Message msg) {
9279440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            AsyncResult result = (AsyncResult) msg.obj;
9284e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky            boolean done = false;
929b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            switch (msg.what) {
930b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case EVENT_VOICEMAIL_CHANGED:
9319440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    mVoicemailChangeResult = result;
932bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mVMChangeCompletedSuccesfully = checkVMChangeSuccess() == null;
933bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("VM change complete msg, VM change done = " +
934bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            String.valueOf(mVMChangeCompletedSuccesfully));
9354e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    done = true;
9369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    break;
9379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                case EVENT_FORWARDING_CHANGED:
938f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    mForwardingChangeResults.put(msg.arg1, result);
9394e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    if (result.exception != null) {
9404e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        if (DBG) log("Error in setting fwd# " + msg.arg1 + ": " +
9414e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                result.exception.getMessage());
9424e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    } else {
9434e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        if (DBG) log("Success in setting fwd# " + msg.arg1);
9444e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    }
945bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    final boolean completed = checkForwardingCompleted();
946bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (completed) {
9474e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        if (checkFwdChangeSuccess() == null) {
9484e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            if (DBG) log("Overall fwd changes completed ok, starting vm change");
9494e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            setVMNumberWithCarrier();
9504e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        } else {
9514e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            if (DBG) log("Overall fwd changes completed, failure");
9524e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            mFwdChangesRequireRollback = false;
953f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            Iterator<Map.Entry<Integer,AsyncResult>> it =
954f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                mForwardingChangeResults.entrySet().iterator();
955f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            while (it.hasNext()) {
956f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                Map.Entry<Integer,AsyncResult> entry = it.next();
957f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                if (entry.getValue().exception == null) {
9584e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                    // If at least one succeeded we have to revert
9594e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                    if (DBG) log("Rollback will be required");
9604e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                    mFwdChangesRequireRollback =true;
9614e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                    break;
9624e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                }
9634e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            }
9644e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            done = true;
9654e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        }
966bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    }
967b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
968b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                default:
969b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // TODO: should never reach this, may want to throw exception
970b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
9719440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (done) {
9724e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                if (DBG) log("All VM provider related changes done");
9739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (mForwardingChangeResults != null) {
974b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                    dismissDialogSafely(VOICEMAIL_FWD_SAVING_DIALOG);
9759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
9769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                handleSetVMOrFwdMessage();
9779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
978b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
979b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    };
980b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
981bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
982bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * Callback to handle option revert completions
983bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
9842bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park    private final Handler mRevertOptionComplete = new Handler() {
985bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        @Override
986bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        public void handleMessage(Message msg) {
987bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            AsyncResult result = (AsyncResult) msg.obj;
988bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            switch (msg.what) {
989bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                case EVENT_VOICEMAIL_CHANGED:
990bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mVoicemailChangeResult = result;
991bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("VM revert complete msg");
992bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    break;
993bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                case EVENT_FORWARDING_CHANGED:
994f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    mForwardingChangeResults.put(msg.arg1, result);
9954e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    if (result.exception != null) {
9964e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        if (DBG) log("Error in reverting fwd# " + msg.arg1 + ": " +
9974e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                result.exception.getMessage());
9984e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    } else {
9994e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        if (DBG) log("Success in reverting fwd# " + msg.arg1);
10004e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    }
1001bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("FWD revert complete msg ");
1002bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    break;
1003bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                default:
1004bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    // TODO: should never reach this, may want to throw exception
1005bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
1006bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            final boolean done =
1007bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                (!mVMChangeCompletedSuccesfully || mVoicemailChangeResult != null) &&
10084e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                (!mFwdChangesRequireRollback || checkForwardingCompleted());
1009bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (done) {
1010bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (DBG) log("All VM reverts done");
10112bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park                dismissDialogSafely(VOICEMAIL_REVERTING_DIALOG);
1012bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                onRevertDone();
1013bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
1014bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
1015bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    };
1016bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
1017bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
1018bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * @return true if forwarding change has completed
1019bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
1020bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    private boolean checkForwardingCompleted() {
1021f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        boolean result;
1022bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (mForwardingChangeResults == null) {
1023f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            result = true;
1024f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        } else {
1025f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            // return true iff there is a change result for every reason for
1026f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            // which we expected a result
1027f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            result = true;
1028f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            for (Integer reason : mExpectedChangeResultReasons) {
1029f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                if (mForwardingChangeResults.get(reason) == null) {
1030f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    result = false;
1031f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    break;
1032f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                }
1033bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
1034bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
1035f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        return result;
1036bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
1037bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
1038bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * @return error string or null if successful
1039bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
1040bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    private String checkFwdChangeSuccess() {
1041f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        String result = null;
1042f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        Iterator<Map.Entry<Integer,AsyncResult>> it =
1043f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            mForwardingChangeResults.entrySet().iterator();
1044f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        while (it.hasNext()) {
1045f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            Map.Entry<Integer,AsyncResult> entry = it.next();
1046f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            Throwable exception = entry.getValue().exception;
1047f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            if (exception != null) {
1048f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                result = exception.getMessage();
1049f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                if (result == null) {
1050f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    result = "";
1051bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                }
1052f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                break;
1053bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
1054bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
1055f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        return result;
1056bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
1057bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
1058bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
1059f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * @return error string or null if successful
1060bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
1061bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    private String checkVMChangeSuccess() {
1062bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (mVoicemailChangeResult.exception != null) {
1063bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            final String msg = mVoicemailChangeResult.exception.getMessage();
1064bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (msg == null) {
1065bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                return "";
1066bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
1067bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            return msg;
1068bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
1069bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        return null;
1070bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
1071bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
10729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void handleSetVMOrFwdMessage() {
1073b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (DBG) {
1074b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            log("handleSetVMMessage: set VM request complete");
1075b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
10769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        boolean success = true;
10779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        boolean fwdFailure = false;
10789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        String exceptionMessage = "";
10799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mForwardingChangeResults != null) {
1080bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            exceptionMessage = checkFwdChangeSuccess();
1081bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (exceptionMessage != null) {
1082bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                success = false;
1083bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                fwdFailure = true;
10849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
10859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
1086bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (success) {
1087bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            exceptionMessage = checkVMChangeSuccess();
1088bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (exceptionMessage != null) {
1089bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                success = false;
1090bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
10919440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
10929440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (success) {
1093b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("change VM success!");
10948e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky            handleVMAndFwdSetSuccess(MSG_VM_OK);
1095bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            updateVoiceNumberField();
1096b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        } else {
10979440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (fwdFailure) {
10989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                log("change FW failed: " + exceptionMessage);
10998e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky                handleVMOrFwdSetError(MSG_FW_SET_EXCEPTION);
11009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            } else {
11019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                log("change VM failed: " + exceptionMessage);
11028e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky                handleVMOrFwdSetError(MSG_VM_EXCEPTION);
11039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
1104b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
1105b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1106b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
11078e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    private void handleVMOrFwdSetError(int msgId) {
11088e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        if (mChangingVMorFwdDueToProviderChange) {
1109bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            mVMOrFwdSetError = msgId;
1110bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            mChangingVMorFwdDueToProviderChange = false;
11118e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky            switchToPreviousVoicemailProvider();
1112bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            return;
11138e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        }
11148e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        mChangingVMorFwdDueToProviderChange = false;
11158e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        showVMDialog(msgId);
1116bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        updateVoiceNumberField();
11178e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    }
11188e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky
11198e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    private void handleVMAndFwdSetSuccess(int msgId) {
11208e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        mChangingVMorFwdDueToProviderChange = false;
11218e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        showVMDialog(msgId);
11228e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    }
11238e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky
1124b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
1125b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Methods used to sync UI state with that of the network
1126b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
1127b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // update the voicemail number from what we've recorded on the sim.
1128b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private void updateVoiceNumberField() {
11294ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        if (mSubMenuVoicemailSettings == null) {
11304ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            return;
11314ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        }
1132404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1133b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mOldVmNumber = mPhone.getVoiceMailNumber();
1134b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (mOldVmNumber == null) {
1135b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            mOldVmNumber = "";
1136b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
1137b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mSubMenuVoicemailSettings.setPhoneNumber(mOldVmNumber);
1138365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final String summary = (mOldVmNumber.length() > 0) ? mOldVmNumber :
1139365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            getString(R.string.voicemail_number_not_set);
1140365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mSubMenuVoicemailSettings.setSummary(summary);
1141b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1142b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1143b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
1144b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Helper Methods for Activity class.
1145b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King     * The initial query commands are split into two pieces now
1146b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * for individual expansion.  This combined with the ability
1147b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * to cancel queries allows for a much better user experience,
1148b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * and also ensures that the user only waits to update the
1149b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * data that is relevant.
1150b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
1151b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1152b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    @Override
1153b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    protected void onPrepareDialog(int id, Dialog dialog) {
1154b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        super.onPrepareDialog(id, dialog);
1155b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        mCurrentDialogId = id;
1156b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    }
1157b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King
1158b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // dialog creation method, called by showDialog()
1159b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
1160b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    protected Dialog onCreateDialog(int id) {
1161cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if ((id == VM_RESPONSE_ERROR) || (id == VM_NOCHANGE_ERROR) ||
11629440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            (id == FW_SET_RESPONSE_ERROR) || (id == FW_GET_RESPONSE_ERROR) ||
1163cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                (id == VOICEMAIL_DIALOG_CONFIRM)) {
1164b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1165b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            AlertDialog.Builder b = new AlertDialog.Builder(this);
1166b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1167b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            int msgId;
1168b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            int titleId = R.string.error_updating_title;
1169b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            switch (id) {
1170b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case VOICEMAIL_DIALOG_CONFIRM:
1171b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.vm_changed;
1172b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    titleId = R.string.voicemail;
1173b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 2
1174b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setNegativeButton(R.string.close_dialog, this);
1175b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
1176b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case VM_NOCHANGE_ERROR:
1177b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // even though this is technically an error,
1178b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // keep the title friendly.
1179b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.no_change;
1180b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    titleId = R.string.voicemail;
1181b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 2
1182b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setNegativeButton(R.string.close_dialog, this);
1183b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
1184b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case VM_RESPONSE_ERROR:
1185b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.vm_change_failed;
1186b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 1
1187b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setPositiveButton(R.string.close_dialog, this);
1188b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
11899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                case FW_SET_RESPONSE_ERROR:
11909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    msgId = R.string.fw_change_failed;
11919440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    // Set Button 1
11929440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    b.setPositiveButton(R.string.close_dialog, this);
11939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    break;
11949440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                case FW_GET_RESPONSE_ERROR:
11959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    msgId = R.string.fw_get_in_vm_failed;
11969440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    b.setPositiveButton(R.string.alert_dialog_yes, this);
11979440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    b.setNegativeButton(R.string.alert_dialog_no, this);
11989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    break;
1199b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                default:
1200b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.exception_error;
1201b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 3, tells the activity that the error is
1202b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // not recoverable on dialog exit.
1203b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setNeutralButton(R.string.close_dialog, this);
1204b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
1205b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
1206b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1207b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            b.setTitle(getText(titleId));
12089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            String message = getText(msgId).toString();
12099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            b.setMessage(message);
1210b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            b.setCancelable(false);
1211b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            AlertDialog dialog = b.create();
1212b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1213b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // make the dialog more obvious by bluring the background.
1214b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
1215b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1216b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return dialog;
1217bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        } else if (id == VOICEMAIL_FWD_SAVING_DIALOG || id == VOICEMAIL_FWD_READING_DIALOG ||
1218bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                id == VOICEMAIL_REVERTING_DIALOG) {
12199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            ProgressDialog dialog = new ProgressDialog(this);
12209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dialog.setTitle(getText(R.string.updating_title));
12219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dialog.setIndeterminate(true);
12229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dialog.setCancelable(false);
12239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dialog.setMessage(getText(
1224bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    id == VOICEMAIL_FWD_SAVING_DIALOG ? R.string.updating_settings :
1225bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    (id == VOICEMAIL_REVERTING_DIALOG ? R.string.reverting_settings :
1226bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    R.string.reading_settings)));
12279440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return dialog;
1228b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
1229b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
12309440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
1231b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return null;
1232b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1233b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1234b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // This is a method implemented for DialogInterface.OnClickListener.
1235b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Used with the error dialog to close the app, voicemail dialog to just dismiss.
12369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Close button is mapped to BUTTON_POSITIVE for the errors that close the activity,
12379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // while those that are mapped to BUTTON_NEUTRAL only move the preference focus.
1238b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public void onClick(DialogInterface dialog, int which) {
1239b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        dialog.dismiss();
1240b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        switch (which){
12419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case DialogInterface.BUTTON_NEUTRAL:
12429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Neutral button");
1243b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
12449440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case DialogInterface.BUTTON_NEGATIVE:
12459440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Negative button");
12469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (mCurrentDialogId == FW_GET_RESPONSE_ERROR) {
12479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    // We failed to get current forwarding settings and the user
124830225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky                    // does not wish to continue.
12499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    switchToPreviousVoicemailProvider();
12509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
12519440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
12529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case DialogInterface.BUTTON_POSITIVE:
12539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Positive button");
12549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (mCurrentDialogId == FW_GET_RESPONSE_ERROR) {
12559440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    // We failed to get current forwarding settings but the user
12569440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    // wishes to continue changing settings to the new vm provider
12579440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    saveVoiceMailAndForwardingNumberStage2();
12589440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                } else {
12599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    finish();
12609440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
126130225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky                return;
1262b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            default:
1263b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                // just let the dialog close and go back to the input
1264b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
126530225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        // In all dialogs, all buttons except BUTTON_POSITIVE lead to the end of user interaction
126630225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        // with settings UI. If we were called to explicitly configure voice mail then
126730225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        // we finish the settings activity here to come back to whatever the user was doing.
126830225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL)) {
126930225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky            finish();
127030225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        }
1271b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1272b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1273b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // set the app state with optional status.
1274cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private void showVMDialog(int msgStatus) {
1275cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        switch (msgStatus) {
1276b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            // It's a bit worrisome to punt in the error cases here when we're
1277b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            // not in the foreground; maybe toast instead?
1278cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_VM_EXCEPTION:
1279b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                showDialogIfForeground(VM_RESPONSE_ERROR);
1280b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
12819440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case MSG_FW_SET_EXCEPTION:
1282b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                showDialogIfForeground(FW_SET_RESPONSE_ERROR);
12839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
12849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case MSG_FW_GET_EXCEPTION:
1285b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                showDialogIfForeground(FW_GET_RESPONSE_ERROR);
12869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
1287cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_VM_NOCHANGE:
1288b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                showDialogIfForeground(VM_NOCHANGE_ERROR);
1289b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
1290cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_VM_OK:
1291b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                showDialogIfForeground(VOICEMAIL_DIALOG_CONFIRM);
1292b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
1293cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_OK:
1294cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            default:
1295cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                // This should never happen.
1296a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
1297a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville    }
1298404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1299b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
1300b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Activity class methods
1301b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
1302b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1303b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
1304b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    protected void onCreate(Bundle icicle) {
1305b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        super.onCreate(icicle);
13069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("Creating activity");
1307a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        mPhone = PhoneFactory.getDefaultPhone();
1308b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1309cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        addPreferencesFromResource(R.xml.call_feature_setting);
1310cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1311cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
1312cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1313b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // get buttons
1314b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        PreferenceScreen prefSet = getPreferenceScreen();
1315365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mSubMenuVoicemailSettings = (EditPhoneNumberPreference)findPreference(BUTTON_VOICEMAIL_KEY);
13164ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        if (mSubMenuVoicemailSettings != null) {
13174ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            mSubMenuVoicemailSettings.setParentActivity(this, VOICEMAIL_PREF_ID, this);
13184ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            mSubMenuVoicemailSettings.setDialogOnClosedListener(this);
13194ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            mSubMenuVoicemailSettings.setDialogTitle(R.string.voicemail_settings_number_label);
13204ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        }
1321404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1322cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonDTMF = (ListPreference) findPreference(BUTTON_DTMF_KEY);
1323cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonAutoRetry = (CheckBoxPreference) findPreference(BUTTON_RETRY_KEY);
1324cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonHAC = (CheckBoxPreference) findPreference(BUTTON_HAC_KEY);
1325cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonTTY = (ListPreference) findPreference(BUTTON_TTY_KEY);
1326365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVoicemailProviders = (ListPreference) findPreference(BUTTON_VOICEMAIL_PROVIDER_KEY);
1327b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky        if (mVoicemailProviders != null) {
1328b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            mVoicemailProviders.setOnPreferenceChangeListener(this);
1329b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            mVoicemailSettings = (PreferenceScreen)findPreference(BUTTON_VOICEMAIL_SETTING_KEY);
1330b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1331b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            initVoiceMailProviders();
1332b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky        }
1333605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang
1334605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang        if (mButtonDTMF != null) {
1335605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            if (getResources().getBoolean(R.bool.dtmf_type_enabled)) {
1336605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                mButtonDTMF.setOnPreferenceChangeListener(this);
1337605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            } else {
1338605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                prefSet.removePreference(mButtonDTMF);
1339605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                mButtonDTMF = null;
1340605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            }
13415b269ecd49279c3c4f85f55fa4fd4baa88e3a54bjsh        }
1342b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1343605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang        if (mButtonAutoRetry != null) {
1344605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            if (getResources().getBoolean(R.bool.auto_retry_enabled)) {
1345605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                mButtonAutoRetry.setOnPreferenceChangeListener(this);
1346605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            } else {
1347605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                prefSet.removePreference(mButtonAutoRetry);
1348605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                mButtonAutoRetry = null;
1349605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            }
1350cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1351b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1352605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang        if (mButtonHAC != null) {
1353605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            if (getResources().getBoolean(R.bool.hac_enabled)) {
1354605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang
1355605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                mButtonHAC.setOnPreferenceChangeListener(this);
1356605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            } else {
1357605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                prefSet.removePreference(mButtonHAC);
1358605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                mButtonHAC = null;
1359605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            }
1360cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1361b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1362605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang        if (mButtonTTY != null) {
1363605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            if (getResources().getBoolean(R.bool.tty_enabled)) {
1364605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                mButtonTTY.setOnPreferenceChangeListener(this);
1365605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            } else {
1366605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                prefSet.removePreference(mButtonTTY);
1367605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                mButtonTTY = null;
1368605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            }
1369cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1370cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1371cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (!getResources().getBoolean(R.bool.world_phone)) {
137272f5bad415f3f723cf11b22effe76908ed222826John Wang            Preference options = prefSet.findPreference(BUTTON_CDMA_OPTIONS);
137372f5bad415f3f723cf11b22effe76908ed222826John Wang            if (options != null)
137472f5bad415f3f723cf11b22effe76908ed222826John Wang                prefSet.removePreference(options);
137572f5bad415f3f723cf11b22effe76908ed222826John Wang            options = prefSet.findPreference(BUTTON_GSM_UMTS_OPTIONS);
137672f5bad415f3f723cf11b22effe76908ed222826John Wang            if (options != null)
137772f5bad415f3f723cf11b22effe76908ed222826John Wang                prefSet.removePreference(options);
1378cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
137979b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink            int phoneType = mPhone.getPhoneType();
138079b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink            if (phoneType == Phone.PHONE_TYPE_CDMA) {
138172f5bad415f3f723cf11b22effe76908ed222826John Wang                Preference fdnButton = prefSet.findPreference(BUTTON_FDN_KEY);
138272f5bad415f3f723cf11b22effe76908ed222826John Wang                if (fdnButton != null)
138372f5bad415f3f723cf11b22effe76908ed222826John Wang                    prefSet.removePreference(fdnButton);
1384cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                addPreferencesFromResource(R.xml.cdma_call_options);
138579b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink            } else if (phoneType == Phone.PHONE_TYPE_GSM) {
1386cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                addPreferencesFromResource(R.xml.gsm_umts_call_options);
138779b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink            } else {
138879b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink                throw new IllegalStateException("Unexpected phone type: " + phoneType);
1389b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
1390b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
1391b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1392cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        // create intent to bring up contact list
1393cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mContactListIntent = new Intent(Intent.ACTION_GET_CONTENT);
1394cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mContactListIntent.setType(android.provider.Contacts.Phones.CONTENT_ITEM_TYPE);
1395cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1396cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        // check the intent that started this activity and pop up the voicemail
1397cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        // dialog if we've been asked to.
13986da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // If we have at least one non default VM provider registered then bring up
13996da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // the selection for the VM provider, otherwise bring up a VM number dialog.
14006da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // We only bring up the dialog the first time we are called (not after orientation change)
14016da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        if (icicle == null) {
1402b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL) &&
1403b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky                    mVoicemailProviders != null) {
14046da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                if (mVMProvidersData.size() > 1) {
14056da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                    simulatePreferenceClick(mVoicemailProviders);
14066da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                } else {
14079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    onPreferenceChange(mVoicemailProviders, DEFAULT_VM_PROVIDER_KEY);
14089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    mVoicemailProviders.setValue(DEFAULT_VM_PROVIDER_KEY);
14096da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                }
14106da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            }
1411cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1412b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        updateVoiceNumberField();
14139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mVMProviderSettingsForced = false;
1414fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        addPreferencesFromResource(R.xml.sip_settings_category);
1415b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1416b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1417b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
1418cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    protected void onResume() {
1419cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        super.onResume();
1420b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        mForeground = true;
1421b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1422cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonDTMF != null) {
1423cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int dtmf = Settings.System.getInt(getContentResolver(),
1424cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, DTMF_TONE_TYPE_NORMAL);
1425cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonDTMF.setValueIndex(dtmf);
1426cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1427d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
1428cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonAutoRetry != null) {
1429cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int autoretry = Settings.System.getInt(getContentResolver(),
1430cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    Settings.System.CALL_AUTO_RETRY, 0);
1431cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonAutoRetry.setChecked(autoretry != 0);
1432d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville        }
14333800ac871d6548790ac6119bb68b9be0640af261David Krause
1434cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonHAC != null) {
1435cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int hac = Settings.System.getInt(getContentResolver(), Settings.System.HEARING_AID, 0);
1436cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonHAC.setChecked(hac != 0);
1437cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1438d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
1439cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonTTY != null) {
1440dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            int settingsTtyMode = Settings.Secure.getInt(getContentResolver(),
1441dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent                    Settings.Secure.PREFERRED_TTY_MODE,
1442dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent                    Phone.TTY_MODE_OFF);
1443dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            mButtonTTY.setValue(Integer.toString(settingsTtyMode));
1444dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            updatePreferredTtyModeSummary(settingsTtyMode);
1445cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1446b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1447b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1448cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private void handleTTYChange(Preference preference, Object objValue) {
1449404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        int buttonTtyMode;
1450404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        buttonTtyMode = Integer.valueOf((String) objValue).intValue();
1451404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        int settingsTtyMode = android.provider.Settings.Secure.getInt(
1452cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                getContentResolver(),
1453404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                android.provider.Settings.Secure.PREFERRED_TTY_MODE, preferredTtyMode);
1454cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (DBG) log("handleTTYChange: requesting set TTY mode enable (TTY) to" +
1455404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                Integer.toString(buttonTtyMode));
1456404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1457404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        if (buttonTtyMode != settingsTtyMode) {
1458404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            switch(buttonTtyMode) {
1459404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_OFF:
1460404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_FULL:
1461404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_HCO:
1462404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_VCO:
1463dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent                android.provider.Settings.Secure.putInt(getContentResolver(),
1464dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent                        android.provider.Settings.Secure.PREFERRED_TTY_MODE, buttonTtyMode);
1465404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                break;
1466404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            default:
1467dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent                buttonTtyMode = Phone.TTY_MODE_OFF;
1468404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            }
1469a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1470dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            mButtonTTY.setValue(Integer.toString(buttonTtyMode));
1471dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            updatePreferredTtyModeSummary(buttonTtyMode);
1472dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            Intent ttyModeChanged = new Intent(TtyIntent.TTY_PREFERRED_MODE_CHANGE_ACTION);
1473dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            ttyModeChanged.putExtra(TtyIntent.TTY_PREFFERED_MODE, buttonTtyMode);
1474dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            sendBroadcast(ttyModeChanged);
1475a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
1476dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent    }
1477a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1478dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent    private void updatePreferredTtyModeSummary(int TtyMode) {
1479dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent        String [] txts = getResources().getStringArray(R.array.tty_mode_entries);
1480dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent        switch(TtyMode) {
1481dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            case Phone.TTY_MODE_OFF:
1482dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            case Phone.TTY_MODE_HCO:
1483dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            case Phone.TTY_MODE_VCO:
1484dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            case Phone.TTY_MODE_FULL:
1485dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent                mButtonTTY.setSummary(txts[TtyMode]);
1486dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent                break;
1487dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            default:
1488cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                mButtonTTY.setEnabled(false);
1489dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent                mButtonTTY.setSummary(txts[Phone.TTY_MODE_OFF]);
1490a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
14913800ac871d6548790ac6119bb68b9be0640af261David Krause    }
14923800ac871d6548790ac6119bb68b9be0640af261David Krause
1493b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static void log(String msg) {
1494b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        Log.d(LOG_TAG, msg);
1495b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1496365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1497365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    /**
1498365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Updates the look of the VM preference widgets based on current VM provider settings.
1499365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Note that the provider name is loaded form the found activity via loadLabel in
1500365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * initVoiceMailProviders in order for it to be localizable.
1501365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     */
1502365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private void updateVMPreferenceWidgets(String currentProviderSetting) {
1503365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final String key = currentProviderSetting;
1504365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final VoiceMailProvider provider = mVMProvidersData.get(key);
1505365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1506365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        /* This is the case when we are coming up on a freshly wiped phone and there is no
1507365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky         persisted value for the list preference mVoicemailProviders.
1508365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky         In this case we want to show the UI asking the user to select a voicemail provider as
1509365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky         opposed to silently falling back to default one. */
1510365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        if (provider == null) {
1511365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailProviders.setSummary(getString(R.string.sum_voicemail_choose_provider));
1512365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setSummary("");
1513365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setEnabled(false);
1514365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setIntent(null);
1515365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        } else {
1516365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            final String providerName = provider.name;
1517365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailProviders.setSummary(providerName);
1518365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setSummary(getApplicationContext().getString(
1519365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    R.string.voicemail_settings_for, providerName));
1520365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setEnabled(true);
1521365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setIntent(provider.intent);
1522365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
1523365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
1524365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1525365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    /**
1526365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Enumerates existing VM providers and puts their data into the list and populates
1527365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * the preference list objects with their names.
15286da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * In case we are called with ACTION_ADD_VOICEMAIL intent the intent may have
1529e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     * an extra string called IGNORE_PROVIDER_EXTRA with "package.activityName" of the provider
15306da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * which should be hidden when we bring up the list of possible VM providers to choose.
15316da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * This allows a provider which is being disabled (e.g. GV user logging out) to force the user
15326da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * to pick some other provider.
1533365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     */
1534365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private void initVoiceMailProviders() {
15359440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mPerProviderSavedVMNumbers =
15369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            this.getApplicationContext().getSharedPreferences(
15379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                VM_NUMBERS_SHARED_PREFERENCES_NAME, MODE_PRIVATE);
15389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
15396da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        String providerToIgnore = null;
15406da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL)) {
15419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("ACTION_ADD_VOICEMAIL");
15429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (getIntent().hasExtra(IGNORE_PROVIDER_EXTRA)) {
15439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                providerToIgnore = getIntent().getStringExtra(IGNORE_PROVIDER_EXTRA);
15449440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
15459440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("providerToIgnore=" + providerToIgnore);
15467c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            if (providerToIgnore != null) {
15477c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                deleteSettingsForVoicemailProvider(providerToIgnore);
15487c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            }
15496da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        }
15506da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
1551365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVMProvidersData.clear();
1552365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1553365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        // Stick the default element which is always there
1554365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final String myCarrier = getString(R.string.voicemail_default);
15559440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mVMProvidersData.put(DEFAULT_VM_PROVIDER_KEY, new VoiceMailProvider(myCarrier, null));
1556365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1557365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        // Enumerate providers
1558365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        PackageManager pm = getPackageManager();
1559365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        Intent intent = new Intent();
1560365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        intent.setAction(ACTION_CONFIGURE_VOICEMAIL);
1561365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
15626da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        int len = resolveInfos.size() + 1; // +1 for the default choice we will insert.
1563365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
15646da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // Go through the list of discovered providers populating the data map
15656da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // skip the provider we were instructed to ignore if there was one
1566365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        for (int i = 0; i < resolveInfos.size(); i++) {
1567365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            final ResolveInfo ri= resolveInfos.get(i);
15686da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            final ActivityInfo currentActivityInfo = ri.activityInfo;
15696da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            final String key = makeKeyForActivity(currentActivityInfo);
15709440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Loading " + key);
15716da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            if (key.equals(providerToIgnore)) {
15729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Ignoring " + key);
15736da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                len--;
15746da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                continue;
15756da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            }
1576365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            final String nameForDisplay = ri.loadLabel(pm).toString();
1577365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            Intent providerIntent = new Intent();
1578365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            providerIntent.setAction(ACTION_CONFIGURE_VOICEMAIL);
1579365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            providerIntent.setClassName(currentActivityInfo.packageName,
1580365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    currentActivityInfo.name);
1581365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVMProvidersData.put(
1582365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    key,
1583365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    new VoiceMailProvider(nameForDisplay, providerIntent));
15846da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
15856da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        }
15866da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
15876da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // Now we know which providers to display - create entries and values array for
15886da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // the list preference
15896da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        String [] entries = new String [len];
15906da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        String [] values = new String [len];
15916da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        entries[0] = myCarrier;
15929440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        values[0] = DEFAULT_VM_PROVIDER_KEY;
15936da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        int entryIdx = 1;
15946da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        for (int i = 0; i < resolveInfos.size(); i++) {
15956da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            final String key = makeKeyForActivity(resolveInfos.get(i).activityInfo);
15966da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            if (!mVMProvidersData.containsKey(key)) {
15976da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                continue;
15986da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            }
15996da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            entries[entryIdx] = mVMProvidersData.get(key).name;
16006da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            values[entryIdx] = key;
16016da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            entryIdx++;
1602365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
1603365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1604365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVoicemailProviders.setEntries(entries);
1605365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVoicemailProviders.setEntryValues(values);
1606365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
16077c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky        mPreviousVMProviderKey = getCurrentVoicemailProviderKey();
16089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        updateVMPreferenceWidgets(mPreviousVMProviderKey);
1609365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
16106da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
16116da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    private String makeKeyForActivity(ActivityInfo ai) {
16129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        return ai.name;
16136da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    }
16146da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
16156da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    /**
16166da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * Simulates user clicking on a passed preference.
16176da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * Usually needed when the preference is a dialog preference and we want to invoke
16186da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * a dialog for this preference programmatically.
16196da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * TODO(iliat): figure out if there is a cleaner way to cause preference dlg to come up
16206da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     */
16216da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    private void simulatePreferenceClick(Preference preference) {
16226da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // Go through settings until we find our setting
16236da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // and then simulate a click on it to bring up the dialog
16246da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        final ListAdapter adapter = getPreferenceScreen().getRootAdapter();
16256da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        for (int idx = 0; idx < adapter.getCount(); idx++) {
16266da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            if (adapter.getItem(idx) == preference) {
16276da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                getPreferenceScreen().onItemClick(this.getListView(),
16286da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                        null, idx, adapter.getItemId(idx));
16296da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                break;
16306da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            }
16316da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        }
16326da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    }
1633e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
1634e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    /**
16359440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Saves new VM provider settings associating them with the currently selected
16369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * provider if settings are different than the ones already stored for this
1637e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     * provider.
16389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Later on these will be used when the user switches a provider.
1639e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     */
16409440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void maybeSaveSettingsForVoicemailProvider(String key,
16419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            VoiceMailProviderSettings newSettings) {
1642b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky        if (mVoicemailProviders == null) {
1643b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            return;
1644b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky        }
16459440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        final VoiceMailProviderSettings curSettings = loadSettingsForVoiceMailProvider(key);
16469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (newSettings.equals(curSettings)) {
16479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Not saving setting for " + key + " since they have not changed");
1648e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky            return;
1649e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky        }
16509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("Saving settings for " + key + ": " + newSettings.toString());
16519440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        Editor editor = mPerProviderSavedVMNumbers.edit();
16529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        editor.putString(key + VM_NUMBER_TAG,newSettings.voicemailNumber);
16539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        String fwdKey = key + FWD_SETTINGS_TAG;
16549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CallForwardInfo[] s = newSettings.forwardingSettings;
16559440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (s != FWD_SETTINGS_DONT_TOUCH) {
16569440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            editor.putInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, s.length);
16579440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < s.length; i++) {
16589440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                final String settingKey = fwdKey + FWD_SETTING_TAG + String.valueOf(i);
16599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                final CallForwardInfo fi = s[i];
16609440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                editor.putInt(settingKey + FWD_SETTING_STATUS, fi.status);
16619440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                editor.putInt(settingKey + FWD_SETTING_REASON, fi.reason);
16629440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                editor.putString(settingKey + FWD_SETTING_NUMBER, fi.number);
16639440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                editor.putInt(settingKey + FWD_SETTING_TIME, fi.timeSeconds);
16649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
16659440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
16669440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            editor.putInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
16679440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
16689f994b77f3f22b9a23887a324380d9fd317d4e06Brad Fitzpatrick        editor.apply();
1669e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    }
1670e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
1671e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    /**
16729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Returns settings previously stored for the currently selected
1673e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     * voice mail provider. If none is stored returns null.
16749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * If the user switches to a voice mail provider and we have settings
1675e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     * stored for it we will automatically change the phone's voice mail number
16769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * and forwarding number to the stored one. Otherwise we will bring up provider's configuration
16779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * UI.
1678e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     */
16799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private VoiceMailProviderSettings loadSettingsForVoiceMailProvider(String key) {
16809440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        final String vmNumberSetting = mPerProviderSavedVMNumbers.getString(key + VM_NUMBER_TAG,
16819440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                null);
16829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (vmNumberSetting == null) {
16839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Settings for " + key + " not found");
16849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return null;
16859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
16869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
16879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CallForwardInfo[] cfi = FWD_SETTINGS_DONT_TOUCH;
16889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        String fwdKey = key + FWD_SETTINGS_TAG;
16899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        final int fwdLen = mPerProviderSavedVMNumbers.getInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
16909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (fwdLen > 0) {
16919440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            cfi = new CallForwardInfo[fwdLen];
16929440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < cfi.length; i++) {
16939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                final String settingKey = fwdKey + FWD_SETTING_TAG + String.valueOf(i);
16949440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i] = new CallForwardInfo();
16959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].status = mPerProviderSavedVMNumbers.getInt(
16969440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        settingKey + FWD_SETTING_STATUS, 0);
16979440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].reason = mPerProviderSavedVMNumbers.getInt(
16989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        settingKey + FWD_SETTING_REASON,
16999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        CommandsInterface.CF_REASON_ALL_CONDITIONAL);
17009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
17019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].toa = PhoneNumberUtils.TOA_International;
17029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].number = mPerProviderSavedVMNumbers.getString(
17039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        settingKey + FWD_SETTING_NUMBER, "");
17049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].timeSeconds = mPerProviderSavedVMNumbers.getInt(
17059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        settingKey + FWD_SETTING_TIME, 20);
17069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
17079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
17089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
17099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        VoiceMailProviderSettings settings =  new VoiceMailProviderSettings(vmNumberSetting, cfi);
17109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("Loaded settings for " + key + ": " + settings.toString());
17119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        return settings;
17129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
17139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
17149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
17159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Deletes settings for the specified provider.
17169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
17179440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void deleteSettingsForVoicemailProvider(String key) {
17189440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("Deleting settings for" + key);
17199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mVoicemailProviders == null) {
17209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return;
17219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
17229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mPerProviderSavedVMNumbers.edit()
17239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            .putString(key + VM_NUMBER_TAG, null)
17249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            .putInt(key + FWD_SETTINGS_TAG + FWD_SETTINGS_LENGTH_TAG, 0)
17259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            .commit();
1726e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    }
17277c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky
17287c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky    private String getCurrentVoicemailProviderKey() {
17297c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky        final String key = mVoicemailProviders.getValue();
17307c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky        return (key != null) ? key : DEFAULT_VM_PROVIDER_KEY;
17317c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky    }
1732b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project}
1733