blob: 9ac2fe1f12a27c264cda846d06629d90444100ad [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;
28import android.os.IMountService;
29import android.os.RemoteException;
30import android.os.ServiceManager;
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080031import android.preference.CheckBoxPreference;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080032import android.preference.ListPreference;
33import android.preference.Preference;
34import android.preference.PreferenceActivity;
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080035import android.preference.PreferenceGroup;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080036import android.preference.PreferenceScreen;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080037import android.provider.Settings;
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080038import android.provider.Settings.SettingNotFoundException;
39import android.telephony.TelephonyManager;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080040import android.util.Log;
41import android.view.IWindowManager;
42
Amith Yamasani992f1022010-01-25 09:17:53 -080043public class SoundSettings extends PreferenceActivity implements
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080044 Preference.OnPreferenceChangeListener {
45 private static final String TAG = "SoundAndDisplaysSettings";
46
47 /** If there is no setting in the provider, use this. */
48 private static final int FALLBACK_SCREEN_TIMEOUT_VALUE = 30000;
Chouting Zhang386278a2009-06-24 14:25:43 -050049 private static final int FALLBACK_EMERGENCY_TONE_VALUE = 0;
Michael Chandf9504e2009-12-06 01:04:04 -080050
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080051 private static final String KEY_SILENT = "silent";
52 private static final String KEY_VIBRATE = "vibrate";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080053 private static final String KEY_DTMF_TONE = "dtmf_tone";
54 private static final String KEY_SOUND_EFFECTS = "sound_effects";
Dan Murphy22e18682009-09-22 11:47:08 -050055 private static final String KEY_HAPTIC_FEEDBACK = "haptic_feedback";
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080056 private static final String KEY_PLAY_MEDIA_NOTIFICATION_SOUNDS =
57 "play_media_notification_sounds";
58 private static final String KEY_EMERGENCY_TONE = "emergency_tone";
59 private static final String KEY_SOUND_SETTINGS = "sound_settings";
60 private static final String KEY_NOTIFICATION_PULSE = "notification_pulse";
61
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080062 private CheckBoxPreference mSilent;
63
64 private CheckBoxPreference mPlayMediaNotificationSounds;
65
66 private IMountService mMountService = null;
67
68 /*
69 * If we are currently in one of the silent modes (the ringer mode is set to either
70 * "silent mode" or "vibrate mode"), then toggling the "Phone vibrate"
71 * preference will switch between "silent mode" and "vibrate mode".
72 * Otherwise, it will adjust the normal ringer mode's ring or ring+vibrate
73 * setting.
74 */
75 private CheckBoxPreference mVibrate;
76 private CheckBoxPreference mDtmfTone;
77 private CheckBoxPreference mSoundEffects;
Dan Murphy22e18682009-09-22 11:47:08 -050078 private CheckBoxPreference mHapticFeedback;
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080079 private CheckBoxPreference mNotificationPulse;
Michael Chandf9504e2009-12-06 01:04:04 -080080
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080081 private AudioManager mAudioManager;
Michael Chandf9504e2009-12-06 01:04:04 -080082
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080083 private BroadcastReceiver mReceiver = new BroadcastReceiver() {
84 @Override
85 public void onReceive(Context context, Intent intent) {
Amith Yamasanid2b3ab02009-12-02 13:56:05 -080086 if (intent.getAction().equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) {
87 updateState(false);
Amith Yamasanid2b3ab02009-12-02 13:56:05 -080088 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080089 }
90 };
91
Amith Yamasanid2b3ab02009-12-02 13:56:05 -080092 private PreferenceGroup mSoundSettings;
93
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080094 @Override
95 protected void onCreate(Bundle savedInstanceState) {
96 super.onCreate(savedInstanceState);
97 ContentResolver resolver = getContentResolver();
Chouting Zhang386278a2009-06-24 14:25:43 -050098 int activePhoneType = TelephonyManager.getDefault().getPhoneType();
Michael Chandf9504e2009-12-06 01:04:04 -080099
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800100 mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800101
102 mMountService = IMountService.Stub.asInterface(ServiceManager.getService("mount"));
Michael Chandf9504e2009-12-06 01:04:04 -0800103
Amith Yamasani992f1022010-01-25 09:17:53 -0800104 addPreferencesFromResource(R.xml.sound_settings);
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800105
Chouting Zhang386278a2009-06-24 14:25:43 -0500106 if (TelephonyManager.PHONE_TYPE_CDMA != activePhoneType) {
107 // device is not CDMA, do not display CDMA emergency_tone
108 getPreferenceScreen().removePreference(findPreference(KEY_EMERGENCY_TONE));
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800109 }
Chouting Zhang386278a2009-06-24 14:25:43 -0500110
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800111 mSilent = (CheckBoxPreference) findPreference(KEY_SILENT);
112 mPlayMediaNotificationSounds = (CheckBoxPreference) findPreference(KEY_PLAY_MEDIA_NOTIFICATION_SOUNDS);
113
114 mVibrate = (CheckBoxPreference) findPreference(KEY_VIBRATE);
115 mDtmfTone = (CheckBoxPreference) findPreference(KEY_DTMF_TONE);
116 mDtmfTone.setPersistent(false);
117 mDtmfTone.setChecked(Settings.System.getInt(resolver,
118 Settings.System.DTMF_TONE_WHEN_DIALING, 1) != 0);
119 mSoundEffects = (CheckBoxPreference) findPreference(KEY_SOUND_EFFECTS);
120 mSoundEffects.setPersistent(false);
121 mSoundEffects.setChecked(Settings.System.getInt(resolver,
122 Settings.System.SOUND_EFFECTS_ENABLED, 0) != 0);
Dan Murphy22e18682009-09-22 11:47:08 -0500123 mHapticFeedback = (CheckBoxPreference) findPreference(KEY_HAPTIC_FEEDBACK);
124 mHapticFeedback.setPersistent(false);
125 mHapticFeedback.setChecked(Settings.System.getInt(resolver,
126 Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) != 0);
Chouting Zhang386278a2009-06-24 14:25:43 -0500127
128 if (TelephonyManager.PHONE_TYPE_CDMA == activePhoneType) {
129 ListPreference emergencyTonePreference =
130 (ListPreference) findPreference(KEY_EMERGENCY_TONE);
131 emergencyTonePreference.setValue(String.valueOf(Settings.System.getInt(
132 resolver, Settings.System.EMERGENCY_TONE, FALLBACK_EMERGENCY_TONE_VALUE)));
133 emergencyTonePreference.setOnPreferenceChangeListener(this);
134 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800135
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800136 mSoundSettings = (PreferenceGroup) findPreference(KEY_SOUND_SETTINGS);
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800137 mNotificationPulse = (CheckBoxPreference)
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800138 mSoundSettings.findPreference(KEY_NOTIFICATION_PULSE);
139 if (mNotificationPulse != null &&
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800140 getResources().getBoolean(R.bool.has_intrusive_led) == false) {
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800141 mSoundSettings.removePreference(mNotificationPulse);
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800142 } else {
143 try {
144 mNotificationPulse.setChecked(Settings.System.getInt(resolver,
145 Settings.System.NOTIFICATION_LIGHT_PULSE) == 1);
146 mNotificationPulse.setOnPreferenceChangeListener(this);
147 } catch (SettingNotFoundException snfe) {
148 Log.e(TAG, Settings.System.NOTIFICATION_LIGHT_PULSE + " not found");
149 }
150 }
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800151
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800152 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800153
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800154 @Override
155 protected void onResume() {
156 super.onResume();
Michael Chandf9504e2009-12-06 01:04:04 -0800157
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800158 updateState(true);
Michael Chandf9504e2009-12-06 01:04:04 -0800159
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800160 IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION);
161 registerReceiver(mReceiver, filter);
162 }
163
164 @Override
165 protected void onPause() {
166 super.onPause();
167
168 unregisterReceiver(mReceiver);
169 }
170
171 private void updateState(boolean force) {
172 final int ringerMode = mAudioManager.getRingerMode();
173 final boolean silentOrVibrateMode =
174 ringerMode != AudioManager.RINGER_MODE_NORMAL;
Michael Chandf9504e2009-12-06 01:04:04 -0800175
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800176 if (silentOrVibrateMode != mSilent.isChecked() || force) {
177 mSilent.setChecked(silentOrVibrateMode);
178 }
179
180 try {
181 mPlayMediaNotificationSounds.setChecked(mMountService.getPlayNotificationSounds());
182 } catch (RemoteException e) {
183 }
Michael Chandf9504e2009-12-06 01:04:04 -0800184
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800185 boolean vibrateSetting;
186 if (silentOrVibrateMode) {
187 vibrateSetting = ringerMode == AudioManager.RINGER_MODE_VIBRATE;
188 } else {
189 vibrateSetting = mAudioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER)
Michael Chandf9504e2009-12-06 01:04:04 -0800190 == AudioManager.VIBRATE_SETTING_ON;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800191 }
192 if (vibrateSetting != mVibrate.isChecked() || force) {
193 mVibrate.setChecked(vibrateSetting);
194 }
Michael Chandf9504e2009-12-06 01:04:04 -0800195
Jason Parekh2c9b3262009-03-24 17:48:28 -0700196 int silentModeStreams = Settings.System.getInt(getContentResolver(),
197 Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
Michael Chandf9504e2009-12-06 01:04:04 -0800198 boolean isAlarmInclSilentMode = (silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0;
Jason Parekh2c9b3262009-03-24 17:48:28 -0700199 mSilent.setSummary(isAlarmInclSilentMode ?
200 R.string.silent_mode_incl_alarm_summary :
201 R.string.silent_mode_summary);
Michael Chandf9504e2009-12-06 01:04:04 -0800202
Dianne Hackborn76315392009-09-03 13:33:55 -0700203 }
Michael Chandf9504e2009-12-06 01:04:04 -0800204
Amith Yamasanieb72bcd2009-07-07 11:37:08 -0700205 private void setRingerMode(boolean silent, boolean vibrate) {
206 if (silent) {
207 mAudioManager.setRingerMode(vibrate ? AudioManager.RINGER_MODE_VIBRATE :
208 AudioManager.RINGER_MODE_SILENT);
209 } else {
210 mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
211 mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
212 vibrate ? AudioManager.VIBRATE_SETTING_ON
213 : AudioManager.VIBRATE_SETTING_OFF);
214 }
215 }
216
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800217 @Override
218 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
Amith Yamasanieb72bcd2009-07-07 11:37:08 -0700219 if (preference == mSilent || preference == mVibrate) {
220 setRingerMode(mSilent.isChecked(), mVibrate.isChecked());
221 if (preference == mSilent) updateState(false);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800222 } else if (preference == mPlayMediaNotificationSounds) {
223 try {
224 mMountService.setPlayNotificationSounds(mPlayMediaNotificationSounds.isChecked());
225 } catch (RemoteException e) {
226 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800227 } else if (preference == mDtmfTone) {
228 Settings.System.putInt(getContentResolver(), Settings.System.DTMF_TONE_WHEN_DIALING,
229 mDtmfTone.isChecked() ? 1 : 0);
Michael Chandf9504e2009-12-06 01:04:04 -0800230
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800231 } else if (preference == mSoundEffects) {
232 if (mSoundEffects.isChecked()) {
233 mAudioManager.loadSoundEffects();
234 } else {
235 mAudioManager.unloadSoundEffects();
236 }
237 Settings.System.putInt(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED,
238 mSoundEffects.isChecked() ? 1 : 0);
Dan Murphy22e18682009-09-22 11:47:08 -0500239
240 } else if (preference == mHapticFeedback) {
241 Settings.System.putInt(getContentResolver(), Settings.System.HAPTIC_FEEDBACK_ENABLED,
242 mHapticFeedback.isChecked() ? 1 : 0);
Michael Chandf9504e2009-12-06 01:04:04 -0800243
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800244 } else if (preference == mNotificationPulse) {
245 boolean value = mNotificationPulse.isChecked();
246 Settings.System.putInt(getContentResolver(),
247 Settings.System.NOTIFICATION_LIGHT_PULSE, value ? 1 : 0);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800248 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800249
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800250 return true;
251 }
252
253 public boolean onPreferenceChange(Preference preference, Object objValue) {
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800254 final String key = preference.getKey();
Amith Yamasani992f1022010-01-25 09:17:53 -0800255 if (KEY_EMERGENCY_TONE.equals(key)) {
Chouting Zhang386278a2009-06-24 14:25:43 -0500256 int value = Integer.parseInt((String) objValue);
257 try {
258 Settings.System.putInt(getContentResolver(),
259 Settings.System.EMERGENCY_TONE, value);
260 } catch (NumberFormatException e) {
261 Log.e(TAG, "could not persist emergency tone setting", e);
262 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800263 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800264
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800265 return true;
266 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800267}