Settings: Improve inline volume sliders.

- Track framework changes to show mute states for non-ringer streams
 - Update vibrate icon in sync with other system components.

Depends on:
  Ie2df52edb070055ef59c74039162a0e785d2fdbb

Bug: 17899613
Change-Id: Ib38c86600693e0f36fe72deb231ea751e0486af7
This commit is contained in:
John Spurlock
2014-11-28 15:39:11 -05:00
parent 7da7c2220d
commit c868f7035a
2 changed files with 81 additions and 38 deletions

View File

@@ -88,6 +88,7 @@ public class NotificationSettings extends SettingsPreferenceFragment implements
private PackageManager mPM; private PackageManager mPM;
private boolean mVoiceCapable; private boolean mVoiceCapable;
private Vibrator mVibrator; private Vibrator mVibrator;
private AudioManager mAudioManager;
private VolumeSeekBarPreference mRingOrNotificationPreference; private VolumeSeekBarPreference mRingOrNotificationPreference;
private Preference mPhoneRingtonePreference; private Preference mPhoneRingtonePreference;
@@ -99,7 +100,7 @@ public class NotificationSettings extends SettingsPreferenceFragment implements
private boolean mSecure; private boolean mSecure;
private int mLockscreenSelectedValue; private int mLockscreenSelectedValue;
private ComponentName mSuppressor; private ComponentName mSuppressor;
private int mRingOrNotificationProgress; private int mRingerMode = -1;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
@@ -109,6 +110,7 @@ public class NotificationSettings extends SettingsPreferenceFragment implements
mVoiceCapable = Utils.isVoiceCapable(mContext); mVoiceCapable = Utils.isVoiceCapable(mContext);
mSecure = new LockPatternUtils(getActivity()).isSecure(); mSecure = new LockPatternUtils(getActivity()).isSecure();
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
mVibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE); mVibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
if (mVibrator != null && !mVibrator.hasVibrator()) { if (mVibrator != null && !mVibrator.hasVibrator()) {
mVibrator = null; mVibrator = null;
@@ -117,15 +119,19 @@ public class NotificationSettings extends SettingsPreferenceFragment implements
addPreferencesFromResource(R.xml.notification_settings); addPreferencesFromResource(R.xml.notification_settings);
final PreferenceCategory sound = (PreferenceCategory) findPreference(KEY_SOUND); final PreferenceCategory sound = (PreferenceCategory) findPreference(KEY_SOUND);
initVolumePreference(KEY_MEDIA_VOLUME, AudioManager.STREAM_MUSIC); initVolumePreference(KEY_MEDIA_VOLUME, AudioManager.STREAM_MUSIC,
initVolumePreference(KEY_ALARM_VOLUME, AudioManager.STREAM_ALARM); com.android.internal.R.drawable.ic_audio_vol_mute);
initVolumePreference(KEY_ALARM_VOLUME, AudioManager.STREAM_ALARM,
com.android.internal.R.drawable.ic_audio_alarm_mute);
if (mVoiceCapable) { if (mVoiceCapable) {
mRingOrNotificationPreference = mRingOrNotificationPreference =
initVolumePreference(KEY_RING_VOLUME, AudioManager.STREAM_RING); initVolumePreference(KEY_RING_VOLUME, AudioManager.STREAM_RING,
com.android.internal.R.drawable.ic_audio_ring_notif_mute);
sound.removePreference(sound.findPreference(KEY_NOTIFICATION_VOLUME)); sound.removePreference(sound.findPreference(KEY_NOTIFICATION_VOLUME));
} else { } else {
mRingOrNotificationPreference = mRingOrNotificationPreference =
initVolumePreference(KEY_NOTIFICATION_VOLUME, AudioManager.STREAM_NOTIFICATION); initVolumePreference(KEY_NOTIFICATION_VOLUME, AudioManager.STREAM_NOTIFICATION,
com.android.internal.R.drawable.ic_audio_ring_notif_mute);
sound.removePreference(sound.findPreference(KEY_RING_VOLUME)); sound.removePreference(sound.findPreference(KEY_RING_VOLUME));
} }
initRingtones(sound); initRingtones(sound);
@@ -138,6 +144,7 @@ public class NotificationSettings extends SettingsPreferenceFragment implements
mNotificationAccess = findPreference(KEY_NOTIFICATION_ACCESS); mNotificationAccess = findPreference(KEY_NOTIFICATION_ACCESS);
refreshNotificationListeners(); refreshNotificationListeners();
updateRingerMode();
updateEffectsSuppressor(); updateEffectsSuppressor();
} }
@@ -148,6 +155,7 @@ public class NotificationSettings extends SettingsPreferenceFragment implements
lookupRingtoneNames(); lookupRingtoneNames();
mSettingsObserver.register(true); mSettingsObserver.register(true);
mReceiver.register(true); mReceiver.register(true);
updateRingOrNotificationPreference();
updateEffectsSuppressor(); updateEffectsSuppressor();
for (VolumeSeekBarPreference volumePref : mVolumePrefs) { for (VolumeSeekBarPreference volumePref : mVolumePrefs) {
volumePref.onActivityResume(); volumePref.onActivityResume();
@@ -163,22 +171,29 @@ public class NotificationSettings extends SettingsPreferenceFragment implements
} }
// === Volumes === // === Volumes ===
private VolumeSeekBarPreference initVolumePreference(String key, int stream) {
private VolumeSeekBarPreference initVolumePreference(String key, int stream, int muteIcon) {
final VolumeSeekBarPreference volumePref = (VolumeSeekBarPreference) findPreference(key); final VolumeSeekBarPreference volumePref = (VolumeSeekBarPreference) findPreference(key);
volumePref.setCallback(mVolumeCallback); volumePref.setCallback(mVolumeCallback);
volumePref.setStream(stream); volumePref.setStream(stream);
mVolumePrefs.add(volumePref); mVolumePrefs.add(volumePref);
volumePref.setMuteIcon(muteIcon);
return volumePref; return volumePref;
} }
private void updateRingOrNotificationIcon() { private void updateRingOrNotificationPreference() {
mRingOrNotificationPreference.showIcon(mSuppressor != null mRingOrNotificationPreference.showIcon(mSuppressor != null
? com.android.internal.R.drawable.ic_audio_ring_notif_mute ? com.android.internal.R.drawable.ic_audio_ring_notif_mute
: mRingOrNotificationProgress > 0 : mRingerMode == AudioManager.RINGER_MODE_VIBRATE
? com.android.internal.R.drawable.ic_audio_ring_notif ? com.android.internal.R.drawable.ic_audio_ring_notif_vibrate
: (mVibrator == null : com.android.internal.R.drawable.ic_audio_ring_notif);
? com.android.internal.R.drawable.ic_audio_ring_notif_mute }
: com.android.internal.R.drawable.ic_audio_ring_notif_vibrate));
private void updateRingerMode() {
final int ringerMode = mAudioManager.getRingerModeInternal();
if (mRingerMode == ringerMode) return;
mRingerMode = ringerMode;
updateRingOrNotificationPreference();
} }
private void updateEffectsSuppressor() { private void updateEffectsSuppressor() {
@@ -191,7 +206,7 @@ public class NotificationSettings extends SettingsPreferenceFragment implements
getSuppressorCaption(suppressor)) : null; getSuppressorCaption(suppressor)) : null;
mRingOrNotificationPreference.setSuppressionText(text); mRingOrNotificationPreference.setSuppressionText(text);
} }
updateRingOrNotificationIcon(); updateRingOrNotificationPreference();
} }
private String getSuppressorCaption(ComponentName suppressor) { private String getSuppressorCaption(ComponentName suppressor) {
@@ -230,10 +245,7 @@ public class NotificationSettings extends SettingsPreferenceFragment implements
@Override @Override
public void onStreamValueChanged(int stream, int progress) { public void onStreamValueChanged(int stream, int progress) {
if (stream == AudioManager.STREAM_RING) { // noop
mHandler.removeMessages(H.UPDATE_RINGER_ICON);
mHandler.obtainMessage(H.UPDATE_RINGER_ICON, progress, 0).sendToTarget();
}
} }
public void stopSample() { public void stopSample() {
@@ -514,8 +526,8 @@ public class NotificationSettings extends SettingsPreferenceFragment implements
private static final int UPDATE_PHONE_RINGTONE = 1; private static final int UPDATE_PHONE_RINGTONE = 1;
private static final int UPDATE_NOTIFICATION_RINGTONE = 2; private static final int UPDATE_NOTIFICATION_RINGTONE = 2;
private static final int STOP_SAMPLE = 3; private static final int STOP_SAMPLE = 3;
private static final int UPDATE_RINGER_ICON = 4; private static final int UPDATE_EFFECTS_SUPPRESSOR = 4;
private static final int UPDATE_EFFECTS_SUPPRESSOR = 5; private static final int UPDATE_RINGER_MODE = 5;
private H() { private H() {
super(Looper.getMainLooper()); super(Looper.getMainLooper());
@@ -533,13 +545,12 @@ public class NotificationSettings extends SettingsPreferenceFragment implements
case STOP_SAMPLE: case STOP_SAMPLE:
mVolumeCallback.stopSample(); mVolumeCallback.stopSample();
break; break;
case UPDATE_RINGER_ICON:
mRingOrNotificationProgress = msg.arg1;
updateRingOrNotificationIcon();
break;
case UPDATE_EFFECTS_SUPPRESSOR: case UPDATE_EFFECTS_SUPPRESSOR:
updateEffectsSuppressor(); updateEffectsSuppressor();
break; break;
case UPDATE_RINGER_MODE:
updateRingerMode();
break;
} }
} }
} }
@@ -550,8 +561,10 @@ public class NotificationSettings extends SettingsPreferenceFragment implements
public void register(boolean register) { public void register(boolean register) {
if (mRegistered == register) return; if (mRegistered == register) return;
if (register) { if (register) {
mContext.registerReceiver(this, final IntentFilter filter = new IntentFilter();
new IntentFilter(NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED)); filter.addAction(NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED);
filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);
mContext.registerReceiver(this, filter);
} else { } else {
mContext.unregisterReceiver(this); mContext.unregisterReceiver(this);
} }
@@ -560,7 +573,12 @@ public class NotificationSettings extends SettingsPreferenceFragment implements
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
mHandler.sendEmptyMessage(H.UPDATE_EFFECTS_SUPPRESSOR); final String action = intent.getAction();
if (NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED.equals(action)) {
mHandler.sendEmptyMessage(H.UPDATE_EFFECTS_SUPPRESSOR);
} else if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) {
mHandler.sendEmptyMessage(H.UPDATE_RINGER_MODE);
}
} }
} }

View File

@@ -47,6 +47,9 @@ public class VolumeSeekBarPreference extends SeekBarPreference
private ImageView mIconView; private ImageView mIconView;
private TextView mSuppressionTextView; private TextView mSuppressionTextView;
private String mSuppressionText; private String mSuppressionText;
private boolean mMuted;
private int mIconResId;
private int mMuteIconResId;
public VolumeSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr, public VolumeSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) { int defStyleRes) {
@@ -99,22 +102,27 @@ public class VolumeSeekBarPreference extends SeekBarPreference
mCallback.onSampleStarting(sbv); mCallback.onSampleStarting(sbv);
} }
} }
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
if (mCallback != null) {
mCallback.onStreamValueChanged(mStream, progress);
}
}
@Override
public void onMuted(boolean muted) {
if (mMuted == muted) return;
mMuted = muted;
updateIconView();
}
}; };
final Uri sampleUri = mStream == AudioManager.STREAM_MUSIC ? getMediaVolumeUri() : null; final Uri sampleUri = mStream == AudioManager.STREAM_MUSIC ? getMediaVolumeUri() : null;
if (mVolumizer == null) { if (mVolumizer == null) {
mVolumizer = new SeekBarVolumizer(getContext(), mStream, sampleUri, sbvc) { mVolumizer = new SeekBarVolumizer(getContext(), mStream, sampleUri, sbvc);
// we need to piggyback on SBV's SeekBar listener to update our icon
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromTouch) {
super.onProgressChanged(seekBar, progress, fromTouch);
mCallback.onStreamValueChanged(mStream, progress);
}
};
} }
mVolumizer.start(); mVolumizer.start();
mVolumizer.setSeekBar(mSeekBar); mVolumizer.setSeekBar(mSeekBar);
mIconView = (ImageView) view.findViewById(com.android.internal.R.id.icon); mIconView = (ImageView) view.findViewById(com.android.internal.R.id.icon);
updateIconView();
mSuppressionTextView = (TextView) view.findViewById(R.id.suppression_text); mSuppressionTextView = (TextView) view.findViewById(R.id.suppression_text);
mCallback.onStreamValueChanged(mStream, mSeekBar.getProgress()); mCallback.onStreamValueChanged(mStream, mSeekBar.getProgress());
updateSuppressionText(); updateSuppressionText();
@@ -133,12 +141,29 @@ public class VolumeSeekBarPreference extends SeekBarPreference
mCallback.onStreamValueChanged(mStream, progress); mCallback.onStreamValueChanged(mStream, progress);
} }
private void updateIconView() {
if (mIconView == null) return;
if (mIconResId != 0) {
mIconView.setImageResource(mIconResId);
} else if (mMuteIconResId != 0 && mMuted) {
mIconView.setImageResource(mMuteIconResId);
} else {
mIconView.setImageDrawable(getIcon());
}
}
public void showIcon(int resId) { public void showIcon(int resId) {
// Instead of using setIcon, which will trigger listeners, this just decorates the // Instead of using setIcon, which will trigger listeners, this just decorates the
// preference temporarily with a new icon. // preference temporarily with a new icon.
if (mIconView != null) { if (mIconResId == resId) return;
mIconView.setImageResource(resId); mIconResId = resId;
} updateIconView();
}
public void setMuteIcon(int resId) {
if (mMuteIconResId == resId) return;
mMuteIconResId = resId;
updateIconView();
} }
private Uri getMediaVolumeUri() { private Uri getMediaVolumeUri() {