diff options
Diffstat (limited to 'src/com/android/settings/SoundSettings.java')
-rw-r--r-- | src/com/android/settings/SoundSettings.java | 109 |
1 files changed, 99 insertions, 10 deletions
diff --git a/src/com/android/settings/SoundSettings.java b/src/com/android/settings/SoundSettings.java index 4ca7d4a..d1f8247 100644 --- a/src/com/android/settings/SoundSettings.java +++ b/src/com/android/settings/SoundSettings.java @@ -21,22 +21,36 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.database.Cursor; +import android.database.sqlite.SQLiteException; import android.media.AudioManager; +import android.media.Ringtone; +import android.media.RingtoneManager; +import android.media.audiofx.AudioEffect; +import android.net.Uri; import android.os.Bundle; +import android.os.Handler; +import android.os.Message; import android.os.Vibrator; import android.preference.CheckBoxPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceGroup; import android.preference.PreferenceScreen; +import android.provider.MediaStore; import android.provider.Settings; +import android.provider.MediaStore.Images.Media; import android.provider.Settings.SettingNotFoundException; import android.telephony.TelephonyManager; import android.util.Log; +import java.util.List; + public class SoundSettings extends SettingsPreferenceFragment implements Preference.OnPreferenceChangeListener { - private static final String TAG = "SoundAndDisplaysSettings"; + private static final String TAG = "SoundSettings"; /** If there is no setting in the provider, use this. */ private static final int FALLBACK_EMERGENCY_TONE_VALUE = 0; @@ -44,6 +58,7 @@ public class SoundSettings extends SettingsPreferenceFragment implements private static final String KEY_SILENT = "silent"; private static final String KEY_VIBRATE = "vibrate"; private static final String KEY_RING_VOLUME = "ring_volume"; + private static final String KEY_MUSICFX = "musicfx"; private static final String KEY_DTMF_TONE = "dtmf_tone"; private static final String KEY_SOUND_EFFECTS = "sound_effects"; private static final String KEY_HAPTIC_FEEDBACK = "haptic_feedback"; @@ -54,7 +69,6 @@ public class SoundSettings extends SettingsPreferenceFragment implements private static final String KEY_RINGTONE = "ringtone"; private static final String KEY_NOTIFICATION_SOUND = "notification_sound"; private static final String KEY_CATEGORY_CALLS = "category_calls"; - private static final String KEY_CATEGORY_NOTIFICATION = "category_notification"; private static final String VALUE_VIBRATE_NEVER = "never"; private static final String VALUE_VIBRATE_ALWAYS = "always"; @@ -66,6 +80,9 @@ public class SoundSettings extends SettingsPreferenceFragment implements KEY_EMERGENCY_TONE }; + private static final int MSG_UPDATE_RINGTONE_SUMMARY = 1; + private static final int MSG_UPDATE_NOTIFICATION_SUMMARY = 2; + private CheckBoxPreference mSilent; /* @@ -80,7 +97,12 @@ public class SoundSettings extends SettingsPreferenceFragment implements private CheckBoxPreference mSoundEffects; private CheckBoxPreference mHapticFeedback; private CheckBoxPreference mNotificationPulse; + private Preference mMusicFx; private CheckBoxPreference mLockSounds; + private Preference mRingtonePreference; + private Preference mNotificationPreference; + + private Runnable mRingtoneLookupRunnable; private AudioManager mAudioManager; @@ -93,6 +115,19 @@ public class SoundSettings extends SettingsPreferenceFragment implements } }; + private Handler mHandler = new Handler() { + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_UPDATE_RINGTONE_SUMMARY: + mRingtonePreference.setSummary((CharSequence) msg.obj); + break; + case MSG_UPDATE_NOTIFICATION_SUMMARY: + mNotificationPreference.setSummary((CharSequence) msg.obj); + break; + } + } + }; + private PreferenceGroup mSoundSettings; @Override @@ -126,16 +161,19 @@ public class SoundSettings extends SettingsPreferenceFragment implements mSoundEffects = (CheckBoxPreference) findPreference(KEY_SOUND_EFFECTS); mSoundEffects.setPersistent(false); mSoundEffects.setChecked(Settings.System.getInt(resolver, - Settings.System.SOUND_EFFECTS_ENABLED, 0) != 0); + Settings.System.SOUND_EFFECTS_ENABLED, 1) != 0); mHapticFeedback = (CheckBoxPreference) findPreference(KEY_HAPTIC_FEEDBACK); mHapticFeedback.setPersistent(false); mHapticFeedback.setChecked(Settings.System.getInt(resolver, - Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) != 0); + Settings.System.HAPTIC_FEEDBACK_ENABLED, 1) != 0); mLockSounds = (CheckBoxPreference) findPreference(KEY_LOCK_SOUNDS); mLockSounds.setPersistent(false); mLockSounds.setChecked(Settings.System.getInt(resolver, Settings.System.LOCKSCREEN_SOUNDS_ENABLED, 1) != 0); + mRingtonePreference = findPreference(KEY_RINGTONE); + mNotificationPreference = findPreference(KEY_NOTIFICATION_SOUND); + if (!((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).hasVibrator()) { getPreferenceScreen().removePreference(mVibrate); getPreferenceScreen().removePreference(mHapticFeedback); @@ -165,6 +203,19 @@ public class SoundSettings extends SettingsPreferenceFragment implements } } + mMusicFx = mSoundSettings.findPreference(KEY_MUSICFX); + Intent i = new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL); + PackageManager p = getPackageManager(); + List<ResolveInfo> ris = p.queryIntentActivities(i, PackageManager.GET_DISABLED_COMPONENTS); + if (ris.size() <= 2) { + // no need to show the item if there is no choice for the user to make + // note: the built in musicfx panel has two activities (one being a + // compatibility shim that launches either the other activity, or a + // third party one), hence the check for <=2. If the implementation + // of the compatbility layer changes, this check may need to be updated. + mSoundSettings.removePreference(mMusicFx); + } + if (!Utils.isVoiceCapable(getActivity())) { for (String prefKey : NEED_VOICE_CAPABILITY) { Preference pref = findPreference(prefKey); @@ -173,6 +224,19 @@ public class SoundSettings extends SettingsPreferenceFragment implements } } } + + mRingtoneLookupRunnable = new Runnable() { + public void run() { + if (mRingtonePreference != null) { + updateRingtoneName(RingtoneManager.TYPE_RINGTONE, mRingtonePreference, + MSG_UPDATE_RINGTONE_SUMMARY); + } + if (mNotificationPreference != null) { + updateRingtoneName(RingtoneManager.TYPE_NOTIFICATION, mNotificationPreference, + MSG_UPDATE_NOTIFICATION_SUMMARY); + } + } + }; } @Override @@ -180,6 +244,7 @@ public class SoundSettings extends SettingsPreferenceFragment implements super.onResume(); updateState(true); + lookupRingtoneNames(); IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION); getActivity().registerReceiver(mReceiver, filter); @@ -286,13 +351,34 @@ public class SoundSettings extends SettingsPreferenceFragment implements mVibrate.setValue(phoneVibrateSetting); } mVibrate.setSummary(mVibrate.getEntry()); + } + + private void updateRingtoneName(int type, Preference preference, int msg) { + if (preference == null) return; + Context context = getActivity(); + if (context == null) return; + Uri ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, type); + CharSequence summary = context.getString(com.android.internal.R.string.ringtone_unknown); + // Is it a silent ringtone? + if (ringtoneUri == null) { + summary = context.getString(com.android.internal.R.string.ringtone_silent); + } else { + // Fetch the ringtone title from the media provider + try { + Cursor cursor = context.getContentResolver().query(ringtoneUri, + new String[] { MediaStore.Audio.Media.TITLE }, null, null, null); + if (cursor.moveToFirst()) { + summary = cursor.getString(0); + } + } catch (SQLiteException sqle) { + // Unknown title for the ringtone + } + } + mHandler.sendMessage(mHandler.obtainMessage(msg, summary)); + } - int silentModeStreams = Settings.System.getInt(getContentResolver(), - Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); - boolean isAlarmInclSilentMode = (silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0; - mSilent.setSummary(isAlarmInclSilentMode ? - R.string.silent_mode_incl_alarm_summary : - R.string.silent_mode_summary); + private void lookupRingtoneNames() { + new Thread(mRingtoneLookupRunnable).start(); } @Override @@ -335,6 +421,9 @@ public class SoundSettings extends SettingsPreferenceFragment implements boolean value = mNotificationPulse.isChecked(); Settings.System.putInt(getContentResolver(), Settings.System.NOTIFICATION_LIGHT_PULSE, value ? 1 : 0); + } else if (preference == mMusicFx) { + // let the framework fire off the intent + return false; } return true; |