summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/SoundSettings.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/SoundSettings.java')
-rw-r--r--src/com/android/settings/SoundSettings.java109
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;