blob: 2070519d1e94835fb931a3095fb68010018953dc [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
19import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
Michael Chan0bd445b2009-12-03 00:31:59 -080020
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080021import android.content.BroadcastReceiver;
22import android.content.ContentResolver;
23import android.content.Context;
24import android.content.Intent;
25import android.content.IntentFilter;
26import android.media.AudioManager;
27import android.os.Bundle;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080028import android.os.RemoteException;
29import android.os.ServiceManager;
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080030import android.preference.CheckBoxPreference;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080031import android.preference.ListPreference;
32import android.preference.Preference;
33import android.preference.PreferenceActivity;
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080034import android.preference.PreferenceGroup;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080035import android.preference.PreferenceScreen;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080036import android.provider.Settings;
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080037import android.provider.Settings.SettingNotFoundException;
38import android.telephony.TelephonyManager;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080039import android.util.Log;
40import android.view.IWindowManager;
41
Amith Yamasani992f1022010-01-25 09:17:53 -080042public class SoundSettings extends PreferenceActivity implements
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080043 Preference.OnPreferenceChangeListener {
44 private static final String TAG = "SoundAndDisplaysSettings";
45
46 /** If there is no setting in the provider, use this. */
47 private static final int FALLBACK_SCREEN_TIMEOUT_VALUE = 30000;
Chouting Zhang386278a2009-06-24 14:25:43 -050048 private static final int FALLBACK_EMERGENCY_TONE_VALUE = 0;
Michael Chandf9504e2009-12-06 01:04:04 -080049
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080050 private static final String KEY_SILENT = "silent";
51 private static final String KEY_VIBRATE = "vibrate";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080052 private static final String KEY_DTMF_TONE = "dtmf_tone";
53 private static final String KEY_SOUND_EFFECTS = "sound_effects";
Dan Murphy22e18682009-09-22 11:47:08 -050054 private static final String KEY_HAPTIC_FEEDBACK = "haptic_feedback";
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080055 private static final String KEY_EMERGENCY_TONE = "emergency_tone";
56 private static final String KEY_SOUND_SETTINGS = "sound_settings";
57 private static final String KEY_NOTIFICATION_PULSE = "notification_pulse";
Daniel Sandler231d8802010-02-17 15:35:21 -050058 private static final String KEY_LOCK_SOUNDS = "lock_sounds";
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080059
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080060 private CheckBoxPreference mSilent;
61
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080062 /*
63 * If we are currently in one of the silent modes (the ringer mode is set to either
64 * "silent mode" or "vibrate mode"), then toggling the "Phone vibrate"
65 * preference will switch between "silent mode" and "vibrate mode".
66 * Otherwise, it will adjust the normal ringer mode's ring or ring+vibrate
67 * setting.
68 */
69 private CheckBoxPreference mVibrate;
70 private CheckBoxPreference mDtmfTone;
71 private CheckBoxPreference mSoundEffects;
Dan Murphy22e18682009-09-22 11:47:08 -050072 private CheckBoxPreference mHapticFeedback;
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080073 private CheckBoxPreference mNotificationPulse;
Daniel Sandler231d8802010-02-17 15:35:21 -050074 private CheckBoxPreference mLockSounds;
Michael Chandf9504e2009-12-06 01:04:04 -080075
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080076 private AudioManager mAudioManager;
Michael Chandf9504e2009-12-06 01:04:04 -080077
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080078 private BroadcastReceiver mReceiver = new BroadcastReceiver() {
79 @Override
80 public void onReceive(Context context, Intent intent) {
Amith Yamasanid2b3ab02009-12-02 13:56:05 -080081 if (intent.getAction().equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) {
82 updateState(false);
Amith Yamasanid2b3ab02009-12-02 13:56:05 -080083 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080084 }
85 };
86
Amith Yamasanid2b3ab02009-12-02 13:56:05 -080087 private PreferenceGroup mSoundSettings;
88
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080089 @Override
90 protected void onCreate(Bundle savedInstanceState) {
91 super.onCreate(savedInstanceState);
92 ContentResolver resolver = getContentResolver();
Chouting Zhang386278a2009-06-24 14:25:43 -050093 int activePhoneType = TelephonyManager.getDefault().getPhoneType();
Michael Chandf9504e2009-12-06 01:04:04 -080094
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080095 mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080096
Amith Yamasani992f1022010-01-25 09:17:53 -080097 addPreferencesFromResource(R.xml.sound_settings);
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080098
Chouting Zhang386278a2009-06-24 14:25:43 -050099 if (TelephonyManager.PHONE_TYPE_CDMA != activePhoneType) {
100 // device is not CDMA, do not display CDMA emergency_tone
101 getPreferenceScreen().removePreference(findPreference(KEY_EMERGENCY_TONE));
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800102 }
Chouting Zhang386278a2009-06-24 14:25:43 -0500103
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800104 mSilent = (CheckBoxPreference) findPreference(KEY_SILENT);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800105
106 mVibrate = (CheckBoxPreference) findPreference(KEY_VIBRATE);
107 mDtmfTone = (CheckBoxPreference) findPreference(KEY_DTMF_TONE);
108 mDtmfTone.setPersistent(false);
109 mDtmfTone.setChecked(Settings.System.getInt(resolver,
110 Settings.System.DTMF_TONE_WHEN_DIALING, 1) != 0);
111 mSoundEffects = (CheckBoxPreference) findPreference(KEY_SOUND_EFFECTS);
112 mSoundEffects.setPersistent(false);
113 mSoundEffects.setChecked(Settings.System.getInt(resolver,
114 Settings.System.SOUND_EFFECTS_ENABLED, 0) != 0);
Dan Murphy22e18682009-09-22 11:47:08 -0500115 mHapticFeedback = (CheckBoxPreference) findPreference(KEY_HAPTIC_FEEDBACK);
116 mHapticFeedback.setPersistent(false);
117 mHapticFeedback.setChecked(Settings.System.getInt(resolver,
118 Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) != 0);
Daniel Sandler231d8802010-02-17 15:35:21 -0500119 mLockSounds = (CheckBoxPreference) findPreference(KEY_LOCK_SOUNDS);
120 mLockSounds.setPersistent(false);
121 mLockSounds.setChecked(Settings.System.getInt(resolver,
122 Settings.System.LOCKSCREEN_SOUNDS_ENABLED, 1) != 0);
Chouting Zhang386278a2009-06-24 14:25:43 -0500123
124 if (TelephonyManager.PHONE_TYPE_CDMA == activePhoneType) {
125 ListPreference emergencyTonePreference =
126 (ListPreference) findPreference(KEY_EMERGENCY_TONE);
127 emergencyTonePreference.setValue(String.valueOf(Settings.System.getInt(
128 resolver, Settings.System.EMERGENCY_TONE, FALLBACK_EMERGENCY_TONE_VALUE)));
129 emergencyTonePreference.setOnPreferenceChangeListener(this);
130 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800131
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800132 mSoundSettings = (PreferenceGroup) findPreference(KEY_SOUND_SETTINGS);
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800133 mNotificationPulse = (CheckBoxPreference)
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800134 mSoundSettings.findPreference(KEY_NOTIFICATION_PULSE);
135 if (mNotificationPulse != null &&
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800136 getResources().getBoolean(R.bool.has_intrusive_led) == false) {
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800137 mSoundSettings.removePreference(mNotificationPulse);
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800138 } else {
139 try {
140 mNotificationPulse.setChecked(Settings.System.getInt(resolver,
141 Settings.System.NOTIFICATION_LIGHT_PULSE) == 1);
142 mNotificationPulse.setOnPreferenceChangeListener(this);
143 } catch (SettingNotFoundException snfe) {
144 Log.e(TAG, Settings.System.NOTIFICATION_LIGHT_PULSE + " not found");
145 }
146 }
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800147
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800148 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800149
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800150 @Override
151 protected void onResume() {
152 super.onResume();
Michael Chandf9504e2009-12-06 01:04:04 -0800153
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800154 updateState(true);
Michael Chandf9504e2009-12-06 01:04:04 -0800155
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800156 IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION);
157 registerReceiver(mReceiver, filter);
158 }
159
160 @Override
161 protected void onPause() {
162 super.onPause();
163
164 unregisterReceiver(mReceiver);
165 }
166
167 private void updateState(boolean force) {
168 final int ringerMode = mAudioManager.getRingerMode();
169 final boolean silentOrVibrateMode =
170 ringerMode != AudioManager.RINGER_MODE_NORMAL;
Michael Chandf9504e2009-12-06 01:04:04 -0800171
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800172 if (silentOrVibrateMode != mSilent.isChecked() || force) {
173 mSilent.setChecked(silentOrVibrateMode);
174 }
175
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800176 boolean vibrateSetting;
177 if (silentOrVibrateMode) {
178 vibrateSetting = ringerMode == AudioManager.RINGER_MODE_VIBRATE;
179 } else {
180 vibrateSetting = mAudioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER)
Michael Chandf9504e2009-12-06 01:04:04 -0800181 == AudioManager.VIBRATE_SETTING_ON;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800182 }
183 if (vibrateSetting != mVibrate.isChecked() || force) {
184 mVibrate.setChecked(vibrateSetting);
185 }
Michael Chandf9504e2009-12-06 01:04:04 -0800186
Jason Parekh2c9b3262009-03-24 17:48:28 -0700187 int silentModeStreams = Settings.System.getInt(getContentResolver(),
188 Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
Michael Chandf9504e2009-12-06 01:04:04 -0800189 boolean isAlarmInclSilentMode = (silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0;
Jason Parekh2c9b3262009-03-24 17:48:28 -0700190 mSilent.setSummary(isAlarmInclSilentMode ?
191 R.string.silent_mode_incl_alarm_summary :
192 R.string.silent_mode_summary);
Michael Chandf9504e2009-12-06 01:04:04 -0800193
Dianne Hackborn76315392009-09-03 13:33:55 -0700194 }
Michael Chandf9504e2009-12-06 01:04:04 -0800195
Amith Yamasanieb72bcd2009-07-07 11:37:08 -0700196 private void setRingerMode(boolean silent, boolean vibrate) {
197 if (silent) {
198 mAudioManager.setRingerMode(vibrate ? AudioManager.RINGER_MODE_VIBRATE :
199 AudioManager.RINGER_MODE_SILENT);
200 } else {
201 mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
202 mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
203 vibrate ? AudioManager.VIBRATE_SETTING_ON
204 : AudioManager.VIBRATE_SETTING_OFF);
205 }
206 }
207
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800208 @Override
209 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
Amith Yamasanieb72bcd2009-07-07 11:37:08 -0700210 if (preference == mSilent || preference == mVibrate) {
211 setRingerMode(mSilent.isChecked(), mVibrate.isChecked());
212 if (preference == mSilent) updateState(false);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800213 } else if (preference == mDtmfTone) {
214 Settings.System.putInt(getContentResolver(), Settings.System.DTMF_TONE_WHEN_DIALING,
215 mDtmfTone.isChecked() ? 1 : 0);
Michael Chandf9504e2009-12-06 01:04:04 -0800216
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800217 } else if (preference == mSoundEffects) {
218 if (mSoundEffects.isChecked()) {
219 mAudioManager.loadSoundEffects();
220 } else {
221 mAudioManager.unloadSoundEffects();
222 }
223 Settings.System.putInt(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED,
224 mSoundEffects.isChecked() ? 1 : 0);
Dan Murphy22e18682009-09-22 11:47:08 -0500225
226 } else if (preference == mHapticFeedback) {
227 Settings.System.putInt(getContentResolver(), Settings.System.HAPTIC_FEEDBACK_ENABLED,
228 mHapticFeedback.isChecked() ? 1 : 0);
Michael Chandf9504e2009-12-06 01:04:04 -0800229
Daniel Sandler231d8802010-02-17 15:35:21 -0500230 } else if (preference == mLockSounds) {
231 Settings.System.putInt(getContentResolver(), Settings.System.LOCKSCREEN_SOUNDS_ENABLED,
232 mLockSounds.isChecked() ? 1 : 0);
233
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800234 } else if (preference == mNotificationPulse) {
235 boolean value = mNotificationPulse.isChecked();
236 Settings.System.putInt(getContentResolver(),
237 Settings.System.NOTIFICATION_LIGHT_PULSE, value ? 1 : 0);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800238 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800239
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800240 return true;
241 }
242
243 public boolean onPreferenceChange(Preference preference, Object objValue) {
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800244 final String key = preference.getKey();
Amith Yamasani992f1022010-01-25 09:17:53 -0800245 if (KEY_EMERGENCY_TONE.equals(key)) {
Chouting Zhang386278a2009-06-24 14:25:43 -0500246 int value = Integer.parseInt((String) objValue);
247 try {
248 Settings.System.putInt(getContentResolver(),
249 Settings.System.EMERGENCY_TONE, value);
250 } catch (NumberFormatException e) {
251 Log.e(TAG, "could not persist emergency tone setting", e);
252 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800253 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800254
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800255 return true;
256 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800257}