1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/*
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License.
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License.
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings;
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.BroadcastReceiver;
20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.ContentResolver;
21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter;
246eca4b3b927611795910908532fa927c9eea6fafMarco Nelissenimport android.content.pm.PackageManager;
256eca4b3b927611795910908532fa927c9eea6fafMarco Nelissenimport android.content.pm.ResolveInfo;
26823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.database.Cursor;
27823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.database.sqlite.SQLiteException;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.media.AudioManager;
29823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.media.Ringtone;
30823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.media.RingtoneManager;
316eca4b3b927611795910908532fa927c9eea6fafMarco Nelissenimport android.media.audiofx.AudioEffect;
32823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.net.Uri;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
34823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.os.Handler;
35823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.os.Message;
360a115aae82ea96bd9079bbb024e99330ea99df0aDianne Hackbornimport android.os.Vibrator;
378f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasaniimport android.preference.CheckBoxPreference;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.ListPreference;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference;
408f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasaniimport android.preference.PreferenceGroup;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen;
42823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.provider.MediaStore;
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings;
44823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.provider.MediaStore.Images.Media;
458f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasaniimport android.provider.Settings.SettingNotFoundException;
468f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasaniimport android.telephony.TelephonyManager;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
496eca4b3b927611795910908532fa927c9eea6fafMarco Nelissenimport java.util.List;
506eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen
51d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasanipublic class SoundSettings extends SettingsPreferenceFragment implements
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Preference.OnPreferenceChangeListener {
53823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani    private static final String TAG = "SoundSettings";
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** If there is no setting in the provider, use this. */
56386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang    private static final int FALLBACK_EMERGENCY_TONE_VALUE = 0;
57df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan
58dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani    private static final String KEY_SILENT_MODE = "silent_mode";
59dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani    private static final String KEY_VIBRATE = "vibrate_on_ring";
60057f181f3715e7340bf1618e86fdce118bbf952bJoe Onorato    private static final String KEY_RING_VOLUME = "ring_volume";
616eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen    private static final String KEY_MUSICFX = "musicfx";
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_DTMF_TONE = "dtmf_tone";
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_SOUND_EFFECTS = "sound_effects";
6422e186898e47cf35a49e73494bf11695c854d284Dan Murphy    private static final String KEY_HAPTIC_FEEDBACK = "haptic_feedback";
658f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani    private static final String KEY_EMERGENCY_TONE = "emergency_tone";
668f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani    private static final String KEY_SOUND_SETTINGS = "sound_settings";
67231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler    private static final String KEY_LOCK_SOUNDS = "lock_sounds";
6860133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani    private static final String KEY_RINGTONE = "ringtone";
6960133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani    private static final String KEY_NOTIFICATION_SOUND = "notification_sound";
7060133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani    private static final String KEY_CATEGORY_CALLS = "category_calls";
718f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani
72dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani    private static final String SILENT_MODE_OFF = "off";
73dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani    private static final String SILENT_MODE_VIBRATE = "vibrate";
74dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani    private static final String SILENT_MODE_MUTE = "mute";
752c917847f520c59af84837d4514855ea01f0316cDaniel Sandler
7660133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani    private static final String[] NEED_VOICE_CAPABILITY = {
7760133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani            KEY_RINGTONE, KEY_DTMF_TONE, KEY_CATEGORY_CALLS,
7860133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani            KEY_EMERGENCY_TONE
7960133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani    };
8060133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani
81823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani    private static final int MSG_UPDATE_RINGTONE_SUMMARY = 1;
82823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani    private static final int MSG_UPDATE_NOTIFICATION_SUMMARY = 2;
83823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani
84dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani    private CheckBoxPreference mVibrateOnRing;
85dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani    private ListPreference mSilentMode;
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mDtmfTone;
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mSoundEffects;
8822e186898e47cf35a49e73494bf11695c854d284Dan Murphy    private CheckBoxPreference mHapticFeedback;
896eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen    private Preference mMusicFx;
90231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler    private CheckBoxPreference mLockSounds;
91823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani    private Preference mRingtonePreference;
92823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani    private Preference mNotificationPreference;
93823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani
94823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani    private Runnable mRingtoneLookupRunnable;
95df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private AudioManager mAudioManager;
97df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        @Override
100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onReceive(Context context, Intent intent) {
101d2b3ab088f49e3451b703b50f07366795c50f674Amith Yamasani            if (intent.getAction().equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) {
102d2b3ab088f49e3451b703b50f07366795c50f674Amith Yamasani                updateState(false);
103d2b3ab088f49e3451b703b50f07366795c50f674Amith Yamasani            }
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
107823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani    private Handler mHandler = new Handler() {
108823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        public void handleMessage(Message msg) {
109823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani            switch (msg.what) {
110823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani            case MSG_UPDATE_RINGTONE_SUMMARY:
111823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                mRingtonePreference.setSummary((CharSequence) msg.obj);
112823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                break;
113823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani            case MSG_UPDATE_NOTIFICATION_SUMMARY:
114823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                mNotificationPreference.setSummary((CharSequence) msg.obj);
115823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                break;
116823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani            }
117823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        }
118823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani    };
119823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani
120d2b3ab088f49e3451b703b50f07366795c50f674Amith Yamasani    private PreferenceGroup mSoundSettings;
121d2b3ab088f49e3451b703b50f07366795c50f674Amith Yamasani
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
123d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle savedInstanceState) {
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedInstanceState);
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        ContentResolver resolver = getContentResolver();
126327147eb062a25ecab40d66ea14559070e0ecef3Wink Saville        int activePhoneType = TelephonyManager.getDefault().getCurrentPhoneType();
127df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
130992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        addPreferencesFromResource(R.xml.sound_settings);
1318f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani
132386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        if (TelephonyManager.PHONE_TYPE_CDMA != activePhoneType) {
133386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            // device is not CDMA, do not display CDMA emergency_tone
134386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            getPreferenceScreen().removePreference(findPreference(KEY_EMERGENCY_TONE));
1358f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani        }
136386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang
137dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        mSilentMode = (ListPreference) findPreference(KEY_SILENT_MODE);
138057f181f3715e7340bf1618e86fdce118bbf952bJoe Onorato        if (!getResources().getBoolean(R.bool.has_silent_mode)) {
139dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani            getPreferenceScreen().removePreference(mSilentMode);
140057f181f3715e7340bf1618e86fdce118bbf952bJoe Onorato            findPreference(KEY_RING_VOLUME).setDependency(null);
141dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        } else {
142dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani            mSilentMode.setOnPreferenceChangeListener(this);
143057f181f3715e7340bf1618e86fdce118bbf952bJoe Onorato        }
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
145dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        mVibrateOnRing = (CheckBoxPreference) findPreference(KEY_VIBRATE);
146dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        mVibrateOnRing.setOnPreferenceChangeListener(this);
1474ce4f759bd3979de4b21e66a0f8c7ec2beb40a31Daniel Sandler
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDtmfTone = (CheckBoxPreference) findPreference(KEY_DTMF_TONE);
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDtmfTone.setPersistent(false);
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDtmfTone.setChecked(Settings.System.getInt(resolver,
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.System.DTMF_TONE_WHEN_DIALING, 1) != 0);
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mSoundEffects = (CheckBoxPreference) findPreference(KEY_SOUND_EFFECTS);
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mSoundEffects.setPersistent(false);
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mSoundEffects.setChecked(Settings.System.getInt(resolver,
155823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                Settings.System.SOUND_EFFECTS_ENABLED, 1) != 0);
15622e186898e47cf35a49e73494bf11695c854d284Dan Murphy        mHapticFeedback = (CheckBoxPreference) findPreference(KEY_HAPTIC_FEEDBACK);
15722e186898e47cf35a49e73494bf11695c854d284Dan Murphy        mHapticFeedback.setPersistent(false);
15822e186898e47cf35a49e73494bf11695c854d284Dan Murphy        mHapticFeedback.setChecked(Settings.System.getInt(resolver,
159823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                Settings.System.HAPTIC_FEEDBACK_ENABLED, 1) != 0);
160231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler        mLockSounds = (CheckBoxPreference) findPreference(KEY_LOCK_SOUNDS);
161231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler        mLockSounds.setPersistent(false);
162231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler        mLockSounds.setChecked(Settings.System.getInt(resolver,
163231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler                Settings.System.LOCKSCREEN_SOUNDS_ENABLED, 1) != 0);
164386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang
165823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        mRingtonePreference = findPreference(KEY_RINGTONE);
166823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        mNotificationPreference = findPreference(KEY_NOTIFICATION_SOUND);
167823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani
168edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani        if (!((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).hasVibrator()) {
169dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani            getPreferenceScreen().removePreference(mVibrateOnRing);
170edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani            getPreferenceScreen().removePreference(mHapticFeedback);
171edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani        }
172edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani
173386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        if (TelephonyManager.PHONE_TYPE_CDMA == activePhoneType) {
174386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            ListPreference emergencyTonePreference =
175386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang                (ListPreference) findPreference(KEY_EMERGENCY_TONE);
176386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            emergencyTonePreference.setValue(String.valueOf(Settings.System.getInt(
177386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang                resolver, Settings.System.EMERGENCY_TONE, FALLBACK_EMERGENCY_TONE_VALUE)));
178386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            emergencyTonePreference.setOnPreferenceChangeListener(this);
179386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        }
1808f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani
181d2b3ab088f49e3451b703b50f07366795c50f674Amith Yamasani        mSoundSettings = (PreferenceGroup) findPreference(KEY_SOUND_SETTINGS);
182d2b3ab088f49e3451b703b50f07366795c50f674Amith Yamasani
1836eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen        mMusicFx = mSoundSettings.findPreference(KEY_MUSICFX);
1846eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen        Intent i = new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL);
1856eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen        PackageManager p = getPackageManager();
1866eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen        List<ResolveInfo> ris = p.queryIntentActivities(i, PackageManager.GET_DISABLED_COMPONENTS);
1876eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen        if (ris.size() <= 2) {
1886eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen            // no need to show the item if there is no choice for the user to make
1896eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen            // note: the built in musicfx panel has two activities (one being a
1906eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen            // compatibility shim that launches either the other activity, or a
1916eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen            // third party one), hence the check for <=2. If the implementation
1926eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen            // of the compatbility layer changes, this check may need to be updated.
1936eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen            mSoundSettings.removePreference(mMusicFx);
1946eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen        }
1956eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen
19660133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani        if (!Utils.isVoiceCapable(getActivity())) {
19760133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani            for (String prefKey : NEED_VOICE_CAPABILITY) {
19860133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani                Preference pref = findPreference(prefKey);
19960133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani                if (pref != null) {
20060133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani                    getPreferenceScreen().removePreference(pref);
20160133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani                }
20260133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani            }
20360133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani        }
204823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani
205823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        mRingtoneLookupRunnable = new Runnable() {
206823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani            public void run() {
207823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                if (mRingtonePreference != null) {
208823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                    updateRingtoneName(RingtoneManager.TYPE_RINGTONE, mRingtonePreference,
209823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                            MSG_UPDATE_RINGTONE_SUMMARY);
210823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                }
211823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                if (mNotificationPreference != null) {
212823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                    updateRingtoneName(RingtoneManager.TYPE_NOTIFICATION, mNotificationPreference,
213823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                            MSG_UPDATE_NOTIFICATION_SUMMARY);
214823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                }
215823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani            }
216823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        };
217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
2188f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani
219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
220d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onResume() {
221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
222df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan
223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        updateState(true);
224823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        lookupRingtoneNames();
225df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan
226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION);
227d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        getActivity().registerReceiver(mReceiver, filter);
228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
231d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onPause() {
232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onPause();
233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
234d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        getActivity().unregisterReceiver(mReceiver);
235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
237dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani    /**
238dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani     * Put the audio system into the correct vibrate setting
239dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani     */
240dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani    private void setPhoneVibrateSettingValue(boolean vibeOnRing) {
241dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        // If vibrate-on-ring is checked, use VIBRATE_SETTING_ON
242dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        // Otherwise vibrate is off when ringer is silent
243dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        int vibrateMode = vibeOnRing ? AudioManager.VIBRATE_SETTING_ON
244dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani                : AudioManager.VIBRATE_SETTING_ONLY_SILENT;
245dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, vibrateMode);
246b3e6afe029a852d50bcba4dd6eca0d831db9d771Amith Yamasani        mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION, vibrateMode);
2472c917847f520c59af84837d4514855ea01f0316cDaniel Sandler    }
2482c917847f520c59af84837d4514855ea01f0316cDaniel Sandler
249dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani    private void setPhoneSilentSettingValue(String value) {
250dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        int ringerMode = AudioManager.RINGER_MODE_NORMAL;
251dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        if (value.equals(SILENT_MODE_MUTE)) {
252dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani            ringerMode = AudioManager.RINGER_MODE_SILENT;
253dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        } else if (value.equals(SILENT_MODE_VIBRATE)) {
254dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani            ringerMode = AudioManager.RINGER_MODE_VIBRATE;
2552c917847f520c59af84837d4514855ea01f0316cDaniel Sandler        }
256dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        mAudioManager.setRingerMode(ringerMode);
257dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani    }
2582c917847f520c59af84837d4514855ea01f0316cDaniel Sandler
259dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani    private String getPhoneSilentModeSettingValue() {
260dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        switch (mAudioManager.getRingerMode()) {
261dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        case AudioManager.RINGER_MODE_NORMAL:
262dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani            return SILENT_MODE_OFF;
263dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        case AudioManager.RINGER_MODE_VIBRATE:
264dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani            return SILENT_MODE_VIBRATE;
265dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        case AudioManager.RINGER_MODE_SILENT:
266dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani            return SILENT_MODE_MUTE;
2672c917847f520c59af84837d4514855ea01f0316cDaniel Sandler        }
268dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        // Shouldn't happen
269dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        return SILENT_MODE_OFF;
2702c917847f520c59af84837d4514855ea01f0316cDaniel Sandler    }
2712c917847f520c59af84837d4514855ea01f0316cDaniel Sandler
27258cf8299d3ef347e3fd154b1439f50e62f7ca8bfDaniel Sandler    // updateState in fact updates the UI to reflect the system state
273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void updateState(boolean force) {
274eb99f2f3f4a3e6d5e785867043e6069c89e8cd58Amith Yamasani        if (getActivity() == null) return;
275eb99f2f3f4a3e6d5e785867043e6069c89e8cd58Amith Yamasani
276dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        final int vibrateMode = mAudioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER);
277df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan
278dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        mVibrateOnRing.setChecked(vibrateMode == AudioManager.VIBRATE_SETTING_ON);
279dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        mSilentMode.setValue(getPhoneSilentModeSettingValue());
28058cf8299d3ef347e3fd154b1439f50e62f7ca8bfDaniel Sandler
281dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        mSilentMode.setSummary(mSilentMode.getEntry());
282823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani    }
283823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani
284823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani    private void updateRingtoneName(int type, Preference preference, int msg) {
285823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        if (preference == null) return;
286823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        Context context = getActivity();
287823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        if (context == null) return;
288823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        Uri ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, type);
289823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        CharSequence summary = context.getString(com.android.internal.R.string.ringtone_unknown);
290823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        // Is it a silent ringtone?
291823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        if (ringtoneUri == null) {
292823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani            summary = context.getString(com.android.internal.R.string.ringtone_silent);
293823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        } else {
294823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani            // Fetch the ringtone title from the media provider
295823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani            try {
296823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                Cursor cursor = context.getContentResolver().query(ringtoneUri,
297823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                        new String[] { MediaStore.Audio.Media.TITLE }, null, null, null);
298c86755bfd56ff620e740e7a99303b54350ebf164Amith Yamasani                if (cursor != null) {
299c86755bfd56ff620e740e7a99303b54350ebf164Amith Yamasani                    if (cursor.moveToFirst()) {
300c86755bfd56ff620e740e7a99303b54350ebf164Amith Yamasani                        summary = cursor.getString(0);
301c86755bfd56ff620e740e7a99303b54350ebf164Amith Yamasani                    }
302c86755bfd56ff620e740e7a99303b54350ebf164Amith Yamasani                    cursor.close();
303823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                }
304823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani            } catch (SQLiteException sqle) {
305823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani                // Unknown title for the ringtone
306823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani            }
307823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        }
308823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        mHandler.sendMessage(mHandler.obtainMessage(msg, summary));
309823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani    }
310df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan
311823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani    private void lookupRingtoneNames() {
312823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani        new Thread(mRingtoneLookupRunnable).start();
31376315391f07d022e31c176633ae3aeaee5bb14ecDianne Hackborn    }
314df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan
315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
316afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
317dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        if (preference == mDtmfTone) {
318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Settings.System.putInt(getContentResolver(), Settings.System.DTMF_TONE_WHEN_DIALING,
319afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mDtmfTone.isChecked() ? 1 : 0);
320df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan
321afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mSoundEffects) {
322afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mSoundEffects.isChecked()) {
323afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAudioManager.loadSoundEffects();
324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAudioManager.unloadSoundEffects();
326afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Settings.System.putInt(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED,
328afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mSoundEffects.isChecked() ? 1 : 0);
32922e186898e47cf35a49e73494bf11695c854d284Dan Murphy
33022e186898e47cf35a49e73494bf11695c854d284Dan Murphy        } else if (preference == mHapticFeedback) {
33122e186898e47cf35a49e73494bf11695c854d284Dan Murphy            Settings.System.putInt(getContentResolver(), Settings.System.HAPTIC_FEEDBACK_ENABLED,
33222e186898e47cf35a49e73494bf11695c854d284Dan Murphy                    mHapticFeedback.isChecked() ? 1 : 0);
333df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan
334231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler        } else if (preference == mLockSounds) {
335231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler            Settings.System.putInt(getContentResolver(), Settings.System.LOCKSCREEN_SOUNDS_ENABLED,
336231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler                    mLockSounds.isChecked() ? 1 : 0);
337231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler
3386eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen        } else if (preference == mMusicFx) {
3396eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen            // let the framework fire off the intent
3406eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen            return false;
341afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
3428f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani
343afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return true;
344afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
345afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
346afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onPreferenceChange(Preference preference, Object objValue) {
3478f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani        final String key = preference.getKey();
348992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani        if (KEY_EMERGENCY_TONE.equals(key)) {
349386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            try {
350378b6f674064e373f1be4d230608be4d0bddbb4fPeter Kuterna                int value = Integer.parseInt((String) objValue);
351386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang                Settings.System.putInt(getContentResolver(),
352386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang                        Settings.System.EMERGENCY_TONE, value);
353386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            } catch (NumberFormatException e) {
354386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang                Log.e(TAG, "could not persist emergency tone setting", e);
355386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang            }
356dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        } else if (preference == mVibrateOnRing) {
357dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani            setPhoneVibrateSettingValue((Boolean) objValue);
358dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani        } else if (preference == mSilentMode) {
359dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani            setPhoneSilentSettingValue(objValue.toString());
360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
3618f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani
362afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return true;
363afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
364afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
365