blob: 887fb8f70cbb4a7e7f5d43a26ed6ea4ce7c7dc1f [file] [log] [blame]
The Android Open Source Projectde2d9f52008-10-21 07:00:00 -07001/*
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;
20
21import 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.preference.ListPreference;
29import android.preference.Preference;
30import android.preference.PreferenceActivity;
31import android.preference.PreferenceScreen;
32import android.preference.CheckBoxPreference;
33import android.provider.Settings;
34import android.util.Log;
35
36public class SoundAndDisplaySettings extends PreferenceActivity implements
37 Preference.OnPreferenceChangeListener {
38 private static final String TAG = "SoundAndDisplaysSettings";
39
40 /** If there is no setting in the provider, use this. */
41 private static final int FALLBACK_SCREEN_TIMEOUT_VALUE = 30000;
42
43 private static final String KEY_SILENT = "silent";
44 private static final String KEY_VIBRATE = "vibrate";
45 private static final String KEY_SCREEN_TIMEOUT = "screen_timeout";
46 private static final String KEY_DTMF_TONE = "dtmf_tone";
47 private static final String KEY_SOUND_EFFECTS = "sound_effects";
48
49 private CheckBoxPreference mSilent;
50 private CheckBoxPreference mVibrate;
51 private CheckBoxPreference mDtmfTone;
52 private CheckBoxPreference mSoundEffects;
53
54 private AudioManager mAudioManager;
55
56 private BroadcastReceiver mReceiver = new BroadcastReceiver() {
57 @Override
58 public void onReceive(Context context, Intent intent) {
59
60 int ringerMode = intent
61 .getIntExtra(AudioManager.EXTRA_RINGER_MODE, AudioManager.RINGER_MODE_NORMAL);
62 boolean isSilentMode = ringerMode != AudioManager.RINGER_MODE_NORMAL;
63
64 if (mSilent.isChecked() != isSilentMode) {
65 mSilent.setChecked(isSilentMode);
66 }
67 }
68 };
69
70 @Override
71 protected void onCreate(Bundle savedInstanceState) {
72 super.onCreate(savedInstanceState);
73 ContentResolver resolver = getContentResolver();
74
75 mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
76
77 addPreferencesFromResource(R.xml.sound_and_display_settings);
78
79 mSilent = (CheckBoxPreference) findPreference(KEY_SILENT);
80 mVibrate = (CheckBoxPreference) findPreference(KEY_VIBRATE);
81 mDtmfTone = (CheckBoxPreference) findPreference(KEY_DTMF_TONE);
82 mDtmfTone.setPersistent(false);
83 mDtmfTone.setChecked(Settings.System.getInt(resolver,
84 Settings.System.DTMF_TONE_WHEN_DIALING, 1) != 0);
85 mSoundEffects = (CheckBoxPreference) findPreference(KEY_SOUND_EFFECTS);
86 mSoundEffects.setPersistent(false);
87 mSoundEffects.setChecked(Settings.System.getInt(resolver,
88 Settings.System.SOUND_EFFECTS_ENABLED, 0) != 0);
89
90 ListPreference screenTimeoutPreference =
91 (ListPreference) findPreference(KEY_SCREEN_TIMEOUT);
92 screenTimeoutPreference.setValue(String.valueOf(Settings.System.getInt(
93 getContentResolver(), SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE)));
94 screenTimeoutPreference.setOnPreferenceChangeListener(this);
95 }
96
97 @Override
98 protected void onResume() {
99 super.onResume();
100
101 updateState(true);
102
103 IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION);
104 registerReceiver(mReceiver, filter);
105 }
106
107 @Override
108 protected void onPause() {
109 super.onPause();
110
111 unregisterReceiver(mReceiver);
112 }
113
114 private void updateState(boolean force) {
115 final boolean silent = mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL;
116 final boolean phoneVibrate = mAudioManager
117 .getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER)
118 == AudioManager.VIBRATE_SETTING_ON;
119
120 if (silent != mSilent.isChecked() || force) {
121 mSilent.setChecked(silent);
122 }
123
124 if (phoneVibrate != mVibrate.isChecked() || force) {
125 mVibrate.setChecked(phoneVibrate);
126 }
127 }
128
129 @Override
130 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
131
132 if (preference == mSilent) {
133 final boolean silent = mSilent.isChecked();
134 mAudioManager.setRingerMode(silent ? AudioManager.RINGER_MODE_SILENT
135 : AudioManager.RINGER_MODE_NORMAL);
136
137 } else if (preference == mVibrate) {
138 final boolean vibrate = mVibrate.isChecked();
139 mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
140 vibrate ? AudioManager.VIBRATE_SETTING_ON
141 : AudioManager.VIBRATE_SETTING_OFF);
142 } else if (preference == mDtmfTone) {
143 Settings.System.putInt(getContentResolver(), Settings.System.DTMF_TONE_WHEN_DIALING,
144 mDtmfTone.isChecked() ? 1 : 0);
145
146 } else if (preference == mSoundEffects) {
147 if (mSoundEffects.isChecked()) {
148 mAudioManager.loadSoundEffects();
149 } else {
150 mAudioManager.unloadSoundEffects();
151 }
152 Settings.System.putInt(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED,
153 mSoundEffects.isChecked() ? 1 : 0);
154 }
155 return true;
156 }
157
158 public boolean onPreferenceChange(Preference preference, Object objValue) {
159 if (KEY_SCREEN_TIMEOUT.equals(preference.getKey())) {
160 int value = Integer.parseInt((String) objValue);
161 try {
162 Settings.System.putInt(getContentResolver(),
163 SCREEN_OFF_TIMEOUT, value);
164 } catch (NumberFormatException e) {
165 Log.e(TAG, "could not persist screen timeout setting", e);
166 }
167 }
168
169 return true;
170 }
171
172}