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
192c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawaimport com.android.internal.telephony.CallForwardInfo;
202c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawaimport com.android.internal.telephony.CommandsInterface;
212c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawaimport com.android.internal.telephony.Phone;
222c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawaimport com.android.internal.telephony.cdma.TtyIntent;
232c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawaimport com.android.phone.sip.SipSharedPreferences;
242c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa
252c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawaimport android.app.ActionBar;
262c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawaimport android.app.Activity;
27b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.app.AlertDialog;
28b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.app.Dialog;
299440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinskyimport android.app.ProgressDialog;
30cd0189299f484dcbd51400b994daf585923e9e8dDavid Krauseimport android.content.Context;
31b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.DialogInterface;
32b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.Intent;
33e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinskyimport android.content.SharedPreferences;
349440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinskyimport android.content.SharedPreferences.Editor;
35365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport android.content.pm.ActivityInfo;
36365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport android.content.pm.PackageManager;
37365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport android.content.pm.ResolveInfo;
38b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.database.Cursor;
39cd0189299f484dcbd51400b994daf585923e9e8dDavid Krauseimport android.media.AudioManager;
403e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wangimport android.net.sip.SipManager;
41b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.AsyncResult;
42b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Bundle;
43b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Handler;
44b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Message;
45b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.CheckBoxPreference;
46b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.ListPreference;
47b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.Preference;
48b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.PreferenceActivity;
49ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyanimport android.preference.PreferenceGroup;
50b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.PreferenceScreen;
512bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Parkimport android.provider.ContactsContract.CommonDataKinds;
522c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawaimport android.provider.Settings;
539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinskyimport android.telephony.PhoneNumberUtils;
54b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.text.TextUtils;
55b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.util.Log;
562c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawaimport android.view.MenuItem;
57b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.WindowManager;
586da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinskyimport android.widget.ListAdapter;
59b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
60f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil Kingimport java.util.Collection;
61365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport java.util.HashMap;
62f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil Kingimport java.util.HashSet;
63f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil Kingimport java.util.Iterator;
64365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport java.util.List;
65365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport java.util.Map;
66365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
67f40c04a87e30bcfb795a5879d932418f0821fdb0David Brown/**
68f40c04a87e30bcfb795a5879d932418f0821fdb0David Brown * Top level "Call settings" UI; see res/xml/call_feature_setting.xml
69f30760970fd20b093f73a2b05b8fad43eef036cfDavid Brown *
70f30760970fd20b093f73a2b05b8fad43eef036cfDavid Brown * This preference screen is the root of the "Call settings" hierarchy
71f30760970fd20b093f73a2b05b8fad43eef036cfDavid Brown * available from the Phone app; the settings here let you control various
72f30760970fd20b093f73a2b05b8fad43eef036cfDavid Brown * features related to phone calls (including voicemail settings, SIP
73f30760970fd20b093f73a2b05b8fad43eef036cfDavid Brown * settings, the "Respond via SMS" feature, and others.)  It's used only
74f30760970fd20b093f73a2b05b8fad43eef036cfDavid Brown * on voice-capable phone devices.
75f30760970fd20b093f73a2b05b8fad43eef036cfDavid Brown *
76f30760970fd20b093f73a2b05b8fad43eef036cfDavid Brown * Note that this activity is part of the package com.android.phone, even
77f30760970fd20b093f73a2b05b8fad43eef036cfDavid Brown * though you reach it from the "Phone" app (i.e. DialtactsActivity) which
78f30760970fd20b093f73a2b05b8fad43eef036cfDavid Brown * is from the package com.android.contacts.
79f30760970fd20b093f73a2b05b8fad43eef036cfDavid Brown *
80f30760970fd20b093f73a2b05b8fad43eef036cfDavid Brown * For the "Mobile network settings" screen under the main Settings app,
81f30760970fd20b093f73a2b05b8fad43eef036cfDavid Brown * see apps/Phone/src/com/android/phone/Settings.java.
82f40c04a87e30bcfb795a5879d932418f0821fdb0David Brown */
83b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectpublic class CallFeaturesSetting extends PreferenceActivity
84b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        implements DialogInterface.OnClickListener,
85b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        Preference.OnPreferenceChangeListener,
86b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        EditPhoneNumberPreference.OnDialogClosedListener,
87b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        EditPhoneNumberPreference.GetDefaultNumberListener{
88b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
896da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    // intent action to bring up voice mail settings
90b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public static final String ACTION_ADD_VOICEMAIL =
91b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        "com.android.phone.CallFeaturesSetting.ADD_VOICEMAIL";
926da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    // intent action sent by this activity to a voice mail provider
936da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    // to trigger its configuration UI
94365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    public static final String ACTION_CONFIGURE_VOICEMAIL =
95365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        "com.android.phone.CallFeaturesSetting.CONFIGURE_VOICEMAIL";
966da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    // Extra put in the return from VM provider config containing voicemail number to set
976da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    public static final String VM_NUMBER_EXTRA = "com.android.phone.VoicemailNumber";
989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Extra put in the return from VM provider config containing call forwarding number to set
999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_NUMBER_EXTRA = "com.android.phone.ForwardingNumber";
1009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Extra put in the return from VM provider config containing call forwarding number to set
1019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_NUMBER_TIME_EXTRA = "com.android.phone.ForwardingNumberTime";
1029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // If the VM provider returns non null value in this extra we will force the user to
1039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // choose another VM provider
1049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String SIGNOUT_EXTRA = "com.android.phone.Signout";
1052c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa    //Information about logical "up" Activity
1062c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa    private static final String UP_ACTIVITY_PACKAGE = "com.android.contacts";
1072c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa    private static final String UP_ACTIVITY_CLASS =
1082c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa            "com.android.contacts.activities.DialtactsActivity";
1099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
1109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Used to tell the saving logic to leave forwarding number as is
1119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final CallForwardInfo[] FWD_SETTINGS_DONT_TOUCH = null;
1129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Suffix appended to provider key for storing vm number
1139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String VM_NUMBER_TAG = "#VMNumber";
1149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Suffix appended to provider key for storing forwarding settings
1159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTINGS_TAG = "#FWDSettings";
1169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Suffix appended to forward settings key for storing length of settings array
1179440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTINGS_LENGTH_TAG = "#Length";
1189440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Suffix appended to forward settings key for storing an individual setting
1199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTING_TAG = "#Setting";
1209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Suffixes appended to forward setting key for storing an individual setting properties
1219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTING_STATUS = "#Status";
1229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTING_REASON = "#Reason";
1239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTING_NUMBER = "#Number";
1249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String FWD_SETTING_TIME = "#Time";
1259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
1269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Key identifying the default vocie mail provider
1279440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    public static final String DEFAULT_VM_PROVIDER_KEY = "";
128b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
129e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    // Extra put into ACTION_ADD_VOICEMAIL call to indicate which provider
130e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    // to remove from the list of providers presented to the user
131e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    public static final String IGNORE_PROVIDER_EXTRA = "com.android.phone.ProviderToIgnore";
132e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
133b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // debug data
13487258b2b589c3afea4b89b840251012378e0d3b4David Brown    private static final String LOG_TAG = "CallFeaturesSetting";
135cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
136b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1376da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    // string constants
138153b94130a5e7a0e7bb17f17ce8f1ed294453d9eDmitri Plotnikov    private static final String NUM_PROJECTION[] = {CommonDataKinds.Phone.NUMBER};
139b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
140b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // String keys for preference lookup
141f40c04a87e30bcfb795a5879d932418f0821fdb0David Brown    // TODO: Naming these "BUTTON_*" is confusing since they're not actually buttons(!)
142b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final String BUTTON_VOICEMAIL_KEY = "button_voicemail_key";
143365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private static final String BUTTON_VOICEMAIL_PROVIDER_KEY = "button_voicemail_provider_key";
144365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private static final String BUTTON_VOICEMAIL_SETTING_KEY = "button_voicemail_setting_key";
145b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final String BUTTON_FDN_KEY   = "button_fdn_key";
146f40c04a87e30bcfb795a5879d932418f0821fdb0David Brown    private static final String BUTTON_RESPOND_VIA_SMS_KEY   = "button_respond_via_sms_key";
147b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
148cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_DTMF_KEY   = "button_dtmf_settings";
1493800ac871d6548790ac6119bb68b9be0640af261David Krause    private static final String BUTTON_RETRY_KEY  = "button_auto_retry_key";
150cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_TTY_KEY    = "button_tty_mode_key";
151cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_HAC_KEY    = "button_hac_key";
152cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
153cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_GSM_UMTS_OPTIONS = "button_gsm_more_expand_key";
154cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_CDMA_OPTIONS = "button_cdma_more_expand_key";
155a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
156e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    private static final String VM_NUMBERS_SHARED_PREFERENCES_NAME = "vm_numbers";
157e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
158bb5fb3fa71c9b9ab678f5cf5f2a9cc69ceea3445Chung-yih Wang    private static final String BUTTON_SIP_CALL_OPTIONS =
159bb5fb3fa71c9b9ab678f5cf5f2a9cc69ceea3445Chung-yih Wang            "sip_call_options_key";
160ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan    private static final String BUTTON_SIP_CALL_OPTIONS_WIFI_ONLY =
161ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan            "sip_call_options_wifi_only_key";
162122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang    private static final String SIP_SETTINGS_CATEGORY_KEY =
163122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang            "sip_settings_category_key";
164bb5fb3fa71c9b9ab678f5cf5f2a9cc69ceea3445Chung-yih Wang
165b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private Intent mContactListIntent;
166b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
167b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /** Event for Async voicemail change call */
1689440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int EVENT_VOICEMAIL_CHANGED        = 500;
1699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int EVENT_FORWARDING_CHANGED       = 501;
1709440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int EVENT_FORWARDING_GET_COMPLETED = 502;
171d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
172a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville    // preferred TTY mode
173cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    // Phone.TTY_MODE_xxx
174cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    static final int preferredTtyMode = Phone.TTY_MODE_OFF;
175b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
176d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville    // Dtmf tone types
177d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville    static final int DTMF_TONE_TYPE_NORMAL = 0;
178d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville    static final int DTMF_TONE_TYPE_LONG   = 1;
179d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
18006376849cdac54b573be9204837b451ef8013cc6Eric Laurent    public static final String HAC_KEY = "HACSetting";
18106376849cdac54b573be9204837b451ef8013cc6Eric Laurent    public static final String HAC_VAL_ON = "ON";
18206376849cdac54b573be9204837b451ef8013cc6Eric Laurent    public static final String HAC_VAL_OFF = "OFF";
183d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
184b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /** Handle to voicemail pref */
185cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final int VOICEMAIL_PREF_ID = 1;
186365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private static final int VOICEMAIL_PROVIDER_CFG_ID = 2;
187b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
188b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private Phone mPhone;
189b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
190cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private AudioManager mAudioManager;
1913e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang    private SipManager mSipManager;
192cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
193b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int VM_NOCHANGE_ERROR = 400;
194b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int VM_RESPONSE_ERROR = 500;
1959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int FW_SET_RESPONSE_ERROR = 501;
1969440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int FW_GET_RESPONSE_ERROR = 502;
197b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
198b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
199b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // dialog identifiers for voicemail
200b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int VOICEMAIL_DIALOG_CONFIRM = 600;
2019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int VOICEMAIL_FWD_SAVING_DIALOG = 601;
2029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int VOICEMAIL_FWD_READING_DIALOG = 602;
203bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    private static final int VOICEMAIL_REVERTING_DIALOG = 603;
204b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
205b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // status message sent back from handlers
206b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MSG_OK = 100;
207cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
208b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // special statuses for voicemail controls.
209b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MSG_VM_EXCEPTION = 400;
2109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int MSG_FW_SET_EXCEPTION = 401;
2119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private static final int MSG_FW_GET_EXCEPTION = 402;
212b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MSG_VM_OK = 600;
213b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MSG_VM_NOCHANGE = 700;
214cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
215b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private EditPhoneNumberPreference mSubMenuVoicemailSettings;
216cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
2173800ac871d6548790ac6119bb68b9be0640af261David Krause    private CheckBoxPreference mButtonAutoRetry;
218cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private CheckBoxPreference mButtonHAC;
219cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private ListPreference mButtonDTMF;
220404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville    private ListPreference mButtonTTY;
221bb5fb3fa71c9b9ab678f5cf5f2a9cc69ceea3445Chung-yih Wang    private ListPreference mButtonSipCallOptions;
222365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private ListPreference mVoicemailProviders;
223365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private PreferenceScreen mVoicemailSettings;
2243e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang    private SipSharedPreferences mSipSharedPreferences;
2259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
226365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private class VoiceMailProvider {
227365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        public VoiceMailProvider(String name, Intent intent) {
228365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            this.name = name;
229365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            this.intent = intent;
230365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
231365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        public String name;
232365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        public Intent intent;
233365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
2349440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2359440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
2369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Forwarding settings we are going to save.
2379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
2389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    static final int [] FORWARDING_SETTINGS_REASONS = new int[] {
2399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CommandsInterface.CF_REASON_UNCONDITIONAL,
2409440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CommandsInterface.CF_REASON_BUSY,
2419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CommandsInterface.CF_REASON_NO_REPLY,
2429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CommandsInterface.CF_REASON_NOT_REACHABLE
2439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    };
2449440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2459440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private class VoiceMailProviderSettings {
2469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        /**
2479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky         * Constructs settings object, setting all conditional forwarding to the specified number
2489440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky         */
2499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public VoiceMailProviderSettings(String voicemailNumber, String forwardingNumber,
2509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                int timeSeconds) {
2519440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            this.voicemailNumber = voicemailNumber;
2529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (forwardingNumber == null || forwardingNumber.length() == 0) {
2539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                this.forwardingSettings = FWD_SETTINGS_DONT_TOUCH;
2549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            } else {
2559440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                this.forwardingSettings = new CallForwardInfo[FORWARDING_SETTINGS_REASONS.length];
2569440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                for (int i = 0; i < this.forwardingSettings.length; i++) {
2579440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    CallForwardInfo fi = new CallForwardInfo();
2589440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    this.forwardingSettings[i] = fi;
2599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.reason = FORWARDING_SETTINGS_REASONS[i];
2609440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.status = (fi.reason == CommandsInterface.CF_REASON_UNCONDITIONAL) ? 0 : 1;
2619440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
2629440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.toa = PhoneNumberUtils.TOA_International;
2639440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.number = forwardingNumber;
2649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    fi.timeSeconds = timeSeconds;
2659440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
2669440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
2679440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
2689440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public VoiceMailProviderSettings(String voicemailNumber, CallForwardInfo[] infos) {
2709440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            this.voicemailNumber = voicemailNumber;
2719440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            this.forwardingSettings = infos;
2729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
2739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        @Override
2759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public boolean equals(Object o) {
2769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (o == null) return false;
2779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (!(o instanceof VoiceMailProviderSettings)) return false;
2789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final VoiceMailProviderSettings v = (VoiceMailProviderSettings)o;
2799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2809440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return ((this.voicemailNumber == null &&
2819440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        v.voicemailNumber == null) ||
2829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    this.voicemailNumber != null &&
2839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        this.voicemailNumber.equals(v.voicemailNumber))
2849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    &&
2859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    forwardingSettingsEqual(this.forwardingSettings,
2869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                            v.forwardingSettings);
2879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
2889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
2899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        private boolean forwardingSettingsEqual(CallForwardInfo[] infos1,
2909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                CallForwardInfo[] infos2) {
2919440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (infos1 == infos2) return true;
2929440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (infos1 == null || infos2 == null) return false;
2939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (infos1.length != infos2.length) return false;
2949440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < infos1.length; i++) {
2959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                CallForwardInfo i1 = infos1[i];
2969440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                CallForwardInfo i2 = infos2[i];
2979440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (i1.status != i2.status ||
2989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    i1.reason != i2.reason ||
2999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    i1.serviceClass != i2.serviceClass ||
3009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    i1.toa != i2.toa ||
3019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    i1.number != i2.number ||
3029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    i1.timeSeconds != i2.timeSeconds) {
3039440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    return false;
3049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
3059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
3069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return true;
3079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
3089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
3099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        @Override
3109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public String toString() {
3119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return voicemailNumber + ((forwardingSettings != null ) ? (", " +
3129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    forwardingSettings.toString()) : "");
3139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
3149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
3159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public String voicemailNumber;
3169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public CallForwardInfo[] forwardingSettings;
3179440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
3189440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
319e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    SharedPreferences mPerProviderSavedVMNumbers;
320365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
321365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    /**
3229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Results of reading forwarding settings
3239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
3249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    CallForwardInfo[] mForwardingReadResults = null;
3259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
3269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
327f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * Result of forwarding number change.
328f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * Keys are reasons (eg. unconditional forwarding).
3299440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
330f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    private Map<Integer, AsyncResult> mForwardingChangeResults = null;
331f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King
332f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    /**
333f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * Expected CF read result types.
334f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * This set keeps track of the CF types for which we've issued change
335f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * commands so we can tell when we've received all of the responses.
336f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     */
337f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    private Collection<Integer> mExpectedChangeResultReasons = null;
3389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
3399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
3409440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Result of vm number change
3419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
3429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    AsyncResult mVoicemailChangeResult = null;
3439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
3449440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
3459440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Previous VM provider setting so we can return to it in case of failure.
3469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
3479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    String mPreviousVMProviderKey = null;
3489440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
3499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
3509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Id of the dialog being currently shown.
3519440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
3529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    int mCurrentDialogId = 0;
3539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
3549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
3559440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Flag indicating that we are invoking settings for the voicemail provider programmatically
3569440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * due to vm provider change.
3579440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
3589440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    boolean mVMProviderSettingsForced = false;
3598e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky
3608e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    /**
3618e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky     * Flag indicating that we are making changes to vm or fwd numbers
3628e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky     * due to vm provider change.
3638e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky     */
3648e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    boolean mChangingVMorFwdDueToProviderChange = false;
3658e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky
3669440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
367bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * True if we are in the process of vm & fwd number change and vm has already been changed.
368bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * This is used to decide what to do in case of rollback.
369bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
370bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    boolean mVMChangeCompletedSuccesfully = false;
371bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
372bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
3734e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky     * True if we had full or partial failure setting forwarding numbers and so need to roll them
3744e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky     * back.
375bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
3764e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky    boolean mFwdChangesRequireRollback = false;
377bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
378bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
379bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * Id of error msg to display to user once we are done reverting the VM provider to the previous
380bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * one.
381bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
382bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    int mVMOrFwdSetError = 0;
383bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
384bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
385365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Data about discovered voice mail settings providers.
386365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Is populated by querying which activities can handle ACTION_CONFIGURE_VOICEMAIL.
387365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * They key in this map is package name + activity name.
388365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * We always add an entry for the default provider with a key of empty
389365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * string and intent value of null.
390365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * @see #initVoiceMailProviders.
391365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     */
3922bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park    private final Map<String, VoiceMailProvider> mVMProvidersData =
393365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        new HashMap<String, VoiceMailProvider>();
394b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
395b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /** string to hold old voicemail number as it is being updated. */
396b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private String mOldVmNumber;
397b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
3989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // New call forwarding settings and vm number we will be setting
3999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Need to save these since before we get to saving we need to asynchronously
4009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // query the existing forwarding settings.
401f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    private CallForwardInfo[] mNewFwdSettings;
4029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    String mNewVMNumber;
403b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
404b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    private boolean mForeground;
405b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King
406b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    @Override
407b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    public void onPause() {
408b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        super.onPause();
409b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        mForeground = false;
410b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    }
411b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King
412f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    /**
413f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * We have to pull current settings from the network for all kinds of
414f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * voicemail providers so we can tell whether we have to update them,
415f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * so use this bit to keep track of whether we're reading settings for the
416f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * default provider and should therefore save them out when done.
417f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     */
418f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    private boolean mReadingSettingsForDefaultProvider = false;
419f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King
420b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
421b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Click Listeners, handle click based on objects attached to UI.
422b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
423b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
424b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Click listener for all toggle events
425b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
426b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
427cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (preference == mSubMenuVoicemailSettings) {
428cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            return true;
429cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else if (preference == mButtonDTMF) {
430b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return true;
431a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        } else if (preference == mButtonTTY) {
432404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            return true;
4333800ac871d6548790ac6119bb68b9be0640af261David Krause        } else if (preference == mButtonAutoRetry) {
434cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            android.provider.Settings.System.putInt(mPhone.getContext().getContentResolver(),
435cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    android.provider.Settings.System.CALL_AUTO_RETRY,
436cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    mButtonAutoRetry.isChecked() ? 1 : 0);
437cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            return true;
438cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else if (preference == mButtonHAC) {
439cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int hac = mButtonHAC.isChecked() ? 1 : 0;
440cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            // Update HAC value in Settings database
441cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            Settings.System.putInt(mPhone.getContext().getContentResolver(),
442cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    Settings.System.HEARING_AID, hac);
443b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
444cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            // Update HAC Value in AudioManager
445cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mAudioManager.setParameter(HAC_KEY, hac != 0 ? HAC_VAL_ON : HAC_VAL_OFF);
446b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return true;
447fdca0b1e064b3ac0a23744335f1ccc03796f7bb5Freeman Ng        } else if (preference == mVoicemailSettings && preference.getIntent() != null) {
448fdca0b1e064b3ac0a23744335f1ccc03796f7bb5Freeman Ng            if (DBG) log("Invoking cfg intent " + preference.getIntent().getPackage());
449fdca0b1e064b3ac0a23744335f1ccc03796f7bb5Freeman Ng            this.startActivityForResult(preference.getIntent(), VOICEMAIL_PROVIDER_CFG_ID);
450365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            return true;
451b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
452b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return false;
453b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
454b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
455b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /**
456b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Implemented to support onPreferenceChangeListener to look for preference
457cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause     * changes.
458b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     *
459cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause     * @param preference is the preference to be changed
460b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * @param objValue should be the value of the selection, NOT its localized
461b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * display value.
462b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
463b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public boolean onPreferenceChange(Preference preference, Object objValue) {
464cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (preference == mButtonDTMF) {
465cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int index = mButtonDTMF.findIndexOfValue((String) objValue);
466d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville            Settings.System.putInt(mPhone.getContext().getContentResolver(),
467d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville                    Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, index);
468cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else if (preference == mButtonTTY) {
469cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            handleTTYChange(preference, objValue);
470365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        } else if (preference == mVoicemailProviders) {
471495e409315aa3181a562baeb9d586f633b9eedc2Virgil King            final String currentProviderKey = getCurrentVoicemailProviderKey();
4729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final String newProviderKey = (String)objValue;
4739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("VM provider changes to " + newProviderKey + " from " +
4749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    mPreviousVMProviderKey);
475bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (mPreviousVMProviderKey.equals(newProviderKey)) {
476bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (DBG) log("No change ");
477bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                return true;
478bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
4799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            updateVMPreferenceWidgets(newProviderKey);
480e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
4813897278c8d39ac3ede871e4f9f963d145f6e895dIlia Tulchinsky            mPreviousVMProviderKey = currentProviderKey;
482495e409315aa3181a562baeb9d586f633b9eedc2Virgil King
4839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final VoiceMailProviderSettings newProviderSettings =
4843897278c8d39ac3ede871e4f9f963d145f6e895dIlia Tulchinsky                    loadSettingsForVoiceMailProvider(newProviderKey);
485495e409315aa3181a562baeb9d586f633b9eedc2Virgil King
4869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // If the user switches to a voice mail provider and we have a
4873897278c8d39ac3ede871e4f9f963d145f6e895dIlia Tulchinsky            // numbers stored for it we will automatically change the
4883897278c8d39ac3ede871e4f9f963d145f6e895dIlia Tulchinsky            // phone's
4899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // voice mail and forwarding number to the stored ones.
4909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // Otherwise we will bring up provider's configuration UI.
491495e409315aa3181a562baeb9d586f633b9eedc2Virgil King
4929440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (newProviderSettings == null) {
4934e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                // Force the user into a configuration of the chosen provider
4947c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                if (DBG) log("Saved preferences not found - invoking config");
4959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mVMProviderSettingsForced = true;
496e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky                simulatePreferenceClick(mVoicemailSettings);
497e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky            } else {
4987c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                if (DBG) log("Saved preferences found - switching to them");
4994e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                // Set this flag so if we get a failure we revert to previous provider
5004e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                mChangingVMorFwdDueToProviderChange = true;
5019440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                saveVoiceMailAndForwardingNumber(newProviderKey, newProviderSettings);
502e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky            }
503bb5fb3fa71c9b9ab678f5cf5f2a9cc69ceea3445Chung-yih Wang        } else if (preference == mButtonSipCallOptions) {
504bb5fb3fa71c9b9ab678f5cf5f2a9cc69ceea3445Chung-yih Wang            handleSipCallOptionsChange(objValue);
505b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
506b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // always let the preference setting proceed.
507b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return true;
508b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
509b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
510b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Preference click listener invoked on OnDialogClosed for EditPhoneNumberPreference.
511b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public void onDialogClosed(EditPhoneNumberPreference preference, int buttonClicked) {
5129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("onPreferenceClick: request preference click on dialog close: " +
5139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                buttonClicked);
5149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (buttonClicked == DialogInterface.BUTTON_NEGATIVE) {
5159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return;
5169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
517b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (preference instanceof EditPhoneNumberPreference) {
518b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            EditPhoneNumberPreference epn = preference;
519b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
520b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (epn == mSubMenuVoicemailSettings) {
521b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                handleVMBtnClickRequest();
522b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
523b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
524b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
525b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
526b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /**
527b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Implemented for EditPhoneNumberPreference.GetDefaultNumberListener.
528b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * This method set the default values for the various
529b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * EditPhoneNumberPreference dialogs.
530b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
531b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public String onGetDefaultNumber(EditPhoneNumberPreference preference) {
532b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (preference == mSubMenuVoicemailSettings) {
533b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // update the voicemail number field, which takes care of the
534b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // mSubMenuVoicemailSettings itself, so we should return null.
535b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("updating default for voicemail dialog");
536b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            updateVoiceNumberField();
537b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return null;
538b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
539b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
540a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        String vmDisplay = mPhone.getVoiceMailNumber();
541b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (TextUtils.isEmpty(vmDisplay)) {
542b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // if there is no voicemail number, we just return null to
543b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // indicate no contribution.
544b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return null;
545b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
546b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
547b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // Return the voicemail number prepended with "VM: "
548b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (DBG) log("updating default for call forwarding dialogs");
549b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return getString(R.string.voicemail_abbreviated) + " " + vmDisplay;
550b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
551b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
552b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
553b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // override the startsubactivity call to make changes in state consistent.
554b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
555b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public void startActivityForResult(Intent intent, int requestCode) {
556b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (requestCode == -1) {
557b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // this is an intent requested from the preference framework.
558b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            super.startActivityForResult(intent, requestCode);
559b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
560b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
561b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
562b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (DBG) log("startSubActivity: starting requested subactivity");
563b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        super.startActivityForResult(intent, requestCode);
564b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
565b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
5669440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void switchToPreviousVoicemailProvider() {
5679440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("switchToPreviousVoicemailProvider " + mPreviousVMProviderKey);
5689440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mPreviousVMProviderKey != null) {
5694e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky            if (mVMChangeCompletedSuccesfully || mFwdChangesRequireRollback) {
5704e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                // we have to revert with carrier
571341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown                showDialogIfForeground(VOICEMAIL_REVERTING_DIALOG);
572bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                VoiceMailProviderSettings prevSettings =
573bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    loadSettingsForVoiceMailProvider(mPreviousVMProviderKey);
574bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (mVMChangeCompletedSuccesfully) {
575bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mNewVMNumber = prevSettings.voicemailNumber;
576bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("have to revert VM to " + mNewVMNumber);
577bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mPhone.setVoiceMailNumber(
578bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            mPhone.getVoiceMailAlphaTag().toString(),
579bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            mNewVMNumber,
580bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            Message.obtain(mRevertOptionComplete, EVENT_VOICEMAIL_CHANGED));
581bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                }
5824e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                if (mFwdChangesRequireRollback) {
583bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("have to revert fwd");
584f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    final CallForwardInfo[] prevFwdSettings =
585f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                        prevSettings.forwardingSettings;
586bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (prevFwdSettings != null) {
587f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                        Map<Integer, AsyncResult> results =
588f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            mForwardingChangeResults;
589f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                        resetForwardingChangeState();
590bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                        for (int i = 0; i < prevFwdSettings.length; i++) {
591bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            CallForwardInfo fi = prevFwdSettings[i];
592bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            if (DBG) log("Reverting fwd #: " + i + ": " + fi.toString());
593f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            // Only revert the settings for which the update
594f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            // succeeded
595f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            AsyncResult result = results.get(fi.reason);
596f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            if (result != null && result.exception == null) {
597f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                mExpectedChangeResultReasons.add(fi.reason);
598f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                mPhone.setCallForwardingOption(
599f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                        (fi.status == 1 ?
600f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                                CommandsInterface.CF_ACTION_REGISTRATION :
601f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                                CommandsInterface.CF_ACTION_DISABLE),
602f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                        fi.reason,
603f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                        fi.number,
604f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                        fi.timeSeconds,
605f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                        mRevertOptionComplete.obtainMessage(
606f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                                EVENT_FORWARDING_CHANGED, i, 0));
607f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            }
608f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                        }
609bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    }
610bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                }
611bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            } else {
612bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (DBG) log("No need to revert");
613bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                onRevertDone();
614bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
615bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
616bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
617bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
618bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    void onRevertDone() {
619bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (DBG) log("Flipping provider key back to " + mPreviousVMProviderKey);
620bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        mVoicemailProviders.setValue(mPreviousVMProviderKey);
621bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        updateVMPreferenceWidgets(mPreviousVMProviderKey);
622bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        updateVoiceNumberField();
623bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (mVMOrFwdSetError != 0) {
624bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            showVMDialog(mVMOrFwdSetError);
625bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            mVMOrFwdSetError = 0;
6269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
6279440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
6289440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
629365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    // asynchronous result call after contacts are selected or after we return from
630365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    // a call to the VM settings provider.
631b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
632b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
633b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // there are cases where the contact picker may end up sending us more than one
634b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // request.  We want to ignore the request if we're not in the correct state.
635365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        if (requestCode ==  VOICEMAIL_PROVIDER_CFG_ID) {
6369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            boolean failure = false;
6379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
6389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // No matter how the processing of result goes lets clear the flag
6399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("mVMProviderSettingsForced: " + mVMProviderSettingsForced);
6409440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final boolean isVMProviderSettingsForced = mVMProviderSettingsForced;
6419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mVMProviderSettingsForced = false;
6429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
6437c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            String vmNum = null;
644365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            if (resultCode != RESULT_OK) {
645365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                if (DBG) log("onActivityResult: vm provider cfg result not OK.");
6469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                failure = true;
6477c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            } else {
6487c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                if (data == null) {
6497c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    if (DBG) log("onActivityResult: vm provider cfg result has no data");
6507c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    failure = true;
6519440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                } else {
6527c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    if (data.getBooleanExtra(SIGNOUT_EXTRA, false)) {
6537c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        if (DBG) log("Provider requested signout");
6547c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        if (isVMProviderSettingsForced) {
6557c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            if (DBG) log("Going back to previous provider on signout");
6567c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            switchToPreviousVoicemailProvider();
6577c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        } else {
6587c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            final String victim = getCurrentVoicemailProviderKey();
6597c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            if (DBG) log("Relaunching activity and ignoring " + victim);
6607c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            Intent i = new Intent(ACTION_ADD_VOICEMAIL);
6617c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            i.putExtra(IGNORE_PROVIDER_EXTRA, victim);
6627c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
6637c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                            this.startActivity(i);
6647c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        }
6657c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        return;
6667c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    }
6677c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    vmNum = data.getStringExtra(VM_NUMBER_EXTRA);
6687c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    if (vmNum == null || vmNum.length() == 0) {
6697c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        if (DBG) log("onActivityResult: vm provider cfg result has no vmnum");
6707c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                        failure = true;
6717c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                    }
6729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
6739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
6749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (failure) {
6759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Failure in return from voicemail provider");
6769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (isVMProviderSettingsForced) {
6779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    switchToPreviousVoicemailProvider();
6789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                } else {
6799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    if (DBG) log("Not switching back the provider since this is not forced config");
6809440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
681365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                return;
682365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            }
6838e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky            mChangingVMorFwdDueToProviderChange = isVMProviderSettingsForced;
6849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final String fwdNum = data.getStringExtra(FWD_NUMBER_EXTRA);
6859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
6869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // TODO(iliat): It would be nice to load the current network setting for this and
6879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // send it to the provider when it's config is invoked so it can use this as default
6889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            final int fwdNumTime = data.getIntExtra(FWD_NUMBER_TIME_EXTRA, 20);
6899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
6909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("onActivityResult: vm provider cfg result " +
6919440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    (fwdNum != null ? "has" : " does not have") + " forwarding number");
6927c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            saveVoiceMailAndForwardingNumber(getCurrentVoicemailProviderKey(),
693b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                    new VoiceMailProviderSettings(vmNum, fwdNum, fwdNumTime));
694365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            return;
695365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
696b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
697b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (resultCode != RESULT_OK) {
698b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("onActivityResult: contact picker result not OK.");
699b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
700b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
701b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
702b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        Cursor cursor = getContentResolver().query(data.getData(),
703b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                NUM_PROJECTION, null, null, null);
704b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if ((cursor == null) || (!cursor.moveToFirst())) {
705b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("onActivityResult: bad contact data, no results found.");
706b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
707b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
708b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
709b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        switch (requestCode) {
710b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            case VOICEMAIL_PREF_ID:
711b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mSubMenuVoicemailSettings.onPickActivityResult(cursor.getString(0));
712b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
713b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            default:
714b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                // TODO: may need exception here.
715b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
716b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
717b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
718b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Voicemail button logic
719b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private void handleVMBtnClickRequest() {
720b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // normally called on the dialog close.
721b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
722b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // Since we're stripping the formatting out on the getPhoneNumber()
723b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // call now, we won't need to do so here anymore.
724b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
7259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        saveVoiceMailAndForwardingNumber(
7267c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                getCurrentVoicemailProviderKey(),
7279440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                new VoiceMailProviderSettings(mSubMenuVoicemailSettings.getPhoneNumber(),
7289440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        FWD_SETTINGS_DONT_TOUCH));
729365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
730365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
731341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown
732341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown    /**
733341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown     * Wrapper around showDialog() that will silently do nothing if we're
734341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown     * not in the foreground.
735341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown     *
736341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown     * This is useful here because most of the dialogs we display from
737341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown     * this class are triggered by asynchronous events (like
738341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown     * success/failure messages from the telephony layer) and it's
739341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown     * possible for those events to come in even after the user has gone
740341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown     * to a different screen.
741341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown     */
742341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown    // TODO: this is too brittle: it's still easy to accidentally add new
743341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown    // code here that calls showDialog() directly (which will result in a
744341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown    // WindowManager$BadTokenException if called after the activity has
745341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown    // been stopped.)
746341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown    //
747341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown    // It would be cleaner to do the "if (mForeground)" check in one
748341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown    // central place, maybe by using a single Handler for all asynchronous
749341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown    // events (and have *that* discard events if we're not in the
750341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown    // foreground.)
751341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown    //
752341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown    // Unfortunately it's not that simple, since we sometimes need to do
753341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown    // actual work to handle these events whether or not we're in the
754341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown    // foreground (see the Handler code in mSetOptionComplete for
755341645cea69e5e9f1ac36134e6820db1bd8f6024David Brown    // example.)
756b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    private void showDialogIfForeground(int id) {
757b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        if (mForeground) {
758b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            showDialog(id);
759b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        }
760b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    }
761b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King
762b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    private void dismissDialogSafely(int id) {
763b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        try {
764b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            dismissDialog(id);
765b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        } catch (IllegalArgumentException e) {
766b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            // This is expected in the case where we were in the background
767b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            // at the time we would normally have shown the dialog, so we didn't
768b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            // show it.
769b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        }
770b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    }
771b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King
7729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void saveVoiceMailAndForwardingNumber(String key,
7739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            VoiceMailProviderSettings newSettings) {
7749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("saveVoiceMailAndForwardingNumber: " + newSettings.toString());
7759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mNewVMNumber = newSettings.voicemailNumber;
776b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // empty vm number == clearing the vm number ?
7779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mNewVMNumber == null) {
7789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mNewVMNumber = "";
7799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
7809440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7819440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mNewFwdSettings = newSettings.forwardingSettings;
7829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("newFwdNumber " +
7839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                String.valueOf((mNewFwdSettings != null ? mNewFwdSettings.length : 0))
7849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                + " settings");
7859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
7869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // No fwd settings on CDMA
7879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
7889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("ignoring forwarding setting since this is CDMA phone");
7899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mNewFwdSettings = FWD_SETTINGS_DONT_TOUCH;
790b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
791b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
7929440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        //throw a warning if the vm is the same and we do not touch forwarding.
7939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mNewVMNumber.equals(mOldVmNumber) && mNewFwdSettings == FWD_SETTINGS_DONT_TOUCH) {
794cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            showVMDialog(MSG_VM_NOCHANGE);
795b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
796b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
797b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
7989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        maybeSaveSettingsForVoicemailProvider(key, newSettings);
799bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        mVMChangeCompletedSuccesfully = false;
8004e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky        mFwdChangesRequireRollback = false;
801bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        mVMOrFwdSetError = 0;
802f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        if (!key.equals(mPreviousVMProviderKey)) {
803f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            mReadingSettingsForDefaultProvider =
804f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                mPreviousVMProviderKey.equals(DEFAULT_VM_PROVIDER_KEY);
8059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Reading current forwarding settings");
8069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mForwardingReadResults = new CallForwardInfo[FORWARDING_SETTINGS_REASONS.length];
8079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < FORWARDING_SETTINGS_REASONS.length; i++) {
8089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mForwardingReadResults[i] = null;
8099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mPhone.getCallForwardingOption(FORWARDING_SETTINGS_REASONS[i],
8109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        mGetOptionComplete.obtainMessage(EVENT_FORWARDING_GET_COMPLETED, i, 0));
8119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
812b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            showDialogIfForeground(VOICEMAIL_FWD_READING_DIALOG);
8139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
8149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            saveVoiceMailAndForwardingNumberStage2();
8159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
8169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
8179440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
8182bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park    private final Handler mGetOptionComplete = new Handler() {
8199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        @Override
8209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        public void handleMessage(Message msg) {
8219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            AsyncResult result = (AsyncResult) msg.obj;
8229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            switch (msg.what) {
8239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                case EVENT_FORWARDING_GET_COMPLETED:
8249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    handleForwardingSettingsReadResult(result, msg.arg1);
8259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    break;
8269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
8279440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
8289440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    };
8299440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
8309440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    void handleForwardingSettingsReadResult(AsyncResult ar, int idx) {
8319440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) Log.d(LOG_TAG, "handleForwardingSettingsReadResult: " + idx);
8329440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        Throwable error = null;
8339440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (ar.exception != null) {
8349440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "FwdRead: ar.exception=" +
8359440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    ar.exception.getMessage());
8369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            error = ar.exception;
8379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
8389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (ar.userObj instanceof Throwable) {
8399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "FwdRead: userObj=" +
8409440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    ((Throwable)ar.userObj).getMessage());
8419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            error = (Throwable)ar.userObj;
8429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
8439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
8449440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // We may have already gotten an error and decided to ignore the other results.
8459440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mForwardingReadResults == null) {
8469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "ignoring fwd reading result: " + idx);
8479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return;
8489440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
8499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
8509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // In case of error ignore other results, show an error dialog
8519440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (error != null) {
8529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Error discovered for fwd read : " + idx);
8539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            mForwardingReadResults = null;
854b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            dismissDialogSafely(VOICEMAIL_FWD_READING_DIALOG);
8559440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            showVMDialog(MSG_FW_GET_EXCEPTION);
8569440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return;
8579440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
8589440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
8599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // Get the forwarding info
8609440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        final CallForwardInfo cfInfoArray[] = (CallForwardInfo[]) ar.result;
8619440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CallForwardInfo fi = null;
8629440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        for (int i = 0 ; i < cfInfoArray.length; i++) {
8639440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if ((cfInfoArray[i].serviceClass & CommandsInterface.SERVICE_CLASS_VOICE) != 0) {
8649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                fi = cfInfoArray[i];
8659440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
8669440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
8679440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
8689440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (fi == null) {
8699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
8709440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // In case we go nothing it means we need this reason disabled
8719440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            // so create a CallForwardInfo for capturing this
8729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Creating default info for " + idx);
8739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            fi = new CallForwardInfo();
8749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            fi.status = 0;
8759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            fi.reason = FORWARDING_SETTINGS_REASONS[idx];
8769440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            fi.serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
8779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
8782bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park            // if there is not a forwarding number, ensure the entry is set to "not active."
8792bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park            if (fi.number == null || fi.number.length() == 0) {
8802bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park                fi.status = 0;
8812bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park            }
8822bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park
8839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Got  " + fi.toString() + " for " + idx);
8849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
8859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mForwardingReadResults[idx] = fi;
8869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
8879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        // Check if we got all the results already
8889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        boolean done = true;
8899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        for (int i = 0; i < mForwardingReadResults.length; i++) {
8909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (mForwardingReadResults[i] == null) {
8919440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                done = false;
8929440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
8939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
8949440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
8959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (done) {
8969440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Done receiving fwd info");
897b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            dismissDialogSafely(VOICEMAIL_FWD_READING_DIALOG);
898f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            if (mReadingSettingsForDefaultProvider) {
899f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                maybeSaveSettingsForVoicemailProvider(DEFAULT_VM_PROVIDER_KEY,
900f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                        new VoiceMailProviderSettings(this.mOldVmNumber,
901f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                mForwardingReadResults));
902f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                mReadingSettingsForDefaultProvider = false;
903f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            }
9049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            saveVoiceMailAndForwardingNumberStage2();
9059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
9069440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) Log.d(LOG_TAG, "Not done receiving fwd info");
9079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
9089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
9099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
910f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    private CallForwardInfo infoForReason(CallForwardInfo[] infos, int reason) {
911f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        CallForwardInfo result = null;
912f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        if (null != infos) {
913f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            for (CallForwardInfo info : infos) {
914f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                if (info.reason == reason) {
915f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    result = info;
916f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    break;
917f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                }
918f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            }
919f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        }
920f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        return result;
921f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    }
922f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King
923f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    private boolean isUpdateRequired(CallForwardInfo oldInfo,
924f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            CallForwardInfo newInfo) {
925f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        boolean result = true;
926f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        if (0 == newInfo.status) {
927f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            // If we're disabling a type of forwarding, and it's already
928f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            // disabled for the account, don't make any change
929f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            if (oldInfo != null && oldInfo.status == 0) {
930f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                result = false;
931f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            }
932f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        }
933f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        return result;
934f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    }
935f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King
936f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    private void resetForwardingChangeState() {
937f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        mForwardingChangeResults = new HashMap<Integer, AsyncResult>();
938f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        mExpectedChangeResultReasons = new HashSet<Integer>();
939f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King    }
940f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King
9419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Called after we are done saving the previous forwarding settings if
9429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // we needed.
9439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void saveVoiceMailAndForwardingNumberStage2() {
9449440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mForwardingChangeResults = null;
9459440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mVoicemailChangeResult = null;
9469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mNewFwdSettings != FWD_SETTINGS_DONT_TOUCH) {
947f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            resetForwardingChangeState();
9489440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < mNewFwdSettings.length; i++) {
9499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                CallForwardInfo fi = mNewFwdSettings[i];
9509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
951f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                final boolean doUpdate = isUpdateRequired(infoForReason(
952f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            mForwardingReadResults, fi.reason), fi);
953f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King
954f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                if (doUpdate) {
955f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    if (DBG) log("Setting fwd #: " + i + ": " + fi.toString());
956f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    mExpectedChangeResultReasons.add(i);
957f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King
958f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    mPhone.setCallForwardingOption(
959f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            fi.status == 1 ?
960f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                    CommandsInterface.CF_ACTION_REGISTRATION :
961f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                    CommandsInterface.CF_ACTION_DISABLE,
962f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            fi.reason,
963f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            fi.number,
964f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            fi.timeSeconds,
965f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            mSetOptionComplete.obtainMessage(
966f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                    EVENT_FORWARDING_CHANGED, fi.reason, 0));
967f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                }
9689440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky             }
969b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King             showDialogIfForeground(VOICEMAIL_FWD_SAVING_DIALOG);
9709440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
9719440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Not touching fwd #");
972bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            setVMNumberWithCarrier();
9739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
974bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
975bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
976bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    void setVMNumberWithCarrier() {
9779440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("save voicemail #: " + mNewVMNumber);
978b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mPhone.setVoiceMailNumber(
979b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mPhone.getVoiceMailAlphaTag().toString(),
9809440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                mNewVMNumber,
981b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                Message.obtain(mSetOptionComplete, EVENT_VOICEMAIL_CHANGED));
982b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
983b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
9849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
985b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Callback to handle option update completions
986b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
9872bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park    private final Handler mSetOptionComplete = new Handler() {
988b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        @Override
989b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        public void handleMessage(Message msg) {
9909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            AsyncResult result = (AsyncResult) msg.obj;
9914e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky            boolean done = false;
992b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            switch (msg.what) {
993b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case EVENT_VOICEMAIL_CHANGED:
9949440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    mVoicemailChangeResult = result;
995bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mVMChangeCompletedSuccesfully = checkVMChangeSuccess() == null;
996bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("VM change complete msg, VM change done = " +
997bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                            String.valueOf(mVMChangeCompletedSuccesfully));
9984e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    done = true;
9999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    break;
10009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                case EVENT_FORWARDING_CHANGED:
1001f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    mForwardingChangeResults.put(msg.arg1, result);
10024e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    if (result.exception != null) {
10034e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        if (DBG) log("Error in setting fwd# " + msg.arg1 + ": " +
10044e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                result.exception.getMessage());
10054e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    } else {
10064e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        if (DBG) log("Success in setting fwd# " + msg.arg1);
10074e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    }
1008bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    final boolean completed = checkForwardingCompleted();
1009bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (completed) {
10104e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        if (checkFwdChangeSuccess() == null) {
10114e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            if (DBG) log("Overall fwd changes completed ok, starting vm change");
10124e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            setVMNumberWithCarrier();
10134e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        } else {
10144e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            if (DBG) log("Overall fwd changes completed, failure");
10154e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            mFwdChangesRequireRollback = false;
1016f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            Iterator<Map.Entry<Integer,AsyncResult>> it =
1017f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                mForwardingChangeResults.entrySet().iterator();
1018f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                            while (it.hasNext()) {
1019f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                Map.Entry<Integer,AsyncResult> entry = it.next();
1020f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                                if (entry.getValue().exception == null) {
10214e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                    // If at least one succeeded we have to revert
10224e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                    if (DBG) log("Rollback will be required");
10234e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                    mFwdChangesRequireRollback =true;
10244e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                    break;
10254e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                }
10264e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            }
10274e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                            done = true;
10284e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        }
1029bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    }
1030b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
1031b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                default:
1032b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // TODO: should never reach this, may want to throw exception
1033b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
10349440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (done) {
10354e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                if (DBG) log("All VM provider related changes done");
10369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (mForwardingChangeResults != null) {
1037b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                    dismissDialogSafely(VOICEMAIL_FWD_SAVING_DIALOG);
10389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
10399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                handleSetVMOrFwdMessage();
10409440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
1041b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
1042b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    };
1043b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1044bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
1045bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * Callback to handle option revert completions
1046bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
10472bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park    private final Handler mRevertOptionComplete = new Handler() {
1048bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        @Override
1049bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        public void handleMessage(Message msg) {
1050bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            AsyncResult result = (AsyncResult) msg.obj;
1051bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            switch (msg.what) {
1052bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                case EVENT_VOICEMAIL_CHANGED:
1053bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    mVoicemailChangeResult = result;
1054bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("VM revert complete msg");
1055bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    break;
1056bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                case EVENT_FORWARDING_CHANGED:
1057f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    mForwardingChangeResults.put(msg.arg1, result);
10584e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    if (result.exception != null) {
10594e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        if (DBG) log("Error in reverting fwd# " + msg.arg1 + ": " +
10604e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                                result.exception.getMessage());
10614e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    } else {
10624e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                        if (DBG) log("Success in reverting fwd# " + msg.arg1);
10634e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                    }
1064bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    if (DBG) log("FWD revert complete msg ");
1065bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    break;
1066bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                default:
1067bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    // TODO: should never reach this, may want to throw exception
1068bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
1069bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            final boolean done =
1070bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                (!mVMChangeCompletedSuccesfully || mVoicemailChangeResult != null) &&
10714e3c60c0f82e3e499a854dc6f10f18ce17c6dbf4Ilia Tulchinsky                (!mFwdChangesRequireRollback || checkForwardingCompleted());
1072bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (done) {
1073bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                if (DBG) log("All VM reverts done");
10742bff2d1ba5f915d4309d4ae851c3e777f51465b4Tim Park                dismissDialogSafely(VOICEMAIL_REVERTING_DIALOG);
1075bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                onRevertDone();
1076bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
1077bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
1078bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    };
1079bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
1080bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
1081bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * @return true if forwarding change has completed
1082bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
1083bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    private boolean checkForwardingCompleted() {
1084f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        boolean result;
1085bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (mForwardingChangeResults == null) {
1086f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            result = true;
1087f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        } else {
1088f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            // return true iff there is a change result for every reason for
1089f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            // which we expected a result
1090f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            result = true;
1091f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            for (Integer reason : mExpectedChangeResultReasons) {
1092f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                if (mForwardingChangeResults.get(reason) == null) {
1093f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    result = false;
1094f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    break;
1095f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                }
1096bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
1097bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
1098f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        return result;
1099bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
1100bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
1101bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     * @return error string or null if successful
1102bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
1103bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    private String checkFwdChangeSuccess() {
1104f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        String result = null;
1105f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        Iterator<Map.Entry<Integer,AsyncResult>> it =
1106f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            mForwardingChangeResults.entrySet().iterator();
1107f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        while (it.hasNext()) {
1108f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            Map.Entry<Integer,AsyncResult> entry = it.next();
1109f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            Throwable exception = entry.getValue().exception;
1110f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King            if (exception != null) {
1111f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                result = exception.getMessage();
1112f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                if (result == null) {
1113f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                    result = "";
1114bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                }
1115f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King                break;
1116bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
1117bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
1118f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King        return result;
1119bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
1120bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
1121bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    /**
1122f5cf5d465914cb9aa9158baf5ecc855adf1dde5eVirgil King     * @return error string or null if successful
1123bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky     */
1124bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    private String checkVMChangeSuccess() {
1125bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (mVoicemailChangeResult.exception != null) {
1126bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            final String msg = mVoicemailChangeResult.exception.getMessage();
1127bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (msg == null) {
1128bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                return "";
1129bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
1130bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            return msg;
1131bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        }
1132bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        return null;
1133bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky    }
1134bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky
11359440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void handleSetVMOrFwdMessage() {
1136b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (DBG) {
1137b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            log("handleSetVMMessage: set VM request complete");
1138b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
11399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        boolean success = true;
11409440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        boolean fwdFailure = false;
11419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        String exceptionMessage = "";
11429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mForwardingChangeResults != null) {
1143bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            exceptionMessage = checkFwdChangeSuccess();
1144bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (exceptionMessage != null) {
1145bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                success = false;
1146bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                fwdFailure = true;
11479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
11489440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
1149bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        if (success) {
1150bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            exceptionMessage = checkVMChangeSuccess();
1151bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            if (exceptionMessage != null) {
1152bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                success = false;
1153bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            }
11549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
11559440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (success) {
1156b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("change VM success!");
11578e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky            handleVMAndFwdSetSuccess(MSG_VM_OK);
1158bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            updateVoiceNumberField();
1159b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        } else {
11609440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (fwdFailure) {
11619440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                log("change FW failed: " + exceptionMessage);
11628e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky                handleVMOrFwdSetError(MSG_FW_SET_EXCEPTION);
11639440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            } else {
11649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                log("change VM failed: " + exceptionMessage);
11658e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky                handleVMOrFwdSetError(MSG_VM_EXCEPTION);
11669440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
1167b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
1168b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1169b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
11708e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    private void handleVMOrFwdSetError(int msgId) {
11718e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        if (mChangingVMorFwdDueToProviderChange) {
1172bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            mVMOrFwdSetError = msgId;
1173bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            mChangingVMorFwdDueToProviderChange = false;
11748e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky            switchToPreviousVoicemailProvider();
1175bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky            return;
11768e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        }
11778e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        mChangingVMorFwdDueToProviderChange = false;
11788e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        showVMDialog(msgId);
1179bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        updateVoiceNumberField();
11808e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    }
11818e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky
11828e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    private void handleVMAndFwdSetSuccess(int msgId) {
11838e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        mChangingVMorFwdDueToProviderChange = false;
11848e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky        showVMDialog(msgId);
11858e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky    }
11868e31f011098fe32a383f4486d80d579e170de848Ilia Tulchinsky
1187b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
1188b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Methods used to sync UI state with that of the network
1189b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
1190b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // update the voicemail number from what we've recorded on the sim.
1191b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private void updateVoiceNumberField() {
11924ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        if (mSubMenuVoicemailSettings == null) {
11934ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            return;
11944ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        }
1195404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1196b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mOldVmNumber = mPhone.getVoiceMailNumber();
1197b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (mOldVmNumber == null) {
1198b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            mOldVmNumber = "";
1199b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
1200b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mSubMenuVoicemailSettings.setPhoneNumber(mOldVmNumber);
1201365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final String summary = (mOldVmNumber.length() > 0) ? mOldVmNumber :
1202365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            getString(R.string.voicemail_number_not_set);
1203365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mSubMenuVoicemailSettings.setSummary(summary);
1204b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1205b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1206b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
1207b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Helper Methods for Activity class.
1208b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King     * The initial query commands are split into two pieces now
1209b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * for individual expansion.  This combined with the ability
1210b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * to cancel queries allows for a much better user experience,
1211b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * and also ensures that the user only waits to update the
1212b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * data that is relevant.
1213b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
1214b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1215b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    @Override
1216b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    protected void onPrepareDialog(int id, Dialog dialog) {
1217b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        super.onPrepareDialog(id, dialog);
1218b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        mCurrentDialogId = id;
1219b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King    }
1220b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King
1221b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // dialog creation method, called by showDialog()
1222b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
1223b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    protected Dialog onCreateDialog(int id) {
1224cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if ((id == VM_RESPONSE_ERROR) || (id == VM_NOCHANGE_ERROR) ||
12259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            (id == FW_SET_RESPONSE_ERROR) || (id == FW_GET_RESPONSE_ERROR) ||
1226cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                (id == VOICEMAIL_DIALOG_CONFIRM)) {
1227b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1228b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            AlertDialog.Builder b = new AlertDialog.Builder(this);
1229b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1230b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            int msgId;
1231b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            int titleId = R.string.error_updating_title;
1232b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            switch (id) {
1233b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case VOICEMAIL_DIALOG_CONFIRM:
1234b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.vm_changed;
1235b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    titleId = R.string.voicemail;
1236b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 2
1237b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setNegativeButton(R.string.close_dialog, this);
1238b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
1239b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case VM_NOCHANGE_ERROR:
1240b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // even though this is technically an error,
1241b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // keep the title friendly.
1242b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.no_change;
1243b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    titleId = R.string.voicemail;
1244b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 2
1245b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setNegativeButton(R.string.close_dialog, this);
1246b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
1247b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case VM_RESPONSE_ERROR:
1248b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.vm_change_failed;
1249b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 1
1250b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setPositiveButton(R.string.close_dialog, this);
1251b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
12529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                case FW_SET_RESPONSE_ERROR:
12539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    msgId = R.string.fw_change_failed;
12549440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    // Set Button 1
12559440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    b.setPositiveButton(R.string.close_dialog, this);
12569440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    break;
12579440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                case FW_GET_RESPONSE_ERROR:
12589440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    msgId = R.string.fw_get_in_vm_failed;
12599440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    b.setPositiveButton(R.string.alert_dialog_yes, this);
12609440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    b.setNegativeButton(R.string.alert_dialog_no, this);
12619440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    break;
1262b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                default:
1263b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.exception_error;
1264b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 3, tells the activity that the error is
1265b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // not recoverable on dialog exit.
1266b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setNeutralButton(R.string.close_dialog, this);
1267b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
1268b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
1269b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1270b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            b.setTitle(getText(titleId));
12719440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            String message = getText(msgId).toString();
12729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            b.setMessage(message);
1273b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            b.setCancelable(false);
1274b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            AlertDialog dialog = b.create();
1275b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1276b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // make the dialog more obvious by bluring the background.
1277b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
1278b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1279b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return dialog;
1280bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky        } else if (id == VOICEMAIL_FWD_SAVING_DIALOG || id == VOICEMAIL_FWD_READING_DIALOG ||
1281bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                id == VOICEMAIL_REVERTING_DIALOG) {
12829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            ProgressDialog dialog = new ProgressDialog(this);
12839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dialog.setTitle(getText(R.string.updating_title));
12849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dialog.setIndeterminate(true);
12859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dialog.setCancelable(false);
12869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            dialog.setMessage(getText(
1287bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    id == VOICEMAIL_FWD_SAVING_DIALOG ? R.string.updating_settings :
1288bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    (id == VOICEMAIL_REVERTING_DIALOG ? R.string.reverting_settings :
1289bb5f36f06f18e4ae1bb04609cd3d91c38c77f1ffIlia Tulchinsky                    R.string.reading_settings)));
12909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return dialog;
1291b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
1292b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
12939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
1294b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return null;
1295b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1296b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1297b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // This is a method implemented for DialogInterface.OnClickListener.
1298b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Used with the error dialog to close the app, voicemail dialog to just dismiss.
12999440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // Close button is mapped to BUTTON_POSITIVE for the errors that close the activity,
13009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    // while those that are mapped to BUTTON_NEUTRAL only move the preference focus.
1301b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public void onClick(DialogInterface dialog, int which) {
1302b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        dialog.dismiss();
1303b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        switch (which){
13049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case DialogInterface.BUTTON_NEUTRAL:
13059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Neutral button");
1306b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
13079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case DialogInterface.BUTTON_NEGATIVE:
13089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Negative button");
13099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (mCurrentDialogId == FW_GET_RESPONSE_ERROR) {
13109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    // We failed to get current forwarding settings and the user
131130225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky                    // does not wish to continue.
13129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    switchToPreviousVoicemailProvider();
13139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
13149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
13159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case DialogInterface.BUTTON_POSITIVE:
13169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Positive button");
13179440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (mCurrentDialogId == FW_GET_RESPONSE_ERROR) {
13189440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    // We failed to get current forwarding settings but the user
13199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    // wishes to continue changing settings to the new vm provider
13209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    saveVoiceMailAndForwardingNumberStage2();
13219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                } else {
13229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    finish();
13239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                }
132430225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky                return;
1325b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            default:
1326b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                // just let the dialog close and go back to the input
1327b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
132830225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        // In all dialogs, all buttons except BUTTON_POSITIVE lead to the end of user interaction
132930225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        // with settings UI. If we were called to explicitly configure voice mail then
133030225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        // we finish the settings activity here to come back to whatever the user was doing.
133130225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL)) {
133230225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky            finish();
133330225c1135aaf518fc61b83f434af4bf38469437Ilia Tulchinsky        }
1334b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1335b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1336b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // set the app state with optional status.
1337cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private void showVMDialog(int msgStatus) {
1338cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        switch (msgStatus) {
1339b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            // It's a bit worrisome to punt in the error cases here when we're
1340b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King            // not in the foreground; maybe toast instead?
1341cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_VM_EXCEPTION:
1342b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                showDialogIfForeground(VM_RESPONSE_ERROR);
1343b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
13449440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case MSG_FW_SET_EXCEPTION:
1345b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                showDialogIfForeground(FW_SET_RESPONSE_ERROR);
13469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
13479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            case MSG_FW_GET_EXCEPTION:
1348b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                showDialogIfForeground(FW_GET_RESPONSE_ERROR);
13499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                break;
1350cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_VM_NOCHANGE:
1351b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                showDialogIfForeground(VM_NOCHANGE_ERROR);
1352b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
1353cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_VM_OK:
1354b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King                showDialogIfForeground(VOICEMAIL_DIALOG_CONFIRM);
1355b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
1356cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_OK:
1357cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            default:
1358cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                // This should never happen.
1359a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
1360a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville    }
1361404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1362b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
1363b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Activity class methods
1364b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
1365b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1366b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
1367b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    protected void onCreate(Bundle icicle) {
1368b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        super.onCreate(icicle);
13699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("Creating activity");
1370546a00dd3bb35abfcd44c696cd810073a084b43cWink Saville        mPhone = PhoneApp.getPhone();
1371b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1372cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        addPreferencesFromResource(R.xml.call_feature_setting);
1373cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1374cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
1375cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1376b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // get buttons
1377b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        PreferenceScreen prefSet = getPreferenceScreen();
1378365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mSubMenuVoicemailSettings = (EditPhoneNumberPreference)findPreference(BUTTON_VOICEMAIL_KEY);
13794ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        if (mSubMenuVoicemailSettings != null) {
13804ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            mSubMenuVoicemailSettings.setParentActivity(this, VOICEMAIL_PREF_ID, this);
13814ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            mSubMenuVoicemailSettings.setDialogOnClosedListener(this);
13824ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            mSubMenuVoicemailSettings.setDialogTitle(R.string.voicemail_settings_number_label);
13834ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        }
1384404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1385cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonDTMF = (ListPreference) findPreference(BUTTON_DTMF_KEY);
1386cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonAutoRetry = (CheckBoxPreference) findPreference(BUTTON_RETRY_KEY);
1387cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonHAC = (CheckBoxPreference) findPreference(BUTTON_HAC_KEY);
1388cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonTTY = (ListPreference) findPreference(BUTTON_TTY_KEY);
1389365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVoicemailProviders = (ListPreference) findPreference(BUTTON_VOICEMAIL_PROVIDER_KEY);
1390b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky        if (mVoicemailProviders != null) {
1391b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            mVoicemailProviders.setOnPreferenceChangeListener(this);
1392b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            mVoicemailSettings = (PreferenceScreen)findPreference(BUTTON_VOICEMAIL_SETTING_KEY);
1393b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1394b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            initVoiceMailProviders();
1395b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky        }
1396605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang
1397605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang        if (mButtonDTMF != null) {
1398605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            if (getResources().getBoolean(R.bool.dtmf_type_enabled)) {
1399605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                mButtonDTMF.setOnPreferenceChangeListener(this);
1400605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            } else {
1401605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                prefSet.removePreference(mButtonDTMF);
1402605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                mButtonDTMF = null;
1403605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            }
14045b269ecd49279c3c4f85f55fa4fd4baa88e3a54bjsh        }
1405b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1406605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang        if (mButtonAutoRetry != null) {
1407605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            if (getResources().getBoolean(R.bool.auto_retry_enabled)) {
1408605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                mButtonAutoRetry.setOnPreferenceChangeListener(this);
1409605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            } else {
1410605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                prefSet.removePreference(mButtonAutoRetry);
1411605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                mButtonAutoRetry = null;
1412605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            }
1413cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1414b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1415605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang        if (mButtonHAC != null) {
1416605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            if (getResources().getBoolean(R.bool.hac_enabled)) {
1417605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang
1418605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                mButtonHAC.setOnPreferenceChangeListener(this);
1419605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            } else {
1420605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                prefSet.removePreference(mButtonHAC);
1421605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                mButtonHAC = null;
1422605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            }
1423cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1424b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1425605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang        if (mButtonTTY != null) {
1426605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            if (getResources().getBoolean(R.bool.tty_enabled)) {
1427605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                mButtonTTY.setOnPreferenceChangeListener(this);
1428605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            } else {
1429605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                prefSet.removePreference(mButtonTTY);
1430605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang                mButtonTTY = null;
1431605c4fd2e24b487dfb265b34eafc1ab73dfae786John Wang            }
1432cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1433cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1434cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (!getResources().getBoolean(R.bool.world_phone)) {
143572f5bad415f3f723cf11b22effe76908ed222826John Wang            Preference options = prefSet.findPreference(BUTTON_CDMA_OPTIONS);
143672f5bad415f3f723cf11b22effe76908ed222826John Wang            if (options != null)
143772f5bad415f3f723cf11b22effe76908ed222826John Wang                prefSet.removePreference(options);
143872f5bad415f3f723cf11b22effe76908ed222826John Wang            options = prefSet.findPreference(BUTTON_GSM_UMTS_OPTIONS);
143972f5bad415f3f723cf11b22effe76908ed222826John Wang            if (options != null)
144072f5bad415f3f723cf11b22effe76908ed222826John Wang                prefSet.removePreference(options);
1441cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
144279b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink            int phoneType = mPhone.getPhoneType();
144379b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink            if (phoneType == Phone.PHONE_TYPE_CDMA) {
144472f5bad415f3f723cf11b22effe76908ed222826John Wang                Preference fdnButton = prefSet.findPreference(BUTTON_FDN_KEY);
144572f5bad415f3f723cf11b22effe76908ed222826John Wang                if (fdnButton != null)
144672f5bad415f3f723cf11b22effe76908ed222826John Wang                    prefSet.removePreference(fdnButton);
1447d7af9733265c48d659b0584a0bc80fc457ad6b32sy                if (!getResources().getBoolean(R.bool.config_voice_privacy_disable)) {
1448d7af9733265c48d659b0584a0bc80fc457ad6b32sy                    addPreferencesFromResource(R.xml.cdma_call_privacy);
1449d7af9733265c48d659b0584a0bc80fc457ad6b32sy                }
145079b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink            } else if (phoneType == Phone.PHONE_TYPE_GSM) {
1451cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                addPreferencesFromResource(R.xml.gsm_umts_call_options);
145279b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink            } else {
145379b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink                throw new IllegalStateException("Unexpected phone type: " + phoneType);
1454b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
1455b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
1456b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1457cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        // create intent to bring up contact list
1458cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mContactListIntent = new Intent(Intent.ACTION_GET_CONTENT);
1459cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mContactListIntent.setType(android.provider.Contacts.Phones.CONTENT_ITEM_TYPE);
1460cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1461cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        // check the intent that started this activity and pop up the voicemail
1462cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        // dialog if we've been asked to.
14636da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // If we have at least one non default VM provider registered then bring up
14646da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // the selection for the VM provider, otherwise bring up a VM number dialog.
14656da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // We only bring up the dialog the first time we are called (not after orientation change)
14666da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        if (icicle == null) {
1467b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL) &&
1468b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky                    mVoicemailProviders != null) {
14696da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                if (mVMProvidersData.size() > 1) {
14706da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                    simulatePreferenceClick(mVoicemailProviders);
14716da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                } else {
14729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    onPreferenceChange(mVoicemailProviders, DEFAULT_VM_PROVIDER_KEY);
14739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                    mVoicemailProviders.setValue(DEFAULT_VM_PROVIDER_KEY);
14746da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                }
14756da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            }
1476cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1477b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        updateVoiceNumberField();
14789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mVMProviderSettingsForced = false;
1479122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang        createSipCallSettings();
14802c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa
14812c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        ActionBar actionBar = getActionBar();
14822c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        if (actionBar != null) {
14832c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa            // android.R.id.home will be triggered in onOptionsItemSelected()
14842c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa            actionBar.setDisplayHomeAsUpEnabled(true);
14852c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        }
1486122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang    }
1487bb5fb3fa71c9b9ab678f5cf5f2a9cc69ceea3445Chung-yih Wang
1488122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang    private void createSipCallSettings() {
1489bb5fb3fa71c9b9ab678f5cf5f2a9cc69ceea3445Chung-yih Wang        // Add Internet call settings.
149058a62f78a11fdb9c772a8544ad302603fd58bdebHung-ying Tyan        if (PhoneUtils.isVoipSupported()) {
149185faf0d2e1a764a050f038f61ab5d5524ce2791dHung-ying Tyan            mSipManager = SipManager.newInstance(this);
14923e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang            mSipSharedPreferences = new SipSharedPreferences(this);
14933e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang            addPreferencesFromResource(R.xml.sip_settings_category);
1494ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan            mButtonSipCallOptions = getSipCallOptionPreference();
14953e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang            mButtonSipCallOptions.setOnPreferenceChangeListener(this);
1496998050730b423a5888a561e9f8230d499515d864Hung-ying Tyan            mButtonSipCallOptions.setValueIndex(
1497998050730b423a5888a561e9f8230d499515d864Hung-ying Tyan                    mButtonSipCallOptions.findIndexOfValue(
1498998050730b423a5888a561e9f8230d499515d864Hung-ying Tyan                            mSipSharedPreferences.getSipCallOption()));
14993e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang            mButtonSipCallOptions.setSummary(mButtonSipCallOptions.getEntry());
15003e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang        }
1501b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1502b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1503ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan    // Gets the call options for SIP depending on whether SIP is allowed only
1504ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan    // on Wi-Fi only; also make the other options preference invisible.
1505ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan    private ListPreference getSipCallOptionPreference() {
1506ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan        ListPreference wifiAnd3G = (ListPreference)
1507ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan                findPreference(BUTTON_SIP_CALL_OPTIONS);
1508ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan        ListPreference wifiOnly = (ListPreference)
1509ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan                findPreference(BUTTON_SIP_CALL_OPTIONS_WIFI_ONLY);
1510ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan        PreferenceGroup sipSettings = (PreferenceGroup)
1511ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan                findPreference(SIP_SETTINGS_CATEGORY_KEY);
1512ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan        if (SipManager.isSipWifiOnly(this)) {
1513ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan            sipSettings.removePreference(wifiAnd3G);
1514ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan            return wifiOnly;
1515ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan        } else {
1516ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan            sipSettings.removePreference(wifiOnly);
1517ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan            return wifiAnd3G;
1518ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan        }
1519ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan    }
1520ee37faa89e12608ae4bc64d34a33ae58ac7e8f19Hung-ying Tyan
1521b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
1522cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    protected void onResume() {
1523cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        super.onResume();
1524b924a7bfc71f3f04e2fc19535d14e494522a2f9aVirgil King        mForeground = true;
1525b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1526122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang        if (isAirplaneModeOn()) {
1527122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang            Preference sipSettings = findPreference(SIP_SETTINGS_CATEGORY_KEY);
1528122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang            PreferenceScreen screen = getPreferenceScreen();
1529122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang            int count = screen.getPreferenceCount();
1530122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang            for (int i = 0 ; i < count ; ++i) {
1531122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang                Preference pref = screen.getPreference(i);
1532122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang                if (pref != sipSettings) pref.setEnabled(false);
1533122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang            }
1534122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang            return;
1535122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang        }
1536122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang
1537cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonDTMF != null) {
1538cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int dtmf = Settings.System.getInt(getContentResolver(),
1539cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, DTMF_TONE_TYPE_NORMAL);
1540cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonDTMF.setValueIndex(dtmf);
1541cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1542d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
1543cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonAutoRetry != null) {
1544cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int autoretry = Settings.System.getInt(getContentResolver(),
1545cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    Settings.System.CALL_AUTO_RETRY, 0);
1546cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonAutoRetry.setChecked(autoretry != 0);
1547d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville        }
15483800ac871d6548790ac6119bb68b9be0640af261David Krause
1549cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonHAC != null) {
1550cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int hac = Settings.System.getInt(getContentResolver(), Settings.System.HEARING_AID, 0);
1551cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonHAC.setChecked(hac != 0);
1552cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1553d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
1554cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonTTY != null) {
1555dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            int settingsTtyMode = Settings.Secure.getInt(getContentResolver(),
1556dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent                    Settings.Secure.PREFERRED_TTY_MODE,
1557dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent                    Phone.TTY_MODE_OFF);
1558dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            mButtonTTY.setValue(Integer.toString(settingsTtyMode));
1559dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            updatePreferredTtyModeSummary(settingsTtyMode);
1560cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
1561b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1562b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
1563122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang    private boolean isAirplaneModeOn() {
1564122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang        return Settings.System.getInt(getContentResolver(),
1565122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang                Settings.System.AIRPLANE_MODE_ON, 0) != 0;
1566122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang    }
1567122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang
1568cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private void handleTTYChange(Preference preference, Object objValue) {
1569404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        int buttonTtyMode;
1570404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        buttonTtyMode = Integer.valueOf((String) objValue).intValue();
1571404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        int settingsTtyMode = android.provider.Settings.Secure.getInt(
1572cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                getContentResolver(),
1573404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                android.provider.Settings.Secure.PREFERRED_TTY_MODE, preferredTtyMode);
1574cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (DBG) log("handleTTYChange: requesting set TTY mode enable (TTY) to" +
1575404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                Integer.toString(buttonTtyMode));
1576404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
1577404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        if (buttonTtyMode != settingsTtyMode) {
1578404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            switch(buttonTtyMode) {
1579404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_OFF:
1580404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_FULL:
1581404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_HCO:
1582404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_VCO:
1583dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent                android.provider.Settings.Secure.putInt(getContentResolver(),
1584dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent                        android.provider.Settings.Secure.PREFERRED_TTY_MODE, buttonTtyMode);
1585404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                break;
1586404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            default:
1587dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent                buttonTtyMode = Phone.TTY_MODE_OFF;
1588404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            }
1589a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1590dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            mButtonTTY.setValue(Integer.toString(buttonTtyMode));
1591dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            updatePreferredTtyModeSummary(buttonTtyMode);
1592dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            Intent ttyModeChanged = new Intent(TtyIntent.TTY_PREFERRED_MODE_CHANGE_ACTION);
1593dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            ttyModeChanged.putExtra(TtyIntent.TTY_PREFFERED_MODE, buttonTtyMode);
1594dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            sendBroadcast(ttyModeChanged);
1595a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
1596dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent    }
1597a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
1598bb5fb3fa71c9b9ab678f5cf5f2a9cc69ceea3445Chung-yih Wang    private void handleSipCallOptionsChange(Object objValue) {
1599998050730b423a5888a561e9f8230d499515d864Hung-ying Tyan        String option = objValue.toString();
1600998050730b423a5888a561e9f8230d499515d864Hung-ying Tyan        mSipSharedPreferences.setSipCallOption(option);
1601bb5fb3fa71c9b9ab678f5cf5f2a9cc69ceea3445Chung-yih Wang        mButtonSipCallOptions.setValueIndex(
1602998050730b423a5888a561e9f8230d499515d864Hung-ying Tyan                mButtonSipCallOptions.findIndexOfValue(option));
1603bb5fb3fa71c9b9ab678f5cf5f2a9cc69ceea3445Chung-yih Wang        mButtonSipCallOptions.setSummary(mButtonSipCallOptions.getEntry());
1604bb5fb3fa71c9b9ab678f5cf5f2a9cc69ceea3445Chung-yih Wang    }
1605bb5fb3fa71c9b9ab678f5cf5f2a9cc69ceea3445Chung-yih Wang
1606dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent    private void updatePreferredTtyModeSummary(int TtyMode) {
1607dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent        String [] txts = getResources().getStringArray(R.array.tty_mode_entries);
1608dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent        switch(TtyMode) {
1609dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            case Phone.TTY_MODE_OFF:
1610dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            case Phone.TTY_MODE_HCO:
1611dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            case Phone.TTY_MODE_VCO:
1612dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            case Phone.TTY_MODE_FULL:
1613dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent                mButtonTTY.setSummary(txts[TtyMode]);
1614dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent                break;
1615dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent            default:
1616cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                mButtonTTY.setEnabled(false);
1617dc4b8d2f09ca215cc4a29513e56cd254d0c6d5f8Eric Laurent                mButtonTTY.setSummary(txts[Phone.TTY_MODE_OFF]);
1618a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
16193800ac871d6548790ac6119bb68b9be0640af261David Krause    }
16203800ac871d6548790ac6119bb68b9be0640af261David Krause
1621b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static void log(String msg) {
1622b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        Log.d(LOG_TAG, msg);
1623b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
1624365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1625365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    /**
1626365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Updates the look of the VM preference widgets based on current VM provider settings.
1627365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Note that the provider name is loaded form the found activity via loadLabel in
1628365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * initVoiceMailProviders in order for it to be localizable.
1629365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     */
1630365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private void updateVMPreferenceWidgets(String currentProviderSetting) {
1631365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final String key = currentProviderSetting;
1632365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final VoiceMailProvider provider = mVMProvidersData.get(key);
1633365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1634365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        /* This is the case when we are coming up on a freshly wiped phone and there is no
1635365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky         persisted value for the list preference mVoicemailProviders.
1636365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky         In this case we want to show the UI asking the user to select a voicemail provider as
1637365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky         opposed to silently falling back to default one. */
1638365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        if (provider == null) {
1639365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailProviders.setSummary(getString(R.string.sum_voicemail_choose_provider));
1640365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setSummary("");
1641365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setEnabled(false);
1642365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setIntent(null);
1643365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        } else {
1644365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            final String providerName = provider.name;
1645365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailProviders.setSummary(providerName);
1646365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setSummary(getApplicationContext().getString(
1647365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    R.string.voicemail_settings_for, providerName));
1648365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setEnabled(true);
1649365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setIntent(provider.intent);
1650365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
1651365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
1652365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1653365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    /**
1654365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Enumerates existing VM providers and puts their data into the list and populates
1655365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * the preference list objects with their names.
16566da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * In case we are called with ACTION_ADD_VOICEMAIL intent the intent may have
1657e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     * an extra string called IGNORE_PROVIDER_EXTRA with "package.activityName" of the provider
16586da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * which should be hidden when we bring up the list of possible VM providers to choose.
16596da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * This allows a provider which is being disabled (e.g. GV user logging out) to force the user
16606da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * to pick some other provider.
1661365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     */
1662365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private void initVoiceMailProviders() {
16639440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mPerProviderSavedVMNumbers =
16649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            this.getApplicationContext().getSharedPreferences(
16659440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                VM_NUMBERS_SHARED_PREFERENCES_NAME, MODE_PRIVATE);
16669440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
16676da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        String providerToIgnore = null;
16686da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL)) {
16699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("ACTION_ADD_VOICEMAIL");
16709440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (getIntent().hasExtra(IGNORE_PROVIDER_EXTRA)) {
16719440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                providerToIgnore = getIntent().getStringExtra(IGNORE_PROVIDER_EXTRA);
16729440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
16739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("providerToIgnore=" + providerToIgnore);
16747c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            if (providerToIgnore != null) {
16757c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky                deleteSettingsForVoicemailProvider(providerToIgnore);
16767c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky            }
16776da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        }
16786da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
1679365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVMProvidersData.clear();
1680365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1681365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        // Stick the default element which is always there
1682365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final String myCarrier = getString(R.string.voicemail_default);
16839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mVMProvidersData.put(DEFAULT_VM_PROVIDER_KEY, new VoiceMailProvider(myCarrier, null));
1684365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1685365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        // Enumerate providers
1686365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        PackageManager pm = getPackageManager();
1687365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        Intent intent = new Intent();
1688365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        intent.setAction(ACTION_CONFIGURE_VOICEMAIL);
1689365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
16906da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        int len = resolveInfos.size() + 1; // +1 for the default choice we will insert.
1691365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
16926da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // Go through the list of discovered providers populating the data map
16936da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // skip the provider we were instructed to ignore if there was one
1694365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        for (int i = 0; i < resolveInfos.size(); i++) {
1695365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            final ResolveInfo ri= resolveInfos.get(i);
16966da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            final ActivityInfo currentActivityInfo = ri.activityInfo;
16976da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            final String key = makeKeyForActivity(currentActivityInfo);
16989440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Loading " + key);
16996da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            if (key.equals(providerToIgnore)) {
17009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                if (DBG) log("Ignoring " + key);
17016da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                len--;
17026da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                continue;
17036da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            }
1704365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            final String nameForDisplay = ri.loadLabel(pm).toString();
1705365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            Intent providerIntent = new Intent();
1706365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            providerIntent.setAction(ACTION_CONFIGURE_VOICEMAIL);
1707365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            providerIntent.setClassName(currentActivityInfo.packageName,
1708365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    currentActivityInfo.name);
1709365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVMProvidersData.put(
1710365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    key,
1711365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    new VoiceMailProvider(nameForDisplay, providerIntent));
17126da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
17136da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        }
17146da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
17156da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // Now we know which providers to display - create entries and values array for
17166da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // the list preference
17176da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        String [] entries = new String [len];
17186da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        String [] values = new String [len];
17196da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        entries[0] = myCarrier;
17209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        values[0] = DEFAULT_VM_PROVIDER_KEY;
17216da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        int entryIdx = 1;
17226da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        for (int i = 0; i < resolveInfos.size(); i++) {
17236da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            final String key = makeKeyForActivity(resolveInfos.get(i).activityInfo);
17246da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            if (!mVMProvidersData.containsKey(key)) {
17256da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                continue;
17266da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            }
17276da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            entries[entryIdx] = mVMProvidersData.get(key).name;
17286da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            values[entryIdx] = key;
17296da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            entryIdx++;
1730365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
1731365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
1732365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVoicemailProviders.setEntries(entries);
1733365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVoicemailProviders.setEntryValues(values);
1734365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
17357c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky        mPreviousVMProviderKey = getCurrentVoicemailProviderKey();
17369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        updateVMPreferenceWidgets(mPreviousVMProviderKey);
1737365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
17386da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
17396da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    private String makeKeyForActivity(ActivityInfo ai) {
17409440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        return ai.name;
17416da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    }
17426da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky
17436da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    /**
17446da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * Simulates user clicking on a passed preference.
17456da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * Usually needed when the preference is a dialog preference and we want to invoke
17466da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * a dialog for this preference programmatically.
17476da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     * TODO(iliat): figure out if there is a cleaner way to cause preference dlg to come up
17486da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky     */
17496da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    private void simulatePreferenceClick(Preference preference) {
17506da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // Go through settings until we find our setting
17516da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        // and then simulate a click on it to bring up the dialog
17526da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        final ListAdapter adapter = getPreferenceScreen().getRootAdapter();
17536da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        for (int idx = 0; idx < adapter.getCount(); idx++) {
17546da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            if (adapter.getItem(idx) == preference) {
17556da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                getPreferenceScreen().onItemClick(this.getListView(),
17566da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                        null, idx, adapter.getItemId(idx));
17576da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky                break;
17586da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky            }
17596da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky        }
17606da0c032426ecf86a5b56f8a8ddd47bad784c674Ilia Tulchinsky    }
1761e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
1762e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    /**
17639440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Saves new VM provider settings associating them with the currently selected
17649440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * provider if settings are different than the ones already stored for this
1765e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     * provider.
17669440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Later on these will be used when the user switches a provider.
1767e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     */
17689440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void maybeSaveSettingsForVoicemailProvider(String key,
17699440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            VoiceMailProviderSettings newSettings) {
1770b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky        if (mVoicemailProviders == null) {
1771b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky            return;
1772b4b73b57c4047a2863d210c037257024d6452f89Ilia Tulchinsky        }
17739440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        final VoiceMailProviderSettings curSettings = loadSettingsForVoiceMailProvider(key);
17749440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (newSettings.equals(curSettings)) {
17759440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Not saving setting for " + key + " since they have not changed");
1776e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky            return;
1777e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky        }
17789440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("Saving settings for " + key + ": " + newSettings.toString());
17799440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        Editor editor = mPerProviderSavedVMNumbers.edit();
17809440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        editor.putString(key + VM_NUMBER_TAG,newSettings.voicemailNumber);
17819440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        String fwdKey = key + FWD_SETTINGS_TAG;
17829440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CallForwardInfo[] s = newSettings.forwardingSettings;
17839440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (s != FWD_SETTINGS_DONT_TOUCH) {
17849440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            editor.putInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, s.length);
17859440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < s.length; i++) {
17869440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                final String settingKey = fwdKey + FWD_SETTING_TAG + String.valueOf(i);
17879440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                final CallForwardInfo fi = s[i];
17889440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                editor.putInt(settingKey + FWD_SETTING_STATUS, fi.status);
17899440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                editor.putInt(settingKey + FWD_SETTING_REASON, fi.reason);
17909440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                editor.putString(settingKey + FWD_SETTING_NUMBER, fi.number);
17919440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                editor.putInt(settingKey + FWD_SETTING_TIME, fi.timeSeconds);
17929440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
17939440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        } else {
17949440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            editor.putInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
17959440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
17969f994b77f3f22b9a23887a324380d9fd317d4e06Brad Fitzpatrick        editor.apply();
1797e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    }
1798e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky
1799e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    /**
18009440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Returns settings previously stored for the currently selected
1801e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     * voice mail provider. If none is stored returns null.
18029440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * If the user switches to a voice mail provider and we have settings
1803e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     * stored for it we will automatically change the phone's voice mail number
18049440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * and forwarding number to the stored one. Otherwise we will bring up provider's configuration
18059440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * UI.
1806e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky     */
18079440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private VoiceMailProviderSettings loadSettingsForVoiceMailProvider(String key) {
18089440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        final String vmNumberSetting = mPerProviderSavedVMNumbers.getString(key + VM_NUMBER_TAG,
18099440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                null);
18109440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (vmNumberSetting == null) {
18119440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            if (DBG) log("Settings for " + key + " not found");
18129440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return null;
18139440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
18149440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
18159440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        CallForwardInfo[] cfi = FWD_SETTINGS_DONT_TOUCH;
18169440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        String fwdKey = key + FWD_SETTINGS_TAG;
18179440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        final int fwdLen = mPerProviderSavedVMNumbers.getInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
18189440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (fwdLen > 0) {
18199440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            cfi = new CallForwardInfo[fwdLen];
18209440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            for (int i = 0; i < cfi.length; i++) {
18219440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                final String settingKey = fwdKey + FWD_SETTING_TAG + String.valueOf(i);
18229440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i] = new CallForwardInfo();
18239440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].status = mPerProviderSavedVMNumbers.getInt(
18249440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        settingKey + FWD_SETTING_STATUS, 0);
18259440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].reason = mPerProviderSavedVMNumbers.getInt(
18269440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        settingKey + FWD_SETTING_REASON,
18279440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        CommandsInterface.CF_REASON_ALL_CONDITIONAL);
18289440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
18299440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].toa = PhoneNumberUtils.TOA_International;
18309440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].number = mPerProviderSavedVMNumbers.getString(
18319440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        settingKey + FWD_SETTING_NUMBER, "");
18329440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                cfi[i].timeSeconds = mPerProviderSavedVMNumbers.getInt(
18339440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky                        settingKey + FWD_SETTING_TIME, 20);
18349440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            }
18359440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
18369440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
18379440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        VoiceMailProviderSettings settings =  new VoiceMailProviderSettings(vmNumberSetting, cfi);
18389440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("Loaded settings for " + key + ": " + settings.toString());
18399440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        return settings;
18409440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    }
18419440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky
18429440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    /**
18439440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     * Deletes settings for the specified provider.
18449440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky     */
18459440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky    private void deleteSettingsForVoicemailProvider(String key) {
18469440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (DBG) log("Deleting settings for" + key);
18479440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        if (mVoicemailProviders == null) {
18489440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            return;
18499440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        }
18509440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky        mPerProviderSavedVMNumbers.edit()
18519440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            .putString(key + VM_NUMBER_TAG, null)
18529440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            .putInt(key + FWD_SETTINGS_TAG + FWD_SETTINGS_LENGTH_TAG, 0)
18539440c4bbc4601889eb266d65cd94ac7c6b879dbaIlia Tulchinsky            .commit();
1854e1b454c721ebe6bd5c3908413728a691e92d80b9Ilia Tulchinsky    }
18557c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky
18567c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky    private String getCurrentVoicemailProviderKey() {
18577c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky        final String key = mVoicemailProviders.getValue();
18587c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky        return (key != null) ? key : DEFAULT_VM_PROVIDER_KEY;
18597c08e235bfd5109f3eaac2ce2f73c7da27916dacIlia Tulchinsky    }
18602c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa
18612c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa    @Override
18622c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa    public boolean onOptionsItemSelected(MenuItem item) {
18632c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        final int itemId = item.getItemId();
18642c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        if (itemId == android.R.id.home) {  // See ActionBar#setDisplayHomeAsUpEnabled()
18652c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa            Intent intent = new Intent();
18662c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa            intent.setClassName(UP_ACTIVITY_PACKAGE, UP_ACTIVITY_CLASS);
18672c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
18682c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa            startActivity(intent);
18692c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa            finish();
18702c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa            return true;
18712c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        }
18722c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        return super.onOptionsItemSelected(item);
18732c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa    }
18742c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa
18752c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa    /**
18762c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa     * Finish current Activity and go up to the top level Settings ({@link CallFeaturesSetting}).
18772c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa     * This is useful for implementing "HomeAsUp" capability for second-level Settings.
18782c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa     */
18792c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa    public static void goUpToTopLevelSetting(Activity activity) {
18802c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        Intent intent = new Intent(activity, CallFeaturesSetting.class);
18812c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        intent.setAction(Intent.ACTION_MAIN);
18822c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
18832c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        activity.startActivity(intent);
18842c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        activity.finish();
18852c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa    }
1886b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project}
1887