CallFeaturesSetting.java revision 365ab88d8d3f80f350bed0fee7c2ee1f52247b2e
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
19cd0189299f484dcbd51400b994daf585923e9e8dDavid Krauseimport com.android.internal.telephony.Phone;
20cd0189299f484dcbd51400b994daf585923e9e8dDavid Krauseimport com.android.internal.telephony.PhoneFactory;
21cd0189299f484dcbd51400b994daf585923e9e8dDavid Krauseimport com.android.internal.telephony.cdma.TtyIntent;
22cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
23b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.app.AlertDialog;
24b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.app.Dialog;
25cd0189299f484dcbd51400b994daf585923e9e8dDavid Krauseimport android.content.Context;
26b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.DialogInterface;
27b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.Intent;
28365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport android.content.pm.ActivityInfo;
29365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport android.content.pm.PackageManager;
30365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport android.content.pm.ResolveInfo;
31b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.database.Cursor;
32cd0189299f484dcbd51400b994daf585923e9e8dDavid Krauseimport android.media.AudioManager;
33b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.AsyncResult;
34b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Bundle;
35b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Handler;
36b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Message;
37b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.CheckBoxPreference;
38b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.ListPreference;
39b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.Preference;
40b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.PreferenceActivity;
41b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.preference.PreferenceScreen;
42a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Savilleimport android.provider.Contacts.PhonesColumns;
43cd0189299f484dcbd51400b994daf585923e9e8dDavid Krauseimport android.provider.Settings;
44b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.text.TextUtils;
45365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
46b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.util.Log;
47b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.WindowManager;
48b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
49365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport java.util.HashMap;
50365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport java.util.List;
51365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinskyimport java.util.Map;
52365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
53365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
54b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectpublic class CallFeaturesSetting extends PreferenceActivity
55b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        implements DialogInterface.OnClickListener,
56b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        Preference.OnPreferenceChangeListener,
57b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        EditPhoneNumberPreference.OnDialogClosedListener,
58b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        EditPhoneNumberPreference.GetDefaultNumberListener{
59b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
60b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // intent action for this activity.
61b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public static final String ACTION_ADD_VOICEMAIL =
62b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        "com.android.phone.CallFeaturesSetting.ADD_VOICEMAIL";
63365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    public static final String ACTION_CONFIGURE_VOICEMAIL =
64365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        "com.android.phone.CallFeaturesSetting.CONFIGURE_VOICEMAIL";
65b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
66b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // debug data
6787258b2b589c3afea4b89b840251012378e0d3b4David Brown    private static final String LOG_TAG = "CallFeaturesSetting";
68cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
69b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
70b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // string contants
71b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final String NUM_PROJECTION[] = {PhonesColumns.NUMBER};
72b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
73b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // String keys for preference lookup
74b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final String BUTTON_VOICEMAIL_KEY = "button_voicemail_key";
75365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private static final String BUTTON_VOICEMAIL_PROVIDER_KEY = "button_voicemail_provider_key";
76365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private static final String BUTTON_VOICEMAIL_SETTING_KEY = "button_voicemail_setting_key";
77b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final String BUTTON_FDN_KEY   = "button_fdn_key";
78b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
79cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_DTMF_KEY   = "button_dtmf_settings";
803800ac871d6548790ac6119bb68b9be0640af261David Krause    private static final String BUTTON_RETRY_KEY  = "button_auto_retry_key";
81cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_TTY_KEY    = "button_tty_mode_key";
82cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_HAC_KEY    = "button_hac_key";
83cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
84cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_GSM_UMTS_OPTIONS = "button_gsm_more_expand_key";
85cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String BUTTON_CDMA_OPTIONS = "button_cdma_more_expand_key";
86a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
87b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private Intent mContactListIntent;
88b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
89b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /** Event for Async voicemail change call */
90b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int EVENT_VOICEMAIL_CHANGED     = 500;
91d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
92a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville    // preferred TTY mode
93cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    // Phone.TTY_MODE_xxx
94cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    static final int preferredTtyMode = Phone.TTY_MODE_OFF;
95b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
96d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville    // Dtmf tone types
97d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville    static final int DTMF_TONE_TYPE_NORMAL = 0;
98d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville    static final int DTMF_TONE_TYPE_LONG   = 1;
99d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
100cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String HAC_KEY = "HACSetting";
101cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String HAC_VAL_ON = "ON";
102cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final String HAC_VAL_OFF = "OFF";
103d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
104b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /** Handle to voicemail pref */
105cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private static final int VOICEMAIL_PREF_ID = 1;
106365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private static final int VOICEMAIL_PROVIDER_CFG_ID = 2;
107b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
108b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private Phone mPhone;
109b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
110cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private AudioManager mAudioManager;
111cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
112b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int VM_NOCHANGE_ERROR = 400;
113b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int VM_RESPONSE_ERROR = 500;
114b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
115b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
116b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // dialog identifiers for voicemail
117b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int VOICEMAIL_DIALOG_CONFIRM = 600;
118b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
119b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // status message sent back from handlers
120b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MSG_OK = 100;
121cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
122b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // special statuses for voicemail controls.
123b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MSG_VM_EXCEPTION = 400;
124b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MSG_VM_OK = 600;
125b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MSG_VM_NOCHANGE = 700;
126cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
127b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private EditPhoneNumberPreference mSubMenuVoicemailSettings;
128cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
1293800ac871d6548790ac6119bb68b9be0640af261David Krause    private CheckBoxPreference mButtonAutoRetry;
130cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private CheckBoxPreference mButtonHAC;
131cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private ListPreference mButtonDTMF;
132404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville    private ListPreference mButtonTTY;
133365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private ListPreference mVoicemailProviders;
134365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private PreferenceScreen mVoicemailSettings;
135365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private class VoiceMailProvider {
136365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        public VoiceMailProvider(String name, Intent intent) {
137365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            this.name = name;
138365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            this.intent = intent;
139365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
140365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        public String name;
141365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        public Intent intent;
142365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
143365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
144365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    /**
145365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Data about discovered voice mail settings providers.
146365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Is populated by querying which activities can handle ACTION_CONFIGURE_VOICEMAIL.
147365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * They key in this map is package name + activity name.
148365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * We always add an entry for the default provider with a key of empty
149365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * string and intent value of null.
150365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * @see #initVoiceMailProviders.
151365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     */
152365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private Map<String, VoiceMailProvider> mVMProvidersData =
153365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        new HashMap<String, VoiceMailProvider>();
154b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
155b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /** string to hold old voicemail number as it is being updated. */
156b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private String mOldVmNumber;
157b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
158b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
159cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    TTYHandler ttyHandler;
160cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
161b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
162b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Click Listeners, handle click based on objects attached to UI.
163b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
164b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
165b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Click listener for all toggle events
166b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
167b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
168cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (preference == mSubMenuVoicemailSettings) {
169cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            return true;
170cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else if (preference == mButtonDTMF) {
171b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return true;
172a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        } else if (preference == mButtonTTY) {
173404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            return true;
1743800ac871d6548790ac6119bb68b9be0640af261David Krause        } else if (preference == mButtonAutoRetry) {
175cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            android.provider.Settings.System.putInt(mPhone.getContext().getContentResolver(),
176cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    android.provider.Settings.System.CALL_AUTO_RETRY,
177cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    mButtonAutoRetry.isChecked() ? 1 : 0);
178cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            return true;
179cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else if (preference == mButtonHAC) {
180cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int hac = mButtonHAC.isChecked() ? 1 : 0;
181cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            // Update HAC value in Settings database
182cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            Settings.System.putInt(mPhone.getContext().getContentResolver(),
183cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    Settings.System.HEARING_AID, hac);
184b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
185cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            // Update HAC Value in AudioManager
186cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mAudioManager.setParameter(HAC_KEY, hac != 0 ? HAC_VAL_ON : HAC_VAL_OFF);
187b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return true;
188365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        } else if (preference == mVoicemailSettings) {
189365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            if (preference.getIntent() != null) {
190365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                this.startActivityForResult(preference.getIntent(), VOICEMAIL_PROVIDER_CFG_ID);
191365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            } else {
192365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                updateVoiceNumberField();
193365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            }
194365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            return true;
195b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
196b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return false;
197b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
198b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
199b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /**
200b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Implemented to support onPreferenceChangeListener to look for preference
201cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause     * changes.
202b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     *
203cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause     * @param preference is the preference to be changed
204b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * @param objValue should be the value of the selection, NOT its localized
205b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * display value.
206b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
207b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public boolean onPreferenceChange(Preference preference, Object objValue) {
208cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (preference == mButtonDTMF) {
209cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int index = mButtonDTMF.findIndexOfValue((String) objValue);
210d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville            Settings.System.putInt(mPhone.getContext().getContentResolver(),
211d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville                    Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, index);
212cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else if (preference == mButtonTTY) {
213cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            handleTTYChange(preference, objValue);
214365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        } else if (preference == mVoicemailProviders) {
215365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            updateVMPreferenceWidgets((String)objValue);
216b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
217b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // always let the preference setting proceed.
218b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return true;
219b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
220b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
221b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Preference click listener invoked on OnDialogClosed for EditPhoneNumberPreference.
222b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public void onDialogClosed(EditPhoneNumberPreference preference, int buttonClicked) {
223b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (DBG) log("onPreferenceClick: request preference click on dialog close.");
224b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
225b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (preference instanceof EditPhoneNumberPreference) {
226b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            EditPhoneNumberPreference epn = preference;
227b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
228b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (epn == mSubMenuVoicemailSettings) {
229b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                handleVMBtnClickRequest();
230b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
231b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
232b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
233b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
234b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /**
235b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Implemented for EditPhoneNumberPreference.GetDefaultNumberListener.
236b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * This method set the default values for the various
237b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * EditPhoneNumberPreference dialogs.
238b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
239b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public String onGetDefaultNumber(EditPhoneNumberPreference preference) {
240b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (preference == mSubMenuVoicemailSettings) {
241b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // update the voicemail number field, which takes care of the
242b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // mSubMenuVoicemailSettings itself, so we should return null.
243b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("updating default for voicemail dialog");
244b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            updateVoiceNumberField();
245b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return null;
246b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
247b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
248a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        String vmDisplay = mPhone.getVoiceMailNumber();
249b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (TextUtils.isEmpty(vmDisplay)) {
250b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // if there is no voicemail number, we just return null to
251b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // indicate no contribution.
252b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return null;
253b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
254b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
255b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // Return the voicemail number prepended with "VM: "
256b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (DBG) log("updating default for call forwarding dialogs");
257b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return getString(R.string.voicemail_abbreviated) + " " + vmDisplay;
258b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
259b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
260b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
261b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // override the startsubactivity call to make changes in state consistent.
262b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
263b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public void startActivityForResult(Intent intent, int requestCode) {
264b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (requestCode == -1) {
265b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // this is an intent requested from the preference framework.
266b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            super.startActivityForResult(intent, requestCode);
267b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
268b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
269b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
270b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (DBG) log("startSubActivity: starting requested subactivity");
271b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        super.startActivityForResult(intent, requestCode);
272b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
273b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
274365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    // asynchronous result call after contacts are selected or after we return from
275365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    // a call to the VM settings provider.
276b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
277b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
278b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // there are cases where the contact picker may end up sending us more than one
279b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // request.  We want to ignore the request if we're not in the correct state.
280365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        if (requestCode ==  VOICEMAIL_PROVIDER_CFG_ID) {
281365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            if (resultCode != RESULT_OK) {
282365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                if (DBG) log("onActivityResult: vm provider cfg result not OK.");
283365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                return;
284365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            }
285365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            if (data == null) {
286365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                if (DBG) log("onActivityResult: vm provider cfg result has no data");
287365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                return;
288365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            }
289365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            String vmNum = data.getStringExtra("vmnum");
290365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            if (vmNum == null) {
291365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                if (DBG) log("onActivityResult: vm provider cfg result has no vmnum");
292365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                return;
293365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            }
294365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            saveVoiceMailNumber(vmNum);
295365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            return;
296365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
297b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
298b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (resultCode != RESULT_OK) {
299b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("onActivityResult: contact picker result not OK.");
300b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
301b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
302b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
303b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        Cursor cursor = getContentResolver().query(data.getData(),
304b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                NUM_PROJECTION, null, null, null);
305b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if ((cursor == null) || (!cursor.moveToFirst())) {
306b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("onActivityResult: bad contact data, no results found.");
307b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
308b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
309b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
310b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        switch (requestCode) {
311b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            case VOICEMAIL_PREF_ID:
312b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mSubMenuVoicemailSettings.onPickActivityResult(cursor.getString(0));
313b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
314b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            default:
315b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                // TODO: may need exception here.
316b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
317b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
318b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
319b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Voicemail button logic
320b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private void handleVMBtnClickRequest() {
321b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // normally called on the dialog close.
322b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
323b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // Since we're stripping the formatting out on the getPhoneNumber()
324b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // call now, we won't need to do so here anymore.
325365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        saveVoiceMailNumber(mSubMenuVoicemailSettings.getPhoneNumber());
326b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
327365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
328365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
329365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private void saveVoiceMailNumber(String newVMNumber) {
330b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // empty vm number == clearing the vm number ?
331b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (newVMNumber == null) {
332b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            newVMNumber = "";
333b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
334b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
335b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        //throw a warning if they are the same.
336b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (newVMNumber.equals(mOldVmNumber)) {
337cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            showVMDialog(MSG_VM_NOCHANGE);
338b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
339b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
340b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
341b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // otherwise, set it.
342b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (DBG) log("save voicemail #: " + newVMNumber);
343b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mPhone.setVoiceMailNumber(
344b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mPhone.getVoiceMailAlphaTag().toString(),
345b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                newVMNumber,
346b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                Message.obtain(mSetOptionComplete, EVENT_VOICEMAIL_CHANGED));
347b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
348b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
349b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
350b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Callback to handle option update completions
351b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
352b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
353b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // **Callback on option setting when complete.
354b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private Handler mSetOptionComplete = new Handler() {
355b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        @Override
356b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        public void handleMessage(Message msg) {
357b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // query to make sure we're looking at the same data as that in the network.
358b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            switch (msg.what) {
359b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case EVENT_VOICEMAIL_CHANGED:
360b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    handleSetVMMessage((AsyncResult) msg.obj);
361b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
362b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                default:
363b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // TODO: should never reach this, may want to throw exception
364b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
365b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
366b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    };
367b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
368b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Voicemail Object
369b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private void handleSetVMMessage(AsyncResult ar) {
370b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (DBG) {
371b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            log("handleSetVMMessage: set VM request complete");
372b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
373b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (ar.exception == null) {
374b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("change VM success!");
375cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            showVMDialog(MSG_VM_OK);
376b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        } else {
377b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // TODO: may want to check the exception and branch on it.
378b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("change VM failed!");
379cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            showVMDialog(MSG_VM_EXCEPTION);
380b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
381b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        updateVoiceNumberField();
382b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
383b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
384b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
385b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Methods used to sync UI state with that of the network
386b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
387b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
388b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // update the voicemail number from what we've recorded on the sim.
389b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private void updateVoiceNumberField() {
3904ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        if (mSubMenuVoicemailSettings == null) {
3914ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            return;
3924ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        }
393404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
394b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mOldVmNumber = mPhone.getVoiceMailNumber();
395b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (mOldVmNumber == null) {
396b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            mOldVmNumber = "";
397b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
398b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mSubMenuVoicemailSettings.setPhoneNumber(mOldVmNumber);
399365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final String summary = (mOldVmNumber.length() > 0) ? mOldVmNumber :
400365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            getString(R.string.voicemail_number_not_set);
401365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mSubMenuVoicemailSettings.setSummary(summary);
402b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
403b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
404b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
405b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Helper Methods for Activity class.
406b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * The inital query commands are split into two pieces now
407b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * for individual expansion.  This combined with the ability
408b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * to cancel queries allows for a much better user experience,
409b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * and also ensures that the user only waits to update the
410b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * data that is relevant.
411b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
412b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
413b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // dialog creation method, called by showDialog()
414b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
415b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    protected Dialog onCreateDialog(int id) {
416cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if ((id == VM_RESPONSE_ERROR) || (id == VM_NOCHANGE_ERROR) ||
417cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                (id == VOICEMAIL_DIALOG_CONFIRM)) {
418b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
419b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            AlertDialog.Builder b = new AlertDialog.Builder(this);
420b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
421b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            int msgId;
422b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            int titleId = R.string.error_updating_title;
423b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            switch (id) {
424b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case VOICEMAIL_DIALOG_CONFIRM:
425b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.vm_changed;
426b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    titleId = R.string.voicemail;
427b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 2
428b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setNegativeButton(R.string.close_dialog, this);
429b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
430b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case VM_NOCHANGE_ERROR:
431b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // even though this is technically an error,
432b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // keep the title friendly.
433b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.no_change;
434b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    titleId = R.string.voicemail;
435b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 2
436b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setNegativeButton(R.string.close_dialog, this);
437b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
438b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case VM_RESPONSE_ERROR:
439b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.vm_change_failed;
440b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 1
441b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setPositiveButton(R.string.close_dialog, this);
442b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
443b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                default:
444b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    msgId = R.string.exception_error;
445b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // Set Button 3, tells the activity that the error is
446b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    // not recoverable on dialog exit.
447b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    b.setNeutralButton(R.string.close_dialog, this);
448b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
449b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
450b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
451b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            b.setTitle(getText(titleId));
452b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            b.setMessage(getText(msgId));
453b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            b.setCancelable(false);
454b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            AlertDialog dialog = b.create();
455b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
456b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // make the dialog more obvious by bluring the background.
457b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
458b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
459b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return dialog;
460b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
461b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
462b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return null;
463b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
464b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
465b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // This is a method implemented for DialogInterface.OnClickListener.
466b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Used with the error dialog to close the app, voicemail dialog to just dismiss.
467b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // Close button is mapped to BUTTON1 for the errors that close the activity,
468b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // while those that are mapped to 3 only move the preference focus.
469b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public void onClick(DialogInterface dialog, int which) {
470b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        dialog.dismiss();
471b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        switch (which){
472b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            case DialogInterface.BUTTON3:
473b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                // Neutral Button, used when we want to cancel expansion.
474b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
475b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            case DialogInterface.BUTTON1:
476b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                // Negative Button
477b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                finish();
478b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
479b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            default:
480b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                // just let the dialog close and go back to the input
481b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                // ready state
482b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                // Positive Button
483b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
484b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
485b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
486b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    // set the app state with optional status.
487cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private void showVMDialog(int msgStatus) {
488cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        switch (msgStatus) {
489cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_VM_EXCEPTION:
490cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                showDialog(VM_RESPONSE_ERROR);
491b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
492cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_VM_NOCHANGE:
493cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                showDialog(VM_NOCHANGE_ERROR);
494b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
495cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_VM_OK:
496cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                showDialog(VOICEMAIL_DIALOG_CONFIRM);
497b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                break;
498cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            case MSG_OK:
499cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            default:
500cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                // This should never happen.
501a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
502a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville    }
503404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
504b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    /*
505b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     * Activity class methods
506b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project     */
507b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
508b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
509b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    protected void onCreate(Bundle icicle) {
510b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        super.onCreate(icicle);
511a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        mPhone = PhoneFactory.getDefaultPhone();
512b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
513cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        addPreferencesFromResource(R.xml.call_feature_setting);
514cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
515cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
516cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
517b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        // get buttons
518b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        PreferenceScreen prefSet = getPreferenceScreen();
519365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mSubMenuVoicemailSettings = (EditPhoneNumberPreference)findPreference(BUTTON_VOICEMAIL_KEY);
5204ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        if (mSubMenuVoicemailSettings != null) {
5214ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            mSubMenuVoicemailSettings.setParentActivity(this, VOICEMAIL_PREF_ID, this);
5224ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            mSubMenuVoicemailSettings.setDialogOnClosedListener(this);
5234ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang            mSubMenuVoicemailSettings.setDialogTitle(R.string.voicemail_settings_number_label);
5244ccb1b7d68d5b5bb7ed54251a1f214162013bc60John Wang        }
525404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
526cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonDTMF = (ListPreference) findPreference(BUTTON_DTMF_KEY);
527cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonAutoRetry = (CheckBoxPreference) findPreference(BUTTON_RETRY_KEY);
528cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonHAC = (CheckBoxPreference) findPreference(BUTTON_HAC_KEY);
529cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mButtonTTY = (ListPreference) findPreference(BUTTON_TTY_KEY);
530365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVoicemailProviders = (ListPreference) findPreference(BUTTON_VOICEMAIL_PROVIDER_KEY);
531365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVoicemailProviders.setOnPreferenceChangeListener(this);
532365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVoicemailSettings = (PreferenceScreen)findPreference(BUTTON_VOICEMAIL_SETTING_KEY);
533365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
534365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        initVoiceMailProviders();
535b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
536cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (getResources().getBoolean(R.bool.dtmf_type_enabled)) {
537cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonDTMF.setOnPreferenceChangeListener(this);
538cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else {
539cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(mButtonDTMF);
540cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonDTMF = null;
5415b269ecd49279c3c4f85f55fa4fd4baa88e3a54bjsh        }
542b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
543cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (getResources().getBoolean(R.bool.auto_retry_enabled)) {
544cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonAutoRetry.setOnPreferenceChangeListener(this);
545cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else {
546cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(mButtonAutoRetry);
547cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonAutoRetry = null;
548cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
549b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
550cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (getResources().getBoolean(R.bool.hac_enabled)) {
551cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonHAC.setOnPreferenceChangeListener(this);
552cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        } else {
553cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(mButtonHAC);
554cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonHAC = null;
555cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
556b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
557cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (getResources().getBoolean(R.bool.tty_enabled)) {
558cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonTTY.setOnPreferenceChangeListener(this);
559cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            ttyHandler = new TTYHandler();
560b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        } else {
561cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(mButtonTTY);
562cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonTTY = null;
563cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
564cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
565cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (!getResources().getBoolean(R.bool.world_phone)) {
566cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(prefSet.findPreference(BUTTON_CDMA_OPTIONS));
567cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            prefSet.removePreference(prefSet.findPreference(BUTTON_GSM_UMTS_OPTIONS));
568cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
569cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            if (mPhone.getPhoneName().equals("CDMA")) {
570cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                prefSet.removePreference(prefSet.findPreference(BUTTON_FDN_KEY));
571cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                addPreferencesFromResource(R.xml.cdma_call_options);
572cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            } else {
573cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                addPreferencesFromResource(R.xml.gsm_umts_call_options);
574b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
575b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
576b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
577cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        // create intent to bring up contact list
578cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mContactListIntent = new Intent(Intent.ACTION_GET_CONTENT);
579cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        mContactListIntent.setType(android.provider.Contacts.Phones.CONTENT_ITEM_TYPE);
580cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause
581cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        // check the intent that started this activity and pop up the voicemail
582cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        // dialog if we've been asked to.
583cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL)) {
584cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mSubMenuVoicemailSettings.showPhoneNumberDialog();
585cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
586b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        updateVoiceNumberField();
587b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
588b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
589b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    @Override
590cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    protected void onResume() {
591cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        super.onResume();
592b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
593cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonDTMF != null) {
594cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int dtmf = Settings.System.getInt(getContentResolver(),
595cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, DTMF_TONE_TYPE_NORMAL);
596cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonDTMF.setValueIndex(dtmf);
597cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
598d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
599cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonAutoRetry != null) {
600cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int autoretry = Settings.System.getInt(getContentResolver(),
601cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    Settings.System.CALL_AUTO_RETRY, 0);
602cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonAutoRetry.setChecked(autoretry != 0);
603d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville        }
6043800ac871d6548790ac6119bb68b9be0640af261David Krause
605cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonHAC != null) {
606cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            int hac = Settings.System.getInt(getContentResolver(), Settings.System.HEARING_AID, 0);
607cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mButtonHAC.setChecked(hac != 0);
608cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
609d533a71d64507e33d78dc65aa2521eacb5f8bb25Wink Saville
610cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (mButtonTTY != null) {
611cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mPhone.queryTTYMode(ttyHandler.obtainMessage(TTYHandler.EVENT_TTY_MODE_GET));
612cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        }
613b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
614b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
615cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    private void handleTTYChange(Preference preference, Object objValue) {
616404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        int buttonTtyMode;
617404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        buttonTtyMode = Integer.valueOf((String) objValue).intValue();
618404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        int settingsTtyMode = android.provider.Settings.Secure.getInt(
619cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                getContentResolver(),
620404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                android.provider.Settings.Secure.PREFERRED_TTY_MODE, preferredTtyMode);
621cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        if (DBG) log("handleTTYChange: requesting set TTY mode enable (TTY) to" +
622404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                Integer.toString(buttonTtyMode));
623404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
624404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        if (buttonTtyMode != settingsTtyMode) {
625404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            switch(buttonTtyMode) {
626404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_OFF:
627404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_FULL:
628404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_HCO:
629404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            case Phone.TTY_MODE_VCO:
630cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                mPhone.setTTYMode(buttonTtyMode,
631cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                        ttyHandler.obtainMessage(TTYHandler.EVENT_TTY_MODE_SET));
632404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                break;
633404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            default:
634404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                mPhone.setTTYMode(Phone.TTY_MODE_OFF,
635cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                        ttyHandler.obtainMessage(TTYHandler.EVENT_TTY_MODE_SET));
636404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            }
637404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        }
638a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville    }
639a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
640cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause    class TTYHandler extends Handler {
641cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        /** Event for TTY mode change */
642cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        private static final int EVENT_TTY_MODE_GET = 700;
643cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        private static final int EVENT_TTY_MODE_SET = 800;
644a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
645a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        @Override
646a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        public void handleMessage(Message msg) {
647a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville            switch (msg.what) {
648cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                case EVENT_TTY_MODE_GET:
649cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    handleQueryTTYModeResponse(msg);
650404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                    break;
651404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville                case EVENT_TTY_MODE_SET:
652cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    handleSetTTYModeResponse(msg);
653a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville                    break;
654404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville            }
655404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville        }
656404edc94de563aef5fd5ba48be9114a970cb93bbWink Saville
657cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        private void updatePreferredTtyModeSummary(int TtyMode) {
658cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            String [] txts = getResources().getStringArray(R.array.tty_mode_entries);
659cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            switch(TtyMode) {
660cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                case Phone.TTY_MODE_OFF:
661cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                case Phone.TTY_MODE_HCO:
662cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                case Phone.TTY_MODE_VCO:
663cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                case Phone.TTY_MODE_FULL:
664cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    mButtonTTY.setSummary(txts[TtyMode]);
665a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville                    break;
666a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville                default:
667cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    mButtonTTY.setEnabled(false);
668cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                    mButtonTTY.setSummary(txts[Phone.TTY_MODE_OFF]);
669a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville            }
670a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
671a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
672cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        private void handleQueryTTYModeResponse(Message msg) {
673cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            AsyncResult ar = (AsyncResult) msg.obj;
674cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            if (ar.exception != null) {
675cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                if (DBG) log("handleQueryTTYModeResponse: Error getting TTY state.");
676cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                mButtonTTY.setEnabled(false);
677cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            } else {
678cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                if (DBG) log("handleQueryTTYModeResponse: TTY enable state successfully queried.");
679a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
680cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                int ttymode = ((int[]) ar.result)[0];
681cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                if (DBG) log("handleQueryTTYModeResponse:ttymode=" + ttymode);
682a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
683cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                Intent ttyModeChanged = new Intent(TtyIntent.TTY_ENABLED_CHANGE_ACTION);
684cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                ttyModeChanged.putExtra("ttyEnabled", ttymode != Phone.TTY_MODE_OFF);
685cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                sendBroadcast(ttyModeChanged);
686cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                android.provider.Settings.Secure.putInt(getContentResolver(),
687cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                        android.provider.Settings.Secure.PREFERRED_TTY_MODE, ttymode );
688cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                mButtonTTY.setValue(Integer.toString(ttymode));
689cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                updatePreferredTtyModeSummary(ttymode);
690a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville            }
691a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
692a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
693cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause        private void handleSetTTYModeResponse(Message msg) {
694cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            AsyncResult ar = (AsyncResult) msg.obj;
695a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
696cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            if (ar.exception != null) {
697cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                if (DBG) log("handleSetTTYModeResponse: Error setting TTY mode, ar.exception"
698cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause                        + ar.exception);
699a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville            }
700cd0189299f484dcbd51400b994daf585923e9e8dDavid Krause            mPhone.queryTTYMode(ttyHandler.obtainMessage(TTYHandler.EVENT_TTY_MODE_GET));
701a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville        }
702a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville
7033800ac871d6548790ac6119bb68b9be0640af261David Krause    }
7043800ac871d6548790ac6119bb68b9be0640af261David Krause
705b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static void log(String msg) {
706b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        Log.d(LOG_TAG, msg);
707b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
708365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
709365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    /**
710365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Updates the look of the VM preference widgets based on current VM provider settings.
711365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Note that the provider name is loaded form the found activity via loadLabel in
712365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * initVoiceMailProviders in order for it to be localizable.
713365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     */
714365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private void updateVMPreferenceWidgets(String currentProviderSetting) {
715365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final String key = currentProviderSetting;
716365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final VoiceMailProvider provider = mVMProvidersData.get(key);
717365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
718365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        /* This is the case when we are coming up on a freshly wiped phone and there is no
719365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky         persisted value for the list preference mVoicemailProviders.
720365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky         In this case we want to show the UI asking the user to select a voicemail provider as
721365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky         opposed to silently falling back to default one. */
722365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        if (provider == null) {
723365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailProviders.setSummary(getString(R.string.sum_voicemail_choose_provider));
724365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setSummary("");
725365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setEnabled(false);
726365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setIntent(null);
727365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        } else {
728365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            final String providerName = provider.name;
729365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailProviders.setSummary(providerName);
730365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setSummary(getApplicationContext().getString(
731365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    R.string.voicemail_settings_for, providerName));
732365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setEnabled(true);
733365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVoicemailSettings.setIntent(provider.intent);
734365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
735365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
736365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
737365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    /**
738365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * Enumerates existing VM providers and puts their data into the list and populates
739365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     * the preference list objects with their names.
740365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky     */
741365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    private void initVoiceMailProviders() {
742365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVMProvidersData.clear();
743365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
744365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        // Stick the default element which is always there
745365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final String myCarrier = getString(R.string.voicemail_default);
746365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVMProvidersData.put("", new VoiceMailProvider(myCarrier, null));
747365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
748365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        // Enumerate providers
749365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        PackageManager pm = getPackageManager();
750365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        Intent intent = new Intent();
751365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        intent.setAction(ACTION_CONFIGURE_VOICEMAIL);
752365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
753365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
754365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        final int len = resolveInfos.size() + 1;
755365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        String [] entries = new String [len];
756365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        String [] values = new String [len];
757365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        entries[0] = myCarrier;
758365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        values[0] = "";
759365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        for (int i = 0; i < resolveInfos.size(); i++) {
760365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            final ResolveInfo ri= resolveInfos.get(i);
761365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            final String nameForDisplay = ri.loadLabel(pm).toString();
762365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            ActivityInfo currentActivityInfo = ri.activityInfo;
763365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            Intent providerIntent = new Intent();
764365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            providerIntent.setAction(ACTION_CONFIGURE_VOICEMAIL);
765365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            providerIntent.setClassName(currentActivityInfo.packageName,
766365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    currentActivityInfo.name);
767365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            final String key = currentActivityInfo.packageName + "." + currentActivityInfo.name;
768365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            mVMProvidersData.put(
769365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    key,
770365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky                    new VoiceMailProvider(nameForDisplay, providerIntent));
771365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            entries[i + 1] = nameForDisplay;
772365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky            values[i + 1] = key;
773365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        }
774365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
775365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVoicemailProviders.setEntries(entries);
776365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        mVoicemailProviders.setEntryValues(values);
777365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky
778365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky        updateVMPreferenceWidgets(mVoicemailProviders.getValue());
779365ab88d8d3f80f350bed0fee7c2ee1f52247b2eIlia Tulchinsky    }
780b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project}
781