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:
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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() {
|
||||||
|
Reference in New Issue
Block a user