Sound settings screen and volumes dialog reconfiguration.
Removed the "Notifications use ring volume" checkbox. Show the current ringtones in the summary area. Bug: 5032308 Change-Id: I17e63f32c1775dd2097904df1aa6aaf699bd8ae2
This commit is contained in:
@@ -51,49 +51,46 @@ import android.widget.TextView;
|
||||
* Special preference type that allows configuration of both the ring volume and
|
||||
* notification volume.
|
||||
*/
|
||||
public class RingerVolumePreference extends VolumePreference implements
|
||||
CheckBox.OnCheckedChangeListener, OnClickListener {
|
||||
public class RingerVolumePreference extends VolumePreference implements OnClickListener {
|
||||
private static final String TAG = "RingerVolumePreference";
|
||||
private static final int MSG_RINGER_MODE_CHANGED = 101;
|
||||
|
||||
private CheckBox mNotificationsUseRingVolumeCheckbox;
|
||||
private SeekBarVolumizer [] mSeekBarVolumizer;
|
||||
private boolean mIgnoreVolumeKeys;
|
||||
|
||||
// These arrays must all match in length and order
|
||||
private static final int[] SEEKBAR_ID = new int[] {
|
||||
R.id.notification_volume_seekbar,
|
||||
R.id.media_volume_seekbar,
|
||||
R.id.ringer_volume_seekbar,
|
||||
R.id.notification_volume_seekbar,
|
||||
R.id.alarm_volume_seekbar
|
||||
};
|
||||
|
||||
private static final int[] NEED_VOICE_CAPABILITY_ID = new int[] {
|
||||
R.id.ringtone_label,
|
||||
com.android.internal.R.id.seekbar,
|
||||
R.id.same_notification_volume
|
||||
};
|
||||
|
||||
private static final int[] SEEKBAR_TYPE = new int[] {
|
||||
AudioManager.STREAM_NOTIFICATION,
|
||||
AudioManager.STREAM_MUSIC,
|
||||
AudioManager.STREAM_RING,
|
||||
AudioManager.STREAM_NOTIFICATION,
|
||||
AudioManager.STREAM_ALARM
|
||||
};
|
||||
|
||||
private static final int[] CHECKBOX_VIEW_ID = new int[] {
|
||||
R.id.media_mute_button,
|
||||
R.id.ringer_mute_button,
|
||||
R.id.notification_mute_button,
|
||||
R.id.volume_mute_button,
|
||||
R.id.alarm_mute_button
|
||||
};
|
||||
|
||||
private static final int[] SEEKBAR_MUTED_RES_ID = new int[] {
|
||||
com.android.internal.R.drawable.ic_audio_notification_mute,
|
||||
com.android.internal.R.drawable.ic_audio_vol_mute,
|
||||
com.android.internal.R.drawable.ic_audio_ring_notif_mute,
|
||||
com.android.internal.R.drawable.ic_audio_notification_mute,
|
||||
com.android.internal.R.drawable.ic_audio_alarm_mute
|
||||
};
|
||||
|
||||
private static final int[] SEEKBAR_UNMUTED_RES_ID = new int[] {
|
||||
com.android.internal.R.drawable.ic_audio_notification,
|
||||
com.android.internal.R.drawable.ic_audio_vol,
|
||||
com.android.internal.R.drawable.ic_audio_ring_notif,
|
||||
com.android.internal.R.drawable.ic_audio_notification,
|
||||
com.android.internal.R.drawable.ic_audio_alarm
|
||||
};
|
||||
|
||||
@@ -167,21 +164,6 @@ public class RingerVolumePreference extends VolumePreference implements
|
||||
}
|
||||
}
|
||||
|
||||
//mNotificationVolumeTitle = (TextView) view.findViewById(R.id.notification_volume_title);
|
||||
mNotificationsUseRingVolumeCheckbox =
|
||||
(CheckBox) view.findViewById(R.id.same_notification_volume);
|
||||
mNotificationsUseRingVolumeCheckbox.setOnCheckedChangeListener(this);
|
||||
mNotificationsUseRingVolumeCheckbox.setChecked(Settings.System.getInt(
|
||||
getContext().getContentResolver(),
|
||||
Settings.System.NOTIFICATIONS_USE_RING_VOLUME, 1) == 1);
|
||||
// Notification volume always visible for non voice capable devices
|
||||
if (Utils.isVoiceCapable(getContext())) {
|
||||
setNotificationVolumeVisibility(!mNotificationsUseRingVolumeCheckbox.isChecked());
|
||||
} else {
|
||||
setNotificationVolumeVisibility(true);
|
||||
}
|
||||
disableSettingsThatNeedVoice(view);
|
||||
|
||||
// Register callbacks for mute/unmute buttons
|
||||
for (int i = 0; i < mCheckBoxes.length; i++) {
|
||||
ImageView checkbox = (ImageView) view.findViewById(CHECKBOX_VIEW_ID[i]);
|
||||
@@ -207,6 +189,16 @@ public class RingerVolumePreference extends VolumePreference implements
|
||||
};
|
||||
getContext().registerReceiver(mRingModeChangedReceiver, filter);
|
||||
}
|
||||
|
||||
// Disable either ringer+notifications or notifications
|
||||
int id;
|
||||
if (!Utils.isVoiceCapable(getContext())) {
|
||||
id = R.id.ringer_section;
|
||||
} else {
|
||||
id = R.id.notification_section;
|
||||
}
|
||||
View hideSection = view.findViewById(id);
|
||||
hideSection.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
private Uri getMediaVolumeUri(Context context) {
|
||||
@@ -215,15 +207,6 @@ public class RingerVolumePreference extends VolumePreference implements
|
||||
+ "/" + R.raw.media_volume);
|
||||
}
|
||||
|
||||
private void disableSettingsThatNeedVoice(View parent) {
|
||||
final boolean voiceCapable = Utils.isVoiceCapable(getContext());
|
||||
if (!voiceCapable) {
|
||||
for (int id : NEED_VOICE_CAPABILITY_ID) {
|
||||
parent.findViewById(id).setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDialogClosed(boolean positiveResult) {
|
||||
super.onDialogClosed(positiveResult);
|
||||
@@ -242,23 +225,6 @@ public class RingerVolumePreference extends VolumePreference implements
|
||||
cleanup();
|
||||
}
|
||||
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
// ignore R.id.same_notification_volume checkbox for non voice capable devices
|
||||
if (Utils.isVoiceCapable(getContext())) {
|
||||
setNotificationVolumeVisibility(!isChecked);
|
||||
|
||||
Settings.System.putInt(getContext().getContentResolver(),
|
||||
Settings.System.NOTIFICATIONS_USE_RING_VOLUME, isChecked ? 1 : 0);
|
||||
|
||||
if (isChecked) {
|
||||
// The user wants the notification to be same as ring, so do a
|
||||
// one-time sync right now
|
||||
mAudioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION,
|
||||
mAudioManager.getStreamVolume(AudioManager.STREAM_RING), 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKey(View v, int keyCode, KeyEvent event) {
|
||||
boolean isdown = (event.getAction() == KeyEvent.ACTION_DOWN);
|
||||
@@ -284,14 +250,6 @@ public class RingerVolumePreference extends VolumePreference implements
|
||||
}
|
||||
}
|
||||
|
||||
private void setNotificationVolumeVisibility(boolean visible) {
|
||||
if (mSeekBarVolumizer[0] != null) {
|
||||
mSeekBarVolumizer[0].getSeekBar().setVisibility(
|
||||
visible ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
// mNotificationVolumeTitle.setVisibility(visible ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
|
||||
private void cleanup() {
|
||||
for (int i = 0; i < SEEKBAR_ID.length; i++) {
|
||||
if (mSeekBarVolumizer[i] != null) {
|
||||
|
@@ -23,16 +23,25 @@ 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;
|
||||
@@ -41,7 +50,7 @@ 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;
|
||||
@@ -60,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";
|
||||
@@ -72,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;
|
||||
|
||||
/*
|
||||
@@ -88,6 +99,10 @@ public class SoundSettings extends SettingsPreferenceFragment implements
|
||||
private CheckBoxPreference mNotificationPulse;
|
||||
private Preference mMusicFx;
|
||||
private CheckBoxPreference mLockSounds;
|
||||
private Preference mRingtonePreference;
|
||||
private Preference mNotificationPreference;
|
||||
|
||||
private Runnable mRingtoneLookupRunnable;
|
||||
|
||||
private AudioManager mAudioManager;
|
||||
|
||||
@@ -100,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
|
||||
@@ -133,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);
|
||||
@@ -193,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
|
||||
@@ -200,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);
|
||||
@@ -306,13 +351,34 @@ public class SoundSettings extends SettingsPreferenceFragment implements
|
||||
mVibrate.setValue(phoneVibrateSetting);
|
||||
}
|
||||
mVibrate.setSummary(mVibrate.getEntry());
|
||||
}
|
||||
|
||||
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 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));
|
||||
}
|
||||
|
||||
private void lookupRingtoneNames() {
|
||||
new Thread(mRingtoneLookupRunnable).start();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
Reference in New Issue
Block a user