1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/* 2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License. 6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at 7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and 14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License. 15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings; 18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.BroadcastReceiver; 20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.ContentResolver; 21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter; 246eca4b3b927611795910908532fa927c9eea6fafMarco Nelissenimport android.content.pm.PackageManager; 256eca4b3b927611795910908532fa927c9eea6fafMarco Nelissenimport android.content.pm.ResolveInfo; 26823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.database.Cursor; 27823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.database.sqlite.SQLiteException; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.media.AudioManager; 29823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.media.Ringtone; 30823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.media.RingtoneManager; 316eca4b3b927611795910908532fa927c9eea6fafMarco Nelissenimport android.media.audiofx.AudioEffect; 32823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.net.Uri; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 34823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.os.Handler; 35823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.os.Message; 360a115aae82ea96bd9079bbb024e99330ea99df0aDianne Hackbornimport android.os.Vibrator; 378f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasaniimport android.preference.CheckBoxPreference; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.ListPreference; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference; 408f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasaniimport android.preference.PreferenceGroup; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen; 42823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.provider.MediaStore; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings; 44823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasaniimport android.provider.MediaStore.Images.Media; 458f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasaniimport android.provider.Settings.SettingNotFoundException; 468f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasaniimport android.telephony.TelephonyManager; 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log; 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 496eca4b3b927611795910908532fa927c9eea6fafMarco Nelissenimport java.util.List; 506eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen 51d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasanipublic class SoundSettings extends SettingsPreferenceFragment implements 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Preference.OnPreferenceChangeListener { 53823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani private static final String TAG = "SoundSettings"; 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** If there is no setting in the provider, use this. */ 56386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang private static final int FALLBACK_EMERGENCY_TONE_VALUE = 0; 57df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan 58dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani private static final String KEY_SILENT_MODE = "silent_mode"; 59dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani private static final String KEY_VIBRATE = "vibrate_on_ring"; 60057f181f3715e7340bf1618e86fdce118bbf952bJoe Onorato private static final String KEY_RING_VOLUME = "ring_volume"; 616eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen private static final String KEY_MUSICFX = "musicfx"; 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_DTMF_TONE = "dtmf_tone"; 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_SOUND_EFFECTS = "sound_effects"; 6422e186898e47cf35a49e73494bf11695c854d284Dan Murphy private static final String KEY_HAPTIC_FEEDBACK = "haptic_feedback"; 658f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani private static final String KEY_EMERGENCY_TONE = "emergency_tone"; 668f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani private static final String KEY_SOUND_SETTINGS = "sound_settings"; 67231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler private static final String KEY_LOCK_SOUNDS = "lock_sounds"; 6860133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani private static final String KEY_RINGTONE = "ringtone"; 6960133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani private static final String KEY_NOTIFICATION_SOUND = "notification_sound"; 7060133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani private static final String KEY_CATEGORY_CALLS = "category_calls"; 718f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani 72dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani private static final String SILENT_MODE_OFF = "off"; 73dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani private static final String SILENT_MODE_VIBRATE = "vibrate"; 74dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani private static final String SILENT_MODE_MUTE = "mute"; 752c917847f520c59af84837d4514855ea01f0316cDaniel Sandler 7660133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani private static final String[] NEED_VOICE_CAPABILITY = { 7760133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani KEY_RINGTONE, KEY_DTMF_TONE, KEY_CATEGORY_CALLS, 7860133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani KEY_EMERGENCY_TONE 7960133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani }; 8060133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani 81823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani private static final int MSG_UPDATE_RINGTONE_SUMMARY = 1; 82823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani private static final int MSG_UPDATE_NOTIFICATION_SUMMARY = 2; 83823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani 84dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani private CheckBoxPreference mVibrateOnRing; 85dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani private ListPreference mSilentMode; 86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CheckBoxPreference mDtmfTone; 87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CheckBoxPreference mSoundEffects; 8822e186898e47cf35a49e73494bf11695c854d284Dan Murphy private CheckBoxPreference mHapticFeedback; 896eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen private Preference mMusicFx; 90231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler private CheckBoxPreference mLockSounds; 91823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani private Preference mRingtonePreference; 92823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani private Preference mNotificationPreference; 93823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani 94823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani private Runnable mRingtoneLookupRunnable; 95df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan 96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private AudioManager mAudioManager; 97df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan 98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private BroadcastReceiver mReceiver = new BroadcastReceiver() { 99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onReceive(Context context, Intent intent) { 101d2b3ab088f49e3451b703b50f07366795c50f674Amith Yamasani if (intent.getAction().equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) { 102d2b3ab088f49e3451b703b50f07366795c50f674Amith Yamasani updateState(false); 103d2b3ab088f49e3451b703b50f07366795c50f674Amith Yamasani } 104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 107823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani private Handler mHandler = new Handler() { 108823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani public void handleMessage(Message msg) { 109823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani switch (msg.what) { 110823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani case MSG_UPDATE_RINGTONE_SUMMARY: 111823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani mRingtonePreference.setSummary((CharSequence) msg.obj); 112823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani break; 113823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani case MSG_UPDATE_NOTIFICATION_SUMMARY: 114823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani mNotificationPreference.setSummary((CharSequence) msg.obj); 115823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani break; 116823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani } 117823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani } 118823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani }; 119823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani 120d2b3ab088f49e3451b703b50f07366795c50f674Amith Yamasani private PreferenceGroup mSoundSettings; 121d2b3ab088f49e3451b703b50f07366795c50f674Amith Yamasani 122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 123d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onCreate(Bundle savedInstanceState) { 124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(savedInstanceState); 125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ContentResolver resolver = getContentResolver(); 126327147eb062a25ecab40d66ea14559070e0ecef3Wink Saville int activePhoneType = TelephonyManager.getDefault().getCurrentPhoneType(); 127df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan 128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 130992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani addPreferencesFromResource(R.xml.sound_settings); 1318f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani 132386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang if (TelephonyManager.PHONE_TYPE_CDMA != activePhoneType) { 133386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang // device is not CDMA, do not display CDMA emergency_tone 134386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang getPreferenceScreen().removePreference(findPreference(KEY_EMERGENCY_TONE)); 1358f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani } 136386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang 137dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani mSilentMode = (ListPreference) findPreference(KEY_SILENT_MODE); 138057f181f3715e7340bf1618e86fdce118bbf952bJoe Onorato if (!getResources().getBoolean(R.bool.has_silent_mode)) { 139dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani getPreferenceScreen().removePreference(mSilentMode); 140057f181f3715e7340bf1618e86fdce118bbf952bJoe Onorato findPreference(KEY_RING_VOLUME).setDependency(null); 141dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani } else { 142dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani mSilentMode.setOnPreferenceChangeListener(this); 143057f181f3715e7340bf1618e86fdce118bbf952bJoe Onorato } 144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 145dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani mVibrateOnRing = (CheckBoxPreference) findPreference(KEY_VIBRATE); 146dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani mVibrateOnRing.setOnPreferenceChangeListener(this); 1474ce4f759bd3979de4b21e66a0f8c7ec2beb40a31Daniel Sandler 148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDtmfTone = (CheckBoxPreference) findPreference(KEY_DTMF_TONE); 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDtmfTone.setPersistent(false); 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDtmfTone.setChecked(Settings.System.getInt(resolver, 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Settings.System.DTMF_TONE_WHEN_DIALING, 1) != 0); 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSoundEffects = (CheckBoxPreference) findPreference(KEY_SOUND_EFFECTS); 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSoundEffects.setPersistent(false); 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSoundEffects.setChecked(Settings.System.getInt(resolver, 155823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani Settings.System.SOUND_EFFECTS_ENABLED, 1) != 0); 15622e186898e47cf35a49e73494bf11695c854d284Dan Murphy mHapticFeedback = (CheckBoxPreference) findPreference(KEY_HAPTIC_FEEDBACK); 15722e186898e47cf35a49e73494bf11695c854d284Dan Murphy mHapticFeedback.setPersistent(false); 15822e186898e47cf35a49e73494bf11695c854d284Dan Murphy mHapticFeedback.setChecked(Settings.System.getInt(resolver, 159823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani Settings.System.HAPTIC_FEEDBACK_ENABLED, 1) != 0); 160231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler mLockSounds = (CheckBoxPreference) findPreference(KEY_LOCK_SOUNDS); 161231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler mLockSounds.setPersistent(false); 162231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler mLockSounds.setChecked(Settings.System.getInt(resolver, 163231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler Settings.System.LOCKSCREEN_SOUNDS_ENABLED, 1) != 0); 164386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang 165823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani mRingtonePreference = findPreference(KEY_RINGTONE); 166823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani mNotificationPreference = findPreference(KEY_NOTIFICATION_SOUND); 167823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani 168edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani if (!((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).hasVibrator()) { 169dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani getPreferenceScreen().removePreference(mVibrateOnRing); 170edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani getPreferenceScreen().removePreference(mHapticFeedback); 171edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani } 172edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani 173386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang if (TelephonyManager.PHONE_TYPE_CDMA == activePhoneType) { 174386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang ListPreference emergencyTonePreference = 175386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang (ListPreference) findPreference(KEY_EMERGENCY_TONE); 176386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang emergencyTonePreference.setValue(String.valueOf(Settings.System.getInt( 177386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang resolver, Settings.System.EMERGENCY_TONE, FALLBACK_EMERGENCY_TONE_VALUE))); 178386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang emergencyTonePreference.setOnPreferenceChangeListener(this); 179386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang } 1808f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani 181d2b3ab088f49e3451b703b50f07366795c50f674Amith Yamasani mSoundSettings = (PreferenceGroup) findPreference(KEY_SOUND_SETTINGS); 182d2b3ab088f49e3451b703b50f07366795c50f674Amith Yamasani 1836eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen mMusicFx = mSoundSettings.findPreference(KEY_MUSICFX); 1846eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen Intent i = new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL); 1856eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen PackageManager p = getPackageManager(); 1866eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen List<ResolveInfo> ris = p.queryIntentActivities(i, PackageManager.GET_DISABLED_COMPONENTS); 1876eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen if (ris.size() <= 2) { 1886eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen // no need to show the item if there is no choice for the user to make 1896eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen // note: the built in musicfx panel has two activities (one being a 1906eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen // compatibility shim that launches either the other activity, or a 1916eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen // third party one), hence the check for <=2. If the implementation 1926eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen // of the compatbility layer changes, this check may need to be updated. 1936eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen mSoundSettings.removePreference(mMusicFx); 1946eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen } 1956eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen 19660133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani if (!Utils.isVoiceCapable(getActivity())) { 19760133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani for (String prefKey : NEED_VOICE_CAPABILITY) { 19860133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani Preference pref = findPreference(prefKey); 19960133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani if (pref != null) { 20060133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani getPreferenceScreen().removePreference(pref); 20160133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani } 20260133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani } 20360133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani } 204823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani 205823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani mRingtoneLookupRunnable = new Runnable() { 206823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani public void run() { 207823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani if (mRingtonePreference != null) { 208823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani updateRingtoneName(RingtoneManager.TYPE_RINGTONE, mRingtonePreference, 209823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani MSG_UPDATE_RINGTONE_SUMMARY); 210823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani } 211823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani if (mNotificationPreference != null) { 212823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani updateRingtoneName(RingtoneManager.TYPE_NOTIFICATION, mNotificationPreference, 213823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani MSG_UPDATE_NOTIFICATION_SUMMARY); 214823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani } 215823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani } 216823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani }; 217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 2188f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani 219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 220d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onResume() { 221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onResume(); 222df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan 223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project updateState(true); 224823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani lookupRingtoneNames(); 225df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan 226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION); 227d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani getActivity().registerReceiver(mReceiver, filter); 228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 231d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onPause() { 232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onPause(); 233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 234d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani getActivity().unregisterReceiver(mReceiver); 235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 237dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani /** 238dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani * Put the audio system into the correct vibrate setting 239dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani */ 240dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani private void setPhoneVibrateSettingValue(boolean vibeOnRing) { 241dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani // If vibrate-on-ring is checked, use VIBRATE_SETTING_ON 242dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani // Otherwise vibrate is off when ringer is silent 243dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani int vibrateMode = vibeOnRing ? AudioManager.VIBRATE_SETTING_ON 244dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani : AudioManager.VIBRATE_SETTING_ONLY_SILENT; 245dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, vibrateMode); 246b3e6afe029a852d50bcba4dd6eca0d831db9d771Amith Yamasani mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION, vibrateMode); 2472c917847f520c59af84837d4514855ea01f0316cDaniel Sandler } 2482c917847f520c59af84837d4514855ea01f0316cDaniel Sandler 249dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani private void setPhoneSilentSettingValue(String value) { 250dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani int ringerMode = AudioManager.RINGER_MODE_NORMAL; 251dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani if (value.equals(SILENT_MODE_MUTE)) { 252dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani ringerMode = AudioManager.RINGER_MODE_SILENT; 253dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani } else if (value.equals(SILENT_MODE_VIBRATE)) { 254dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani ringerMode = AudioManager.RINGER_MODE_VIBRATE; 2552c917847f520c59af84837d4514855ea01f0316cDaniel Sandler } 256dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani mAudioManager.setRingerMode(ringerMode); 257dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani } 2582c917847f520c59af84837d4514855ea01f0316cDaniel Sandler 259dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani private String getPhoneSilentModeSettingValue() { 260dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani switch (mAudioManager.getRingerMode()) { 261dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani case AudioManager.RINGER_MODE_NORMAL: 262dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani return SILENT_MODE_OFF; 263dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani case AudioManager.RINGER_MODE_VIBRATE: 264dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani return SILENT_MODE_VIBRATE; 265dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani case AudioManager.RINGER_MODE_SILENT: 266dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani return SILENT_MODE_MUTE; 2672c917847f520c59af84837d4514855ea01f0316cDaniel Sandler } 268dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani // Shouldn't happen 269dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani return SILENT_MODE_OFF; 2702c917847f520c59af84837d4514855ea01f0316cDaniel Sandler } 2712c917847f520c59af84837d4514855ea01f0316cDaniel Sandler 27258cf8299d3ef347e3fd154b1439f50e62f7ca8bfDaniel Sandler // updateState in fact updates the UI to reflect the system state 273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void updateState(boolean force) { 274eb99f2f3f4a3e6d5e785867043e6069c89e8cd58Amith Yamasani if (getActivity() == null) return; 275eb99f2f3f4a3e6d5e785867043e6069c89e8cd58Amith Yamasani 276dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani final int vibrateMode = mAudioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER); 277df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan 278dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani mVibrateOnRing.setChecked(vibrateMode == AudioManager.VIBRATE_SETTING_ON); 279dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani mSilentMode.setValue(getPhoneSilentModeSettingValue()); 28058cf8299d3ef347e3fd154b1439f50e62f7ca8bfDaniel Sandler 281dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani mSilentMode.setSummary(mSilentMode.getEntry()); 282823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani } 283823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani 284823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani private void updateRingtoneName(int type, Preference preference, int msg) { 285823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani if (preference == null) return; 286823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani Context context = getActivity(); 287823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani if (context == null) return; 288823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani Uri ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, type); 289823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani CharSequence summary = context.getString(com.android.internal.R.string.ringtone_unknown); 290823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani // Is it a silent ringtone? 291823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani if (ringtoneUri == null) { 292823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani summary = context.getString(com.android.internal.R.string.ringtone_silent); 293823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani } else { 294823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani // Fetch the ringtone title from the media provider 295823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani try { 296823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani Cursor cursor = context.getContentResolver().query(ringtoneUri, 297823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani new String[] { MediaStore.Audio.Media.TITLE }, null, null, null); 298c86755bfd56ff620e740e7a99303b54350ebf164Amith Yamasani if (cursor != null) { 299c86755bfd56ff620e740e7a99303b54350ebf164Amith Yamasani if (cursor.moveToFirst()) { 300c86755bfd56ff620e740e7a99303b54350ebf164Amith Yamasani summary = cursor.getString(0); 301c86755bfd56ff620e740e7a99303b54350ebf164Amith Yamasani } 302c86755bfd56ff620e740e7a99303b54350ebf164Amith Yamasani cursor.close(); 303823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani } 304823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani } catch (SQLiteException sqle) { 305823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani // Unknown title for the ringtone 306823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani } 307823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani } 308823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani mHandler.sendMessage(mHandler.obtainMessage(msg, summary)); 309823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani } 310df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan 311823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani private void lookupRingtoneNames() { 312823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani new Thread(mRingtoneLookupRunnable).start(); 31376315391f07d022e31c176633ae3aeaee5bb14ecDianne Hackborn } 314df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan 315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 316afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 317dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani if (preference == mDtmfTone) { 318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Settings.System.putInt(getContentResolver(), Settings.System.DTMF_TONE_WHEN_DIALING, 319afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDtmfTone.isChecked() ? 1 : 0); 320df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan 321afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (preference == mSoundEffects) { 322afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mSoundEffects.isChecked()) { 323afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAudioManager.loadSoundEffects(); 324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAudioManager.unloadSoundEffects(); 326afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Settings.System.putInt(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED, 328afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSoundEffects.isChecked() ? 1 : 0); 32922e186898e47cf35a49e73494bf11695c854d284Dan Murphy 33022e186898e47cf35a49e73494bf11695c854d284Dan Murphy } else if (preference == mHapticFeedback) { 33122e186898e47cf35a49e73494bf11695c854d284Dan Murphy Settings.System.putInt(getContentResolver(), Settings.System.HAPTIC_FEEDBACK_ENABLED, 33222e186898e47cf35a49e73494bf11695c854d284Dan Murphy mHapticFeedback.isChecked() ? 1 : 0); 333df9504ef58e8dafdd80ca9cd780510f9444943e2Michael Chan 334231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler } else if (preference == mLockSounds) { 335231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler Settings.System.putInt(getContentResolver(), Settings.System.LOCKSCREEN_SOUNDS_ENABLED, 336231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler mLockSounds.isChecked() ? 1 : 0); 337231d880df31ea4817dc0c5f1acd66f12417f2044Daniel Sandler 3386eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen } else if (preference == mMusicFx) { 3396eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen // let the framework fire off the intent 3406eca4b3b927611795910908532fa927c9eea6fafMarco Nelissen return false; 341afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 3428f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani 343afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 344afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 345afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 346afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onPreferenceChange(Preference preference, Object objValue) { 3478f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani final String key = preference.getKey(); 348992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani if (KEY_EMERGENCY_TONE.equals(key)) { 349386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang try { 350378b6f674064e373f1be4d230608be4d0bddbb4fPeter Kuterna int value = Integer.parseInt((String) objValue); 351386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang Settings.System.putInt(getContentResolver(), 352386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang Settings.System.EMERGENCY_TONE, value); 353386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang } catch (NumberFormatException e) { 354386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang Log.e(TAG, "could not persist emergency tone setting", e); 355386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang } 356dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani } else if (preference == mVibrateOnRing) { 357dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani setPhoneVibrateSettingValue((Boolean) objValue); 358dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani } else if (preference == mSilentMode) { 359dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasani setPhoneSilentSettingValue(objValue.toString()); 360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 3618f2fb65b360ebc7ed71ddbc884451536e5e99c03Amith Yamasani 362afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 363afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 364afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 365