blob: 52947ac5207f90c005c0b34bf06008f193053497 [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";
58
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080059 private CheckBoxPreference mSilent;
60
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080061 /*
62 * If we are currently in one of the silent modes (the ringer mode is set to either
63 * "silent mode" or "vibrate mode"), then toggling the "Phone vibrate"
64 * preference will switch between "silent mode" and "vibrate mode".
65 * Otherwise, it will adjust the normal ringer mode's ring or ring+vibrate
66 * setting.
67 */
68 private CheckBoxPreference mVibrate;
69 private CheckBoxPreference mDtmfTone;
70 private CheckBoxPreference mSoundEffects;
Dan Murphy22e18682009-09-22 11:47:08 -050071 private CheckBoxPreference mHapticFeedback;
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080072 private CheckBoxPreference mNotificationPulse;
Michael Chandf9504e2009-12-06 01:04:04 -080073
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080074 private AudioManager mAudioManager;
Michael Chandf9504e2009-12-06 01:04:04 -080075
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080076 private BroadcastReceiver mReceiver = new BroadcastReceiver() {
77 @Override
78 public void onReceive(Context context, Intent intent) {
Amith Yamasanid2b3ab02009-12-02 13:56:05 -080079 if (intent.getAction().equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) {
80 updateState(false);
Amith Yamasanid2b3ab02009-12-02 13:56:05 -080081 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080082 }
83 };
84
Amith Yamasanid2b3ab02009-12-02 13:56:05 -080085 private PreferenceGroup mSoundSettings;
86
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080087 @Override
88 protected void onCreate(Bundle savedInstanceState) {
89 super.onCreate(savedInstanceState);
90 ContentResolver resolver = getContentResolver();
Chouting Zhang386278a2009-06-24 14:25:43 -050091 int activePhoneType = TelephonyManager.getDefault().getPhoneType();
Michael Chandf9504e2009-12-06 01:04:04 -080092
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080093 mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080094
Amith Yamasani992f1022010-01-25 09:17:53 -080095 addPreferencesFromResource(R.xml.sound_settings);
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -080096
Chouting Zhang386278a2009-06-24 14:25:43 -050097 if (TelephonyManager.PHONE_TYPE_CDMA != activePhoneType) {
98 // device is not CDMA, do not display CDMA emergency_tone
99 getPreferenceScreen().removePreference(findPreference(KEY_EMERGENCY_TONE));
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800100 }
Chouting Zhang386278a2009-06-24 14:25:43 -0500101
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800102 mSilent = (CheckBoxPreference) findPreference(KEY_SILENT);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800103
104 mVibrate = (CheckBoxPreference) findPreference(KEY_VIBRATE);
105 mDtmfTone = (CheckBoxPreference) findPreference(KEY_DTMF_TONE);
106 mDtmfTone.setPersistent(false);
107 mDtmfTone.setChecked(Settings.System.getInt(resolver,
108 Settings.System.DTMF_TONE_WHEN_DIALING, 1) != 0);
109 mSoundEffects = (CheckBoxPreference) findPreference(KEY_SOUND_EFFECTS);
110 mSoundEffects.setPersistent(false);
111 mSoundEffects.setChecked(Settings.System.getInt(resolver,
112 Settings.System.SOUND_EFFECTS_ENABLED, 0) != 0);
Dan Murphy22e18682009-09-22 11:47:08 -0500113 mHapticFeedback = (CheckBoxPreference) findPreference(KEY_HAPTIC_FEEDBACK);
114 mHapticFeedback.setPersistent(false);
115 mHapticFeedback.setChecked(Settings.System.getInt(resolver,
116 Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) != 0);
Chouting Zhang386278a2009-06-24 14:25:43 -0500117
118 if (TelephonyManager.PHONE_TYPE_CDMA == activePhoneType) {
119 ListPreference emergencyTonePreference =
120 (ListPreference) findPreference(KEY_EMERGENCY_TONE);
121 emergencyTonePreference.setValue(String.valueOf(Settings.System.getInt(
122 resolver, Settings.System.EMERGENCY_TONE, FALLBACK_EMERGENCY_TONE_VALUE)));
123 emergencyTonePreference.setOnPreferenceChangeListener(this);
124 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800125
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800126 mSoundSettings = (PreferenceGroup) findPreference(KEY_SOUND_SETTINGS);
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800127 mNotificationPulse = (CheckBoxPreference)
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800128 mSoundSettings.findPreference(KEY_NOTIFICATION_PULSE);
129 if (mNotificationPulse != null &&
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800130 getResources().getBoolean(R.bool.has_intrusive_led) == false) {
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800131 mSoundSettings.removePreference(mNotificationPulse);
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800132 } else {
133 try {
134 mNotificationPulse.setChecked(Settings.System.getInt(resolver,
135 Settings.System.NOTIFICATION_LIGHT_PULSE) == 1);
136 mNotificationPulse.setOnPreferenceChangeListener(this);
137 } catch (SettingNotFoundException snfe) {
138 Log.e(TAG, Settings.System.NOTIFICATION_LIGHT_PULSE + " not found");
139 }
140 }
Amith Yamasanid2b3ab02009-12-02 13:56:05 -0800141
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800142 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800143
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800144 @Override
145 protected void onResume() {
146 super.onResume();
Michael Chandf9504e2009-12-06 01:04:04 -0800147
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800148 updateState(true);
Michael Chandf9504e2009-12-06 01:04:04 -0800149
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800150 IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION);
151 registerReceiver(mReceiver, filter);
152 }
153
154 @Override
155 protected void onPause() {
156 super.onPause();
157
158 unregisterReceiver(mReceiver);
159 }
160
161 private void updateState(boolean force) {
162 final int ringerMode = mAudioManager.getRingerMode();
163 final boolean silentOrVibrateMode =
164 ringerMode != AudioManager.RINGER_MODE_NORMAL;
Michael Chandf9504e2009-12-06 01:04:04 -0800165
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800166 if (silentOrVibrateMode != mSilent.isChecked() || force) {
167 mSilent.setChecked(silentOrVibrateMode);
168 }
169
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800170 boolean vibrateSetting;
171 if (silentOrVibrateMode) {
172 vibrateSetting = ringerMode == AudioManager.RINGER_MODE_VIBRATE;
173 } else {
174 vibrateSetting = mAudioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER)
Michael Chandf9504e2009-12-06 01:04:04 -0800175 == AudioManager.VIBRATE_SETTING_ON;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800176 }
177 if (vibrateSetting != mVibrate.isChecked() || force) {
178 mVibrate.setChecked(vibrateSetting);
179 }
Michael Chandf9504e2009-12-06 01:04:04 -0800180
Jason Parekh2c9b3262009-03-24 17:48:28 -0700181 int silentModeStreams = Settings.System.getInt(getContentResolver(),
182 Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
Michael Chandf9504e2009-12-06 01:04:04 -0800183 boolean isAlarmInclSilentMode = (silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0;
Jason Parekh2c9b3262009-03-24 17:48:28 -0700184 mSilent.setSummary(isAlarmInclSilentMode ?
185 R.string.silent_mode_incl_alarm_summary :
186 R.string.silent_mode_summary);
Michael Chandf9504e2009-12-06 01:04:04 -0800187
Dianne Hackborn76315392009-09-03 13:33:55 -0700188 }
Michael Chandf9504e2009-12-06 01:04:04 -0800189
Amith Yamasanieb72bcd2009-07-07 11:37:08 -0700190 private void setRingerMode(boolean silent, boolean vibrate) {
191 if (silent) {
192 mAudioManager.setRingerMode(vibrate ? AudioManager.RINGER_MODE_VIBRATE :
193 AudioManager.RINGER_MODE_SILENT);
194 } else {
195 mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
196 mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
197 vibrate ? AudioManager.VIBRATE_SETTING_ON
198 : AudioManager.VIBRATE_SETTING_OFF);
199 }
200 }
201
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800202 @Override
203 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
Amith Yamasanieb72bcd2009-07-07 11:37:08 -0700204 if (preference == mSilent || preference == mVibrate) {
205 setRingerMode(mSilent.isChecked(), mVibrate.isChecked());
206 if (preference == mSilent) updateState(false);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800207 } else if (preference == mDtmfTone) {
208 Settings.System.putInt(getContentResolver(), Settings.System.DTMF_TONE_WHEN_DIALING,
209 mDtmfTone.isChecked() ? 1 : 0);
Michael Chandf9504e2009-12-06 01:04:04 -0800210
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800211 } else if (preference == mSoundEffects) {
212 if (mSoundEffects.isChecked()) {
213 mAudioManager.loadSoundEffects();
214 } else {
215 mAudioManager.unloadSoundEffects();
216 }
217 Settings.System.putInt(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED,
218 mSoundEffects.isChecked() ? 1 : 0);
Dan Murphy22e18682009-09-22 11:47:08 -0500219
220 } else if (preference == mHapticFeedback) {
221 Settings.System.putInt(getContentResolver(), Settings.System.HAPTIC_FEEDBACK_ENABLED,
222 mHapticFeedback.isChecked() ? 1 : 0);
Michael Chandf9504e2009-12-06 01:04:04 -0800223
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800224 } else if (preference == mNotificationPulse) {
225 boolean value = mNotificationPulse.isChecked();
226 Settings.System.putInt(getContentResolver(),
227 Settings.System.NOTIFICATION_LIGHT_PULSE, value ? 1 : 0);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800228 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800229
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800230 return true;
231 }
232
233 public boolean onPreferenceChange(Preference preference, Object objValue) {
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800234 final String key = preference.getKey();
Amith Yamasani992f1022010-01-25 09:17:53 -0800235 if (KEY_EMERGENCY_TONE.equals(key)) {
Chouting Zhang386278a2009-06-24 14:25:43 -0500236 int value = Integer.parseInt((String) objValue);
237 try {
238 Settings.System.putInt(getContentResolver(),
239 Settings.System.EMERGENCY_TONE, value);
240 } catch (NumberFormatException e) {
241 Log.e(TAG, "could not persist emergency tone setting", e);
242 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800243 }
Amith Yamasani8f2fb65b2009-12-01 19:06:14 -0800244
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800245 return true;
246 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800247}