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