blob: 931858ca3c7f530575ee612be1b7ef748664b8d4 [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
Chris Wren2bc32ae2012-09-24 14:23:46 -040019import com.android.settings.bluetooth.DockEventReceiver;
20
21import android.app.AlertDialog;
22import android.app.Dialog;
23import android.bluetooth.BluetoothDevice;
24import android.content.BroadcastReceiver;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080025import android.content.ContentResolver;
26import android.content.Context;
27import android.content.Intent;
Chris Wren2bc32ae2012-09-24 14:23:46 -040028import android.content.IntentFilter;
Marco Nelissen6eca4b32011-07-15 15:02:03 -070029import android.content.pm.PackageManager;
30import android.content.pm.ResolveInfo;
Amith Yamasani823bf0c2011-08-01 15:55:06 -070031import android.database.Cursor;
32import android.database.sqlite.SQLiteException;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080033import android.media.AudioManager;
Amith Yamasani823bf0c2011-08-01 15:55:06 -070034import android.media.RingtoneManager;
Marco Nelissen6eca4b32011-07-15 15:02:03 -070035import android.media.audiofx.AudioEffect;
Amith Yamasani823bf0c2011-08-01 15:55:06 -070036import android.net.Uri;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080037import android.os.Bundle;
Amith Yamasani823bf0c2011-08-01 15:55:06 -070038import android.os.Handler;
39import android.os.Message;
Dianne Hackborn0a115aa2010-11-04 11:40:31 -070040import android.os.Vibrator;
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080041import android.preference.CheckBoxPreference;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080042import android.preference.ListPreference;
43import android.preference.Preference;
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080044import android.preference.PreferenceGroup;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080045import android.preference.PreferenceScreen;
Amith Yamasani823bf0c2011-08-01 15:55:06 -070046import android.provider.MediaStore;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080047import android.provider.Settings;
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080048import android.telephony.TelephonyManager;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080049import android.util.Log;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080050
Marco Nelissen6eca4b32011-07-15 15:02:03 -070051import java.util.List;
52
Amith Yamasanid7993472010-08-18 13:59:28 -070053public class SoundSettings extends SettingsPreferenceFragment implements
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080054 Preference.OnPreferenceChangeListener {
Amith Yamasani823bf0c2011-08-01 15:55:06 -070055 private static final String TAG = "SoundSettings";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080056
Chris Wren2bc32ae2012-09-24 14:23:46 -040057 private static final int DIALOG_NOT_DOCKED = 1;
58
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080059 /** If there is no setting in the provider, use this. */
Chouting Zhang386278a2009-06-24 14:25:43 -050060 private static final int FALLBACK_EMERGENCY_TONE_VALUE = 0;
Michael Chandf9504e2009-12-06 01:04:04 -080061
Daisuke Miyakawa8b878db2012-05-08 12:26:23 -070062 private static final String KEY_VIBRATE = "vibrate_when_ringing";
Joe Onorato057f1812011-01-12 15:35:47 -080063 private static final String KEY_RING_VOLUME = "ring_volume";
Marco Nelissen6eca4b32011-07-15 15:02:03 -070064 private static final String KEY_MUSICFX = "musicfx";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080065 private static final String KEY_DTMF_TONE = "dtmf_tone";
66 private static final String KEY_SOUND_EFFECTS = "sound_effects";
Dan Murphy22e18682009-09-22 11:47:08 -050067 private static final String KEY_HAPTIC_FEEDBACK = "haptic_feedback";
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080068 private static final String KEY_EMERGENCY_TONE = "emergency_tone";
69 private static final String KEY_SOUND_SETTINGS = "sound_settings";
Daniel Sandler231d8802010-02-17 15:35:21 -050070 private static final String KEY_LOCK_SOUNDS = "lock_sounds";
Amith Yamasani60133dd2010-09-11 14:17:31 -070071 private static final String KEY_RINGTONE = "ringtone";
72 private static final String KEY_NOTIFICATION_SOUND = "notification_sound";
Daisuke Miyakawadba00b62012-05-16 08:41:38 -070073 private static final String KEY_CATEGORY_CALLS = "category_calls_and_notification";
Chris Wren2bc32ae2012-09-24 14:23:46 -040074 private static final String KEY_DOCK_CATEGORY = "dock_category";
Eric Laurente00cd9f2012-10-26 18:55:16 -070075 private static final String KEY_DOCK_AUDIO_SETTINGS = "dock_audio";
Chris Wren2bc32ae2012-09-24 14:23:46 -040076 private static final String KEY_DOCK_SOUNDS = "dock_sounds";
Eric Laurente00cd9f2012-10-26 18:55:16 -070077 private static final String KEY_DOCK_AUDIO_MEDIA_ENABLED = "dock_audio_media_enabled";
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080078
Amith Yamasani60133dd2010-09-11 14:17:31 -070079 private static final String[] NEED_VOICE_CAPABILITY = {
80 KEY_RINGTONE, KEY_DTMF_TONE, KEY_CATEGORY_CALLS,
Henrik Baard2ac8da32013-02-27 08:57:03 +010081 KEY_EMERGENCY_TONE, KEY_VIBRATE
Amith Yamasani60133dd2010-09-11 14:17:31 -070082 };
83
Amith Yamasani823bf0c2011-08-01 15:55:06 -070084 private static final int MSG_UPDATE_RINGTONE_SUMMARY = 1;
85 private static final int MSG_UPDATE_NOTIFICATION_SUMMARY = 2;
86
Daisuke Miyakawa8b878db2012-05-08 12:26:23 -070087 private CheckBoxPreference mVibrateWhenRinging;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080088 private CheckBoxPreference mDtmfTone;
89 private CheckBoxPreference mSoundEffects;
Dan Murphy22e18682009-09-22 11:47:08 -050090 private CheckBoxPreference mHapticFeedback;
Marco Nelissen6eca4b32011-07-15 15:02:03 -070091 private Preference mMusicFx;
Daniel Sandler231d8802010-02-17 15:35:21 -050092 private CheckBoxPreference mLockSounds;
Amith Yamasani823bf0c2011-08-01 15:55:06 -070093 private Preference mRingtonePreference;
94 private Preference mNotificationPreference;
95
96 private Runnable mRingtoneLookupRunnable;
Michael Chandf9504e2009-12-06 01:04:04 -080097
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080098 private AudioManager mAudioManager;
Michael Chandf9504e2009-12-06 01:04:04 -080099
Chris Wren2bc32ae2012-09-24 14:23:46 -0400100 private Preference mDockAudioSettings;
101 private CheckBoxPreference mDockSounds;
102 private Intent mDockIntent;
Eric Laurente00cd9f2012-10-26 18:55:16 -0700103 private CheckBoxPreference mDockAudioMediaEnabled;
Chris Wren2bc32ae2012-09-24 14:23:46 -0400104
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700105 private Handler mHandler = new Handler() {
106 public void handleMessage(Message msg) {
107 switch (msg.what) {
108 case MSG_UPDATE_RINGTONE_SUMMARY:
109 mRingtonePreference.setSummary((CharSequence) msg.obj);
110 break;
111 case MSG_UPDATE_NOTIFICATION_SUMMARY:
112 mNotificationPreference.setSummary((CharSequence) msg.obj);
113 break;
114 }
115 }
116 };
117
Chris Wren2bc32ae2012-09-24 14:23:46 -0400118 private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
119 @Override
120 public void onReceive(Context context, Intent intent) {
121 if (intent.getAction().equals(Intent.ACTION_DOCK_EVENT)) {
122 handleDockChange(intent);
123 }
124 }
125 };
126
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800127 private PreferenceGroup mSoundSettings;
128
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800129 @Override
Amith Yamasanid7993472010-08-18 13:59:28 -0700130 public void onCreate(Bundle savedInstanceState) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800131 super.onCreate(savedInstanceState);
132 ContentResolver resolver = getContentResolver();
Wink Saville327147e2011-02-02 11:30:25 -0800133 int activePhoneType = TelephonyManager.getDefault().getCurrentPhoneType();
Michael Chandf9504e2009-12-06 01:04:04 -0800134
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800135 mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800136
Amith Yamasani992f1022010-01-25 09:17:53 -0800137 addPreferencesFromResource(R.xml.sound_settings);
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800138
Chouting Zhang386278a2009-06-24 14:25:43 -0500139 if (TelephonyManager.PHONE_TYPE_CDMA != activePhoneType) {
140 // device is not CDMA, do not display CDMA emergency_tone
141 getPreferenceScreen().removePreference(findPreference(KEY_EMERGENCY_TONE));
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800142 }
Chouting Zhang386278a2009-06-24 14:25:43 -0500143
Joe Onorato057f1812011-01-12 15:35:47 -0800144 if (!getResources().getBoolean(R.bool.has_silent_mode)) {
Joe Onorato057f1812011-01-12 15:35:47 -0800145 findPreference(KEY_RING_VOLUME).setDependency(null);
146 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800147
Daisuke Miyakawa8b878db2012-05-08 12:26:23 -0700148 mVibrateWhenRinging = (CheckBoxPreference) findPreference(KEY_VIBRATE);
149 mVibrateWhenRinging.setPersistent(false);
150 mVibrateWhenRinging.setChecked(Settings.System.getInt(resolver,
151 Settings.System.VIBRATE_WHEN_RINGING, 0) != 0);
152
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800153 mDtmfTone = (CheckBoxPreference) findPreference(KEY_DTMF_TONE);
154 mDtmfTone.setPersistent(false);
155 mDtmfTone.setChecked(Settings.System.getInt(resolver,
156 Settings.System.DTMF_TONE_WHEN_DIALING, 1) != 0);
157 mSoundEffects = (CheckBoxPreference) findPreference(KEY_SOUND_EFFECTS);
158 mSoundEffects.setPersistent(false);
159 mSoundEffects.setChecked(Settings.System.getInt(resolver,
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700160 Settings.System.SOUND_EFFECTS_ENABLED, 1) != 0);
Dan Murphy22e18682009-09-22 11:47:08 -0500161 mHapticFeedback = (CheckBoxPreference) findPreference(KEY_HAPTIC_FEEDBACK);
162 mHapticFeedback.setPersistent(false);
163 mHapticFeedback.setChecked(Settings.System.getInt(resolver,
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700164 Settings.System.HAPTIC_FEEDBACK_ENABLED, 1) != 0);
Daniel Sandler231d8802010-02-17 15:35:21 -0500165 mLockSounds = (CheckBoxPreference) findPreference(KEY_LOCK_SOUNDS);
166 mLockSounds.setPersistent(false);
167 mLockSounds.setChecked(Settings.System.getInt(resolver,
168 Settings.System.LOCKSCREEN_SOUNDS_ENABLED, 1) != 0);
Chouting Zhang386278a2009-06-24 14:25:43 -0500169
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700170 mRingtonePreference = findPreference(KEY_RINGTONE);
171 mNotificationPreference = findPreference(KEY_NOTIFICATION_SOUND);
172
Daisuke Miyakawa8b878db2012-05-08 12:26:23 -0700173 Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
174 if (vibrator == null || !vibrator.hasVibrator()) {
Amith Yamasanic861cf82012-10-02 14:51:46 -0700175 removePreference(KEY_VIBRATE);
176 removePreference(KEY_HAPTIC_FEEDBACK);
177 }
Amith Yamasaniedac9af2010-11-17 09:08:21 -0800178
Chouting Zhang386278a2009-06-24 14:25:43 -0500179 if (TelephonyManager.PHONE_TYPE_CDMA == activePhoneType) {
180 ListPreference emergencyTonePreference =
181 (ListPreference) findPreference(KEY_EMERGENCY_TONE);
Jeff Sharkeya2c12a62012-10-01 13:39:24 -0700182 emergencyTonePreference.setValue(String.valueOf(Settings.Global.getInt(
183 resolver, Settings.Global.EMERGENCY_TONE, FALLBACK_EMERGENCY_TONE_VALUE)));
Chouting Zhang386278a2009-06-24 14:25:43 -0500184 emergencyTonePreference.setOnPreferenceChangeListener(this);
185 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800186
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800187 mSoundSettings = (PreferenceGroup) findPreference(KEY_SOUND_SETTINGS);
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800188
Marco Nelissen6eca4b32011-07-15 15:02:03 -0700189 mMusicFx = mSoundSettings.findPreference(KEY_MUSICFX);
190 Intent i = new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL);
191 PackageManager p = getPackageManager();
192 List<ResolveInfo> ris = p.queryIntentActivities(i, PackageManager.GET_DISABLED_COMPONENTS);
193 if (ris.size() <= 2) {
194 // no need to show the item if there is no choice for the user to make
195 // note: the built in musicfx panel has two activities (one being a
196 // compatibility shim that launches either the other activity, or a
197 // third party one), hence the check for <=2. If the implementation
198 // of the compatbility layer changes, this check may need to be updated.
199 mSoundSettings.removePreference(mMusicFx);
200 }
201
Amith Yamasani60133dd2010-09-11 14:17:31 -0700202 if (!Utils.isVoiceCapable(getActivity())) {
203 for (String prefKey : NEED_VOICE_CAPABILITY) {
204 Preference pref = findPreference(prefKey);
205 if (pref != null) {
206 getPreferenceScreen().removePreference(pref);
207 }
208 }
209 }
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700210
211 mRingtoneLookupRunnable = new Runnable() {
212 public void run() {
213 if (mRingtonePreference != null) {
214 updateRingtoneName(RingtoneManager.TYPE_RINGTONE, mRingtonePreference,
215 MSG_UPDATE_RINGTONE_SUMMARY);
216 }
217 if (mNotificationPreference != null) {
218 updateRingtoneName(RingtoneManager.TYPE_NOTIFICATION, mNotificationPreference,
219 MSG_UPDATE_NOTIFICATION_SUMMARY);
220 }
221 }
222 };
Chris Wren2bc32ae2012-09-24 14:23:46 -0400223
224 initDockSettings();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800225 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800226
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800227 @Override
Amith Yamasanid7993472010-08-18 13:59:28 -0700228 public void onResume() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800229 super.onResume();
Michael Chandf9504e2009-12-06 01:04:04 -0800230
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700231 lookupRingtoneNames();
Chris Wren2bc32ae2012-09-24 14:23:46 -0400232
233 IntentFilter filter = new IntentFilter(Intent.ACTION_DOCK_EVENT);
234 getActivity().registerReceiver(mReceiver, filter);
235 }
236
237 @Override
238 public void onPause() {
239 super.onPause();
240
241 getActivity().unregisterReceiver(mReceiver);
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700242 }
Michael Chandf9504e2009-12-06 01:04:04 -0800243
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700244 private void updateRingtoneName(int type, Preference preference, int msg) {
245 if (preference == null) return;
246 Context context = getActivity();
247 if (context == null) return;
248 Uri ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, type);
249 CharSequence summary = context.getString(com.android.internal.R.string.ringtone_unknown);
250 // Is it a silent ringtone?
251 if (ringtoneUri == null) {
252 summary = context.getString(com.android.internal.R.string.ringtone_silent);
253 } else {
254 // Fetch the ringtone title from the media provider
255 try {
256 Cursor cursor = context.getContentResolver().query(ringtoneUri,
257 new String[] { MediaStore.Audio.Media.TITLE }, null, null, null);
Amith Yamasanic86755b2011-10-04 15:00:21 -0700258 if (cursor != null) {
259 if (cursor.moveToFirst()) {
260 summary = cursor.getString(0);
261 }
262 cursor.close();
Amith Yamasani823bf0c2011-08-01 15:55:06 -0700263 }
264 } catch (SQLiteException sqle) {
265 // Unknown title for the ringtone
266 }
267 }
268 mHandler.sendMessage(mHandler.obtainMessage(msg, summary));
269 }
270
271 private void lookupRingtoneNames() {
272 new Thread(mRingtoneLookupRunnable).start();
Dianne Hackborn76315392009-09-03 13:33:55 -0700273 }
Michael Chandf9504e2009-12-06 01:04:04 -0800274
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800275 @Override
276 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
Daisuke Miyakawa8b878db2012-05-08 12:26:23 -0700277 if (preference == mVibrateWhenRinging) {
278 Settings.System.putInt(getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING,
279 mVibrateWhenRinging.isChecked() ? 1 : 0);
280 } else if (preference == mDtmfTone) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800281 Settings.System.putInt(getContentResolver(), Settings.System.DTMF_TONE_WHEN_DIALING,
282 mDtmfTone.isChecked() ? 1 : 0);
Michael Chandf9504e2009-12-06 01:04:04 -0800283
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800284 } else if (preference == mSoundEffects) {
285 if (mSoundEffects.isChecked()) {
286 mAudioManager.loadSoundEffects();
287 } else {
288 mAudioManager.unloadSoundEffects();
289 }
290 Settings.System.putInt(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED,
291 mSoundEffects.isChecked() ? 1 : 0);
Dan Murphy22e18682009-09-22 11:47:08 -0500292
293 } else if (preference == mHapticFeedback) {
294 Settings.System.putInt(getContentResolver(), Settings.System.HAPTIC_FEEDBACK_ENABLED,
295 mHapticFeedback.isChecked() ? 1 : 0);
Michael Chandf9504e2009-12-06 01:04:04 -0800296
Daniel Sandler231d8802010-02-17 15:35:21 -0500297 } else if (preference == mLockSounds) {
298 Settings.System.putInt(getContentResolver(), Settings.System.LOCKSCREEN_SOUNDS_ENABLED,
299 mLockSounds.isChecked() ? 1 : 0);
300
Marco Nelissen6eca4b32011-07-15 15:02:03 -0700301 } else if (preference == mMusicFx) {
302 // let the framework fire off the intent
303 return false;
Chris Wren2bc32ae2012-09-24 14:23:46 -0400304 } else if (preference == mDockAudioSettings) {
305 int dockState = mDockIntent != null
306 ? mDockIntent.getIntExtra(Intent.EXTRA_DOCK_STATE, 0)
307 : Intent.EXTRA_DOCK_STATE_UNDOCKED;
Eric Laurente00cd9f2012-10-26 18:55:16 -0700308
Chris Wren2bc32ae2012-09-24 14:23:46 -0400309 if (dockState == Intent.EXTRA_DOCK_STATE_UNDOCKED) {
310 showDialog(DIALOG_NOT_DOCKED);
311 } else {
Eric Laurente00cd9f2012-10-26 18:55:16 -0700312 boolean isBluetooth = mDockIntent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) != null;
313
314 if (isBluetooth) {
315 Intent i = new Intent(mDockIntent);
316 i.setAction(DockEventReceiver.ACTION_DOCK_SHOW_UI);
317 i.setClass(getActivity(), DockEventReceiver.class);
318 getActivity().sendBroadcast(i);
319 } else {
320 PreferenceScreen ps = (PreferenceScreen)mDockAudioSettings;
321 Bundle extras = ps.getExtras();
322 extras.putBoolean("checked",
323 Settings.Global.getInt(getContentResolver(),
324 Settings.Global.DOCK_AUDIO_MEDIA_ENABLED, 0) == 1);
325 super.onPreferenceTreeClick(ps, ps);
326 }
Chris Wren2bc32ae2012-09-24 14:23:46 -0400327 }
328 } else if (preference == mDockSounds) {
Jeff Sharkey860eceb2012-10-18 15:38:42 -0700329 Settings.Global.putInt(getContentResolver(), Settings.Global.DOCK_SOUNDS_ENABLED,
Chris Wren2bc32ae2012-09-24 14:23:46 -0400330 mDockSounds.isChecked() ? 1 : 0);
Eric Laurente00cd9f2012-10-26 18:55:16 -0700331 } else if (preference == mDockAudioMediaEnabled) {
332 Settings.Global.putInt(getContentResolver(), Settings.Global.DOCK_AUDIO_MEDIA_ENABLED,
333 mDockAudioMediaEnabled.isChecked() ? 1 : 0);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800334 }
335 return true;
336 }
337
338 public boolean onPreferenceChange(Preference preference, Object objValue) {
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800339 final String key = preference.getKey();
Amith Yamasani992f1022010-01-25 09:17:53 -0800340 if (KEY_EMERGENCY_TONE.equals(key)) {
Chouting Zhang386278a2009-06-24 14:25:43 -0500341 try {
Peter Kuterna378b6f62010-11-28 22:35:31 +0100342 int value = Integer.parseInt((String) objValue);
Jeff Sharkeya2c12a62012-10-01 13:39:24 -0700343 Settings.Global.putInt(getContentResolver(),
344 Settings.Global.EMERGENCY_TONE, value);
Chouting Zhang386278a2009-06-24 14:25:43 -0500345 } catch (NumberFormatException e) {
346 Log.e(TAG, "could not persist emergency tone setting", e);
347 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800348 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800349
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800350 return true;
351 }
Amith Yamasanib0b37ae2012-04-23 15:35:36 -0700352
353 @Override
354 protected int getHelpResource() {
355 return R.string.help_url_sound;
356 }
Chris Wren2bc32ae2012-09-24 14:23:46 -0400357
358 private boolean needsDockSettings() {
359 return getResources().getBoolean(R.bool.has_dock_settings);
360 }
361
362 private void initDockSettings() {
Eric Laurente00cd9f2012-10-26 18:55:16 -0700363 ContentResolver resolver = getContentResolver();
364
Chris Wren2bc32ae2012-09-24 14:23:46 -0400365 if (needsDockSettings()) {
Chris Wren2bc32ae2012-09-24 14:23:46 -0400366 mDockSounds = (CheckBoxPreference) findPreference(KEY_DOCK_SOUNDS);
367 mDockSounds.setPersistent(false);
Jeff Sharkey860eceb2012-10-18 15:38:42 -0700368 mDockSounds.setChecked(Settings.Global.getInt(resolver,
369 Settings.Global.DOCK_SOUNDS_ENABLED, 0) != 0);
Eric Laurente00cd9f2012-10-26 18:55:16 -0700370 mDockAudioSettings = findPreference(KEY_DOCK_AUDIO_SETTINGS);
371 mDockAudioSettings.setEnabled(false);
Chris Wren2bc32ae2012-09-24 14:23:46 -0400372 } else {
373 getPreferenceScreen().removePreference(findPreference(KEY_DOCK_CATEGORY));
Eric Laurente00cd9f2012-10-26 18:55:16 -0700374 getPreferenceScreen().removePreference(findPreference(KEY_DOCK_AUDIO_SETTINGS));
Chris Wren2bc32ae2012-09-24 14:23:46 -0400375 getPreferenceScreen().removePreference(findPreference(KEY_DOCK_SOUNDS));
Eric Laurente00cd9f2012-10-26 18:55:16 -0700376 Settings.Global.putInt(resolver, Settings.Global.DOCK_AUDIO_MEDIA_ENABLED, 1);
Chris Wren2bc32ae2012-09-24 14:23:46 -0400377 }
378 }
379
380 private void handleDockChange(Intent intent) {
381 if (mDockAudioSettings != null) {
382 int dockState = intent.getIntExtra(Intent.EXTRA_DOCK_STATE, 0);
383
Eric Laurente00cd9f2012-10-26 18:55:16 -0700384 boolean isBluetooth =
385 intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) != null;
Chris Wren2bc32ae2012-09-24 14:23:46 -0400386
Eric Laurente00cd9f2012-10-26 18:55:16 -0700387 mDockIntent = intent;
Chris Wren2bc32ae2012-09-24 14:23:46 -0400388
389 if (dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED) {
390 // remove undocked dialog if currently showing.
391 try {
392 removeDialog(DIALOG_NOT_DOCKED);
393 } catch (IllegalArgumentException iae) {
394 // Maybe it was already dismissed
395 }
Eric Laurente00cd9f2012-10-26 18:55:16 -0700396
397 if (isBluetooth) {
398 mDockAudioSettings.setEnabled(true);
399 } else {
400 if (dockState == Intent.EXTRA_DOCK_STATE_LE_DESK) {
401 ContentResolver resolver = getContentResolver();
402 mDockAudioSettings.setEnabled(true);
403 if (Settings.Global.getInt(resolver,
404 Settings.Global.DOCK_AUDIO_MEDIA_ENABLED, -1) == -1) {
405 Settings.Global.putInt(resolver,
406 Settings.Global.DOCK_AUDIO_MEDIA_ENABLED, 0);
407 }
408 mDockAudioMediaEnabled =
409 (CheckBoxPreference) findPreference(KEY_DOCK_AUDIO_MEDIA_ENABLED);
410 mDockAudioMediaEnabled.setPersistent(false);
411 mDockAudioMediaEnabled.setChecked(
412 Settings.Global.getInt(resolver,
413 Settings.Global.DOCK_AUDIO_MEDIA_ENABLED, 0) != 0);
414 } else {
415 mDockAudioSettings.setEnabled(false);
416 }
417 }
418 } else {
419 mDockAudioSettings.setEnabled(false);
Chris Wren2bc32ae2012-09-24 14:23:46 -0400420 }
421 }
422 }
423
424 @Override
425 public Dialog onCreateDialog(int id) {
426 if (id == DIALOG_NOT_DOCKED) {
427 return createUndockedMessage();
428 }
429 return null;
430 }
431
432 private Dialog createUndockedMessage() {
433 final AlertDialog.Builder ab = new AlertDialog.Builder(getActivity());
434 ab.setTitle(R.string.dock_not_found_title);
435 ab.setMessage(R.string.dock_not_found_text);
436 ab.setPositiveButton(android.R.string.ok, null);
437 return ab.create();
438 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800439}
Chris Wren2bc32ae2012-09-24 14:23:46 -0400440