blob: 8b7cd37af51af0ed0b202b09acf1735779b4418a [file] [log] [blame]
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.settings;
18
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080019import android.content.BroadcastReceiver;
20import android.content.ContentResolver;
21import android.content.Context;
22import android.content.Intent;
23import android.content.IntentFilter;
Marco Nelissen6eca4b32011-07-15 15:02:03 -070024import android.content.pm.PackageManager;
25import android.content.pm.ResolveInfo;
Amith Yamasani823bf0c2011-08-01 15:55:06 -070026import android.database.Cursor;
27import android.database.sqlite.SQLiteException;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080028import android.media.AudioManager;
Amith Yamasani823bf0c2011-08-01 15:55:06 -070029import android.media.Ringtone;
30import android.media.RingtoneManager;
Marco Nelissen6eca4b32011-07-15 15:02:03 -070031import android.media.audiofx.AudioEffect;
Amith Yamasani823bf0c2011-08-01 15:55:06 -070032import android.net.Uri;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080033import android.os.Bundle;
Amith Yamasani823bf0c2011-08-01 15:55:06 -070034import android.os.Handler;
35import android.os.Message;
Dianne Hackborn0a115aa2010-11-04 11:40:31 -070036import android.os.Vibrator;
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080037import android.preference.CheckBoxPreference;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080038import android.preference.ListPreference;
39import android.preference.Preference;
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080040import android.preference.PreferenceGroup;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080041import android.preference.PreferenceScreen;
Amith Yamasani823bf0c2011-08-01 15:55:06 -070042import android.provider.MediaStore;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080043import android.provider.Settings;
Amith Yamasani823bf0c2011-08-01 15:55:06 -070044import android.provider.MediaStore.Images.Media;
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080045import android.provider.Settings.SettingNotFoundException;
46import android.telephony.TelephonyManager;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080047import android.util.Log;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080048
Marco Nelissen6eca4b32011-07-15 15:02:03 -070049import java.util.List;
50
Amith Yamasanid7993472010-08-18 13:59:28 -070051public class SoundSettings extends SettingsPreferenceFragment implements
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080052 Preference.OnPreferenceChangeListener {
Amith Yamasani823bf0c2011-08-01 15:55:06 -070053 private static final String TAG = "SoundSettings";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080054
55 /** If there is no setting in the provider, use this. */
Chouting Zhang386278a2009-06-24 14:25:43 -050056 private static final int FALLBACK_EMERGENCY_TONE_VALUE = 0;
Michael Chandf9504e2009-12-06 01:04:04 -080057
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080058 private static final String KEY_SILENT = "silent";
59 private static final String KEY_VIBRATE = "vibrate";
Joe Onorato057f1812011-01-12 15:35:47 -080060 private static final String KEY_RING_VOLUME = "ring_volume";
Marco Nelissen6eca4b32011-07-15 15:02:03 -070061 private static final String KEY_MUSICFX = "musicfx";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080062 private static final String KEY_DTMF_TONE = "dtmf_tone";
63 private static final String KEY_SOUND_EFFECTS = "sound_effects";
Dan Murphy22e18682009-09-22 11:47:08 -050064 private static final String KEY_HAPTIC_FEEDBACK = "haptic_feedback";
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080065 private static final String KEY_EMERGENCY_TONE = "emergency_tone";
66 private static final String KEY_SOUND_SETTINGS = "sound_settings";
Daniel Sandler231d8802010-02-17 15:35:21 -050067 private static final String KEY_LOCK_SOUNDS = "lock_sounds";
Amith Yamasani60133dd2010-09-11 14:17:31 -070068 private static final String KEY_RINGTONE = "ringtone";
69 private static final String KEY_NOTIFICATION_SOUND = "notification_sound";
70 private static final String KEY_CATEGORY_CALLS = "category_calls";
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080071
Daniel Sandler2c917842010-04-21 15:24:24 -040072 private static final String VALUE_VIBRATE_NEVER = "never";
73 private static final String VALUE_VIBRATE_ALWAYS = "always";
74 private static final String VALUE_VIBRATE_ONLY_SILENT = "silent";
75 private static final String VALUE_VIBRATE_UNLESS_SILENT = "notsilent";
76
Amith Yamasani60133dd2010-09-11 14:17:31 -070077 private static final String[] NEED_VOICE_CAPABILITY = {
78 KEY_RINGTONE, KEY_DTMF_TONE, KEY_CATEGORY_CALLS,
79 KEY_EMERGENCY_TONE
80 };
81
Amith Yamasani823bf0c2011-08-01 15:55:06 -070082 private static final int MSG_UPDATE_RINGTONE_SUMMARY = 1;
83 private static final int MSG_UPDATE_NOTIFICATION_SUMMARY = 2;
84
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080085 private CheckBoxPreference mSilent;
86
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080087 /*
88 * If we are currently in one of the silent modes (the ringer mode is set to either
89 * "silent mode" or "vibrate mode"), then toggling the "Phone vibrate"
90 * preference will switch between "silent mode" and "vibrate mode".
91 * Otherwise, it will adjust the normal ringer mode's ring or ring+vibrate
92 * setting.
93 */
Daniel Sandler2c917842010-04-21 15:24:24 -040094 private ListPreference mVibrate;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080095 private CheckBoxPreference mDtmfTone;
96 private CheckBoxPreference mSoundEffects;
Dan Murphy22e18682009-09-22 11:47:08 -050097 private CheckBoxPreference mHapticFeedback;
Marco Nelissen6eca4b32011-07-15 15:02:03 -070098 private Preference mMusicFx;
Daniel Sandler231d8802010-02-17 15:35:21 -050099 private CheckBoxPreference mLockSounds;
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700100 private Preference mRingtonePreference;
101 private Preference mNotificationPreference;
102
103 private Runnable mRingtoneLookupRunnable;
Michael Chandf9504e2009-12-06 01:04:04 -0800104
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800105 private AudioManager mAudioManager;
Michael Chandf9504e2009-12-06 01:04:04 -0800106
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800107 private BroadcastReceiver mReceiver = new BroadcastReceiver() {
108 @Override
109 public void onReceive(Context context, Intent intent) {
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800110 if (intent.getAction().equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) {
111 updateState(false);
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800112 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800113 }
114 };
115
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700116 private Handler mHandler = new Handler() {
117 public void handleMessage(Message msg) {
118 switch (msg.what) {
119 case MSG_UPDATE_RINGTONE_SUMMARY:
120 mRingtonePreference.setSummary((CharSequence) msg.obj);
121 break;
122 case MSG_UPDATE_NOTIFICATION_SUMMARY:
123 mNotificationPreference.setSummary((CharSequence) msg.obj);
124 break;
125 }
126 }
127 };
128
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800129 private PreferenceGroup mSoundSettings;
130
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800131 @Override
Amith Yamasanid7993472010-08-18 13:59:28 -0700132 public void onCreate(Bundle savedInstanceState) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800133 super.onCreate(savedInstanceState);
134 ContentResolver resolver = getContentResolver();
Wink Saville327147e2011-02-02 11:30:25 -0800135 int activePhoneType = TelephonyManager.getDefault().getCurrentPhoneType();
Michael Chandf9504e2009-12-06 01:04:04 -0800136
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800137 mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800138
Amith Yamasani992f1022010-01-25 09:17:53 -0800139 addPreferencesFromResource(R.xml.sound_settings);
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800140
Chouting Zhang386278a2009-06-24 14:25:43 -0500141 if (TelephonyManager.PHONE_TYPE_CDMA != activePhoneType) {
142 // device is not CDMA, do not display CDMA emergency_tone
143 getPreferenceScreen().removePreference(findPreference(KEY_EMERGENCY_TONE));
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800144 }
Chouting Zhang386278a2009-06-24 14:25:43 -0500145
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800146 mSilent = (CheckBoxPreference) findPreference(KEY_SILENT);
Joe Onorato057f1812011-01-12 15:35:47 -0800147 if (!getResources().getBoolean(R.bool.has_silent_mode)) {
148 getPreferenceScreen().removePreference(mSilent);
149 findPreference(KEY_RING_VOLUME).setDependency(null);
150 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800151
Daniel Sandler2c917842010-04-21 15:24:24 -0400152 mVibrate = (ListPreference) findPreference(KEY_VIBRATE);
153 mVibrate.setOnPreferenceChangeListener(this);
Daniel Sandler4ce4f752010-03-08 15:08:34 -0500154
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800155 mDtmfTone = (CheckBoxPreference) findPreference(KEY_DTMF_TONE);
156 mDtmfTone.setPersistent(false);
157 mDtmfTone.setChecked(Settings.System.getInt(resolver,
158 Settings.System.DTMF_TONE_WHEN_DIALING, 1) != 0);
159 mSoundEffects = (CheckBoxPreference) findPreference(KEY_SOUND_EFFECTS);
160 mSoundEffects.setPersistent(false);
161 mSoundEffects.setChecked(Settings.System.getInt(resolver,
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700162 Settings.System.SOUND_EFFECTS_ENABLED, 1) != 0);
Dan Murphy22e18682009-09-22 11:47:08 -0500163 mHapticFeedback = (CheckBoxPreference) findPreference(KEY_HAPTIC_FEEDBACK);
164 mHapticFeedback.setPersistent(false);
165 mHapticFeedback.setChecked(Settings.System.getInt(resolver,
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700166 Settings.System.HAPTIC_FEEDBACK_ENABLED, 1) != 0);
Daniel Sandler231d8802010-02-17 15:35:21 -0500167 mLockSounds = (CheckBoxPreference) findPreference(KEY_LOCK_SOUNDS);
168 mLockSounds.setPersistent(false);
169 mLockSounds.setChecked(Settings.System.getInt(resolver,
170 Settings.System.LOCKSCREEN_SOUNDS_ENABLED, 1) != 0);
Chouting Zhang386278a2009-06-24 14:25:43 -0500171
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700172 mRingtonePreference = findPreference(KEY_RINGTONE);
173 mNotificationPreference = findPreference(KEY_NOTIFICATION_SOUND);
174
Amith Yamasaniedac9af2010-11-17 09:08:21 -0800175 if (!((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).hasVibrator()) {
176 getPreferenceScreen().removePreference(mVibrate);
177 getPreferenceScreen().removePreference(mHapticFeedback);
178 }
179
Chouting Zhang386278a2009-06-24 14:25:43 -0500180 if (TelephonyManager.PHONE_TYPE_CDMA == activePhoneType) {
181 ListPreference emergencyTonePreference =
182 (ListPreference) findPreference(KEY_EMERGENCY_TONE);
183 emergencyTonePreference.setValue(String.valueOf(Settings.System.getInt(
184 resolver, Settings.System.EMERGENCY_TONE, FALLBACK_EMERGENCY_TONE_VALUE)));
185 emergencyTonePreference.setOnPreferenceChangeListener(this);
186 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800187
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800188 mSoundSettings = (PreferenceGroup) findPreference(KEY_SOUND_SETTINGS);
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800189
Marco Nelissen6eca4b32011-07-15 15:02:03 -0700190 mMusicFx = mSoundSettings.findPreference(KEY_MUSICFX);
191 Intent i = new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL);
192 PackageManager p = getPackageManager();
193 List<ResolveInfo> ris = p.queryIntentActivities(i, PackageManager.GET_DISABLED_COMPONENTS);
194 if (ris.size() <= 2) {
195 // no need to show the item if there is no choice for the user to make
196 // note: the built in musicfx panel has two activities (one being a
197 // compatibility shim that launches either the other activity, or a
198 // third party one), hence the check for <=2. If the implementation
199 // of the compatbility layer changes, this check may need to be updated.
200 mSoundSettings.removePreference(mMusicFx);
201 }
202
Amith Yamasani60133dd2010-09-11 14:17:31 -0700203 if (!Utils.isVoiceCapable(getActivity())) {
204 for (String prefKey : NEED_VOICE_CAPABILITY) {
205 Preference pref = findPreference(prefKey);
206 if (pref != null) {
207 getPreferenceScreen().removePreference(pref);
208 }
209 }
210 }
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700211
212 mRingtoneLookupRunnable = new Runnable() {
213 public void run() {
214 if (mRingtonePreference != null) {
215 updateRingtoneName(RingtoneManager.TYPE_RINGTONE, mRingtonePreference,
216 MSG_UPDATE_RINGTONE_SUMMARY);
217 }
218 if (mNotificationPreference != null) {
219 updateRingtoneName(RingtoneManager.TYPE_NOTIFICATION, mNotificationPreference,
220 MSG_UPDATE_NOTIFICATION_SUMMARY);
221 }
222 }
223 };
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800224 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800225
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800226 @Override
Amith Yamasanid7993472010-08-18 13:59:28 -0700227 public void onResume() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800228 super.onResume();
Michael Chandf9504e2009-12-06 01:04:04 -0800229
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800230 updateState(true);
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700231 lookupRingtoneNames();
Michael Chandf9504e2009-12-06 01:04:04 -0800232
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800233 IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION);
Amith Yamasanid7993472010-08-18 13:59:28 -0700234 getActivity().registerReceiver(mReceiver, filter);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800235 }
236
237 @Override
Amith Yamasanid7993472010-08-18 13:59:28 -0700238 public void onPause() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800239 super.onPause();
240
Amith Yamasanid7993472010-08-18 13:59:28 -0700241 getActivity().unregisterReceiver(mReceiver);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800242 }
243
Daniel Sandler2c917842010-04-21 15:24:24 -0400244 private String getPhoneVibrateSettingValue() {
245 boolean vibeInSilent = (Settings.System.getInt(
246 getContentResolver(),
247 Settings.System.VIBRATE_IN_SILENT,
248 1) == 1);
249
250 // Control phone vibe independent of silent mode
251 int callsVibrateSetting =
252 mAudioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER);
253
254 if (vibeInSilent) {
255 if (callsVibrateSetting == AudioManager.VIBRATE_SETTING_OFF) {
256 // this state does not make sense; fix it up for the user
257 mAudioManager.setVibrateSetting(
258 AudioManager.VIBRATE_TYPE_RINGER,
259 AudioManager.VIBRATE_SETTING_ONLY_SILENT);
260 }
261 if (callsVibrateSetting == AudioManager.VIBRATE_SETTING_ON) {
262 return VALUE_VIBRATE_ALWAYS;
263 } else {
264 return VALUE_VIBRATE_ONLY_SILENT;
265 }
266 } else {
267 if (callsVibrateSetting == AudioManager.VIBRATE_SETTING_ONLY_SILENT) {
268 // this state does not make sense; fix it up
269 mAudioManager.setVibrateSetting(
270 AudioManager.VIBRATE_TYPE_RINGER,
271 AudioManager.VIBRATE_SETTING_OFF);
272 }
273 if (callsVibrateSetting == AudioManager.VIBRATE_SETTING_ON) {
274 return VALUE_VIBRATE_UNLESS_SILENT;
275 } else {
276 return VALUE_VIBRATE_NEVER;
277 }
278 }
279 }
280
281 private void setPhoneVibrateSettingValue(String value) {
282 boolean vibeInSilent;
283 int callsVibrateSetting;
284
285 if (value.equals(VALUE_VIBRATE_UNLESS_SILENT)) {
286 callsVibrateSetting = AudioManager.VIBRATE_SETTING_ON;
287 vibeInSilent = false;
288 } else if (value.equals(VALUE_VIBRATE_NEVER)) {
289 callsVibrateSetting = AudioManager.VIBRATE_SETTING_OFF;
290 vibeInSilent = false;
291 } else if (value.equals(VALUE_VIBRATE_ONLY_SILENT)) {
292 callsVibrateSetting = AudioManager.VIBRATE_SETTING_ONLY_SILENT;
293 vibeInSilent = true;
294 } else { //VALUE_VIBRATE_ALWAYS
295 callsVibrateSetting = AudioManager.VIBRATE_SETTING_ON;
296 vibeInSilent = true;
297 }
298
299 Settings.System.putInt(getContentResolver(),
300 Settings.System.VIBRATE_IN_SILENT,
301 vibeInSilent ? 1 : 0);
302
303 // might need to switch the ringer mode from one kind of "silent" to
304 // another
305 if (mSilent.isChecked()) {
306 mAudioManager.setRingerMode(
307 vibeInSilent ? AudioManager.RINGER_MODE_VIBRATE
308 : AudioManager.RINGER_MODE_SILENT);
309 }
310
311 mAudioManager.setVibrateSetting(
312 AudioManager.VIBRATE_TYPE_RINGER,
313 callsVibrateSetting);
314 }
315
Daniel Sandler58cf8292010-02-26 15:25:04 -0500316 // updateState in fact updates the UI to reflect the system state
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800317 private void updateState(boolean force) {
Amith Yamasanieb99f2f2010-12-15 14:12:43 -0800318 if (getActivity() == null) return;
319
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800320 final int ringerMode = mAudioManager.getRingerMode();
Daniel Sandler58cf8292010-02-26 15:25:04 -0500321
322 // NB: in the UI we now simply call this "silent mode". A separate
323 // setting controls whether we're in RINGER_MODE_SILENT or
324 // RINGER_MODE_VIBRATE.
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800325 final boolean silentOrVibrateMode =
326 ringerMode != AudioManager.RINGER_MODE_NORMAL;
Michael Chandf9504e2009-12-06 01:04:04 -0800327
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800328 if (silentOrVibrateMode != mSilent.isChecked() || force) {
329 mSilent.setChecked(silentOrVibrateMode);
330 }
331
Daniel Sandler2c917842010-04-21 15:24:24 -0400332 String phoneVibrateSetting = getPhoneVibrateSettingValue();
Daniel Sandler58cf8292010-02-26 15:25:04 -0500333
Daniel Sandler2c917842010-04-21 15:24:24 -0400334 if (! phoneVibrateSetting.equals(mVibrate.getValue()) || force) {
335 mVibrate.setValue(phoneVibrateSetting);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800336 }
Daniel Sandler2c917842010-04-21 15:24:24 -0400337 mVibrate.setSummary(mVibrate.getEntry());
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700338 }
Michael Chandf9504e2009-12-06 01:04:04 -0800339
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700340 private void updateRingtoneName(int type, Preference preference, int msg) {
341 if (preference == null) return;
342 Context context = getActivity();
343 if (context == null) return;
344 Uri ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, type);
345 CharSequence summary = context.getString(com.android.internal.R.string.ringtone_unknown);
346 // Is it a silent ringtone?
347 if (ringtoneUri == null) {
348 summary = context.getString(com.android.internal.R.string.ringtone_silent);
349 } else {
350 // Fetch the ringtone title from the media provider
351 try {
352 Cursor cursor = context.getContentResolver().query(ringtoneUri,
353 new String[] { MediaStore.Audio.Media.TITLE }, null, null, null);
354 if (cursor.moveToFirst()) {
355 summary = cursor.getString(0);
356 }
357 } catch (SQLiteException sqle) {
358 // Unknown title for the ringtone
359 }
360 }
361 mHandler.sendMessage(mHandler.obtainMessage(msg, summary));
362 }
363
364 private void lookupRingtoneNames() {
365 new Thread(mRingtoneLookupRunnable).start();
Dianne Hackborn76315392009-09-03 13:33:55 -0700366 }
Michael Chandf9504e2009-12-06 01:04:04 -0800367
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800368 @Override
369 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
Daniel Sandler58cf8292010-02-26 15:25:04 -0500370 if (preference == mSilent) {
371 if (mSilent.isChecked()) {
Daniel Sandler2c917842010-04-21 15:24:24 -0400372 boolean vibeInSilent = (1 == Settings.System.getInt(
373 getContentResolver(),
374 Settings.System.VIBRATE_IN_SILENT,
375 1));
Daniel Sandler58cf8292010-02-26 15:25:04 -0500376 mAudioManager.setRingerMode(
377 vibeInSilent ? AudioManager.RINGER_MODE_VIBRATE
378 : AudioManager.RINGER_MODE_SILENT);
379 } else {
380 mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
381 }
382 updateState(false);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800383 } else if (preference == mDtmfTone) {
384 Settings.System.putInt(getContentResolver(), Settings.System.DTMF_TONE_WHEN_DIALING,
385 mDtmfTone.isChecked() ? 1 : 0);
Michael Chandf9504e2009-12-06 01:04:04 -0800386
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800387 } else if (preference == mSoundEffects) {
388 if (mSoundEffects.isChecked()) {
389 mAudioManager.loadSoundEffects();
390 } else {
391 mAudioManager.unloadSoundEffects();
392 }
393 Settings.System.putInt(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED,
394 mSoundEffects.isChecked() ? 1 : 0);
Dan Murphy22e18682009-09-22 11:47:08 -0500395
396 } else if (preference == mHapticFeedback) {
397 Settings.System.putInt(getContentResolver(), Settings.System.HAPTIC_FEEDBACK_ENABLED,
398 mHapticFeedback.isChecked() ? 1 : 0);
Michael Chandf9504e2009-12-06 01:04:04 -0800399
Daniel Sandler231d8802010-02-17 15:35:21 -0500400 } else if (preference == mLockSounds) {
401 Settings.System.putInt(getContentResolver(), Settings.System.LOCKSCREEN_SOUNDS_ENABLED,
402 mLockSounds.isChecked() ? 1 : 0);
403
Marco Nelissen6eca4b32011-07-15 15:02:03 -0700404 } else if (preference == mMusicFx) {
405 // let the framework fire off the intent
406 return false;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800407 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800408
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800409 return true;
410 }
411
412 public boolean onPreferenceChange(Preference preference, Object objValue) {
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800413 final String key = preference.getKey();
Amith Yamasani992f1022010-01-25 09:17:53 -0800414 if (KEY_EMERGENCY_TONE.equals(key)) {
Chouting Zhang386278a2009-06-24 14:25:43 -0500415 try {
Peter Kuterna378b6f62010-11-28 22:35:31 +0100416 int value = Integer.parseInt((String) objValue);
Chouting Zhang386278a2009-06-24 14:25:43 -0500417 Settings.System.putInt(getContentResolver(),
418 Settings.System.EMERGENCY_TONE, value);
419 } catch (NumberFormatException e) {
420 Log.e(TAG, "could not persist emergency tone setting", e);
421 }
Daniel Sandler2c917842010-04-21 15:24:24 -0400422 } else if (preference == mVibrate) {
423 setPhoneVibrateSettingValue(objValue.toString());
424 updateState(false);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800425 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800426
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800427 return true;
428 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800429}