am 21d68f48: Merge "Volume: Improve inline volume controls used in settings." into lmp-mr1-dev

* commit '21d68f4808db02aa3252ba5dec8b0220d053cab3':
  Volume: Improve inline volume controls used in settings.
This commit is contained in:
John Spurlock
2014-12-01 17:11:21 +00:00
committed by Android Git Automerger
9 changed files with 122 additions and 63 deletions

View File

@@ -44,6 +44,8 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
public interface Callback { public interface Callback {
void onSampleStarting(SeekBarVolumizer sbv); void onSampleStarting(SeekBarVolumizer sbv);
void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch);
void onMuted(boolean muted);
} }
private final Context mContext; private final Context mContext;
@@ -53,6 +55,8 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
private final AudioManager mAudioManager; private final AudioManager mAudioManager;
private final int mStreamType; private final int mStreamType;
private final int mMaxStreamVolume; private final int mMaxStreamVolume;
private boolean mAffectedByRingerMode;
private boolean mNotificationOrRing;
private final Receiver mReceiver = new Receiver(); private final Receiver mReceiver = new Receiver();
private Handler mHandler; private Handler mHandler;
@@ -60,8 +64,10 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
private int mOriginalStreamVolume; private int mOriginalStreamVolume;
private Ringtone mRingtone; private Ringtone mRingtone;
private int mLastProgress = -1; private int mLastProgress = -1;
private boolean mMuted;
private SeekBar mSeekBar; private SeekBar mSeekBar;
private int mVolumeBeforeMute = -1; private int mVolumeBeforeMute = -1;
private int mRingerMode;
private static final int MSG_SET_STREAM_VOLUME = 0; private static final int MSG_SET_STREAM_VOLUME = 0;
private static final int MSG_START_SAMPLE = 1; private static final int MSG_START_SAMPLE = 1;
@@ -69,14 +75,22 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
private static final int MSG_INIT_SAMPLE = 3; private static final int MSG_INIT_SAMPLE = 3;
private static final int CHECK_RINGTONE_PLAYBACK_DELAY_MS = 1000; private static final int CHECK_RINGTONE_PLAYBACK_DELAY_MS = 1000;
public SeekBarVolumizer(Context context, int streamType, Uri defaultUri, public SeekBarVolumizer(Context context, int streamType, Uri defaultUri, Callback callback) {
Callback callback) {
mContext = context; mContext = context;
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
mStreamType = streamType; mStreamType = streamType;
mAffectedByRingerMode = mAudioManager.isStreamAffectedByRingerMode(mStreamType);
mNotificationOrRing = isNotificationOrRing(mStreamType);
if (mNotificationOrRing) {
mRingerMode = mAudioManager.getRingerModeInternal();
}
mMaxStreamVolume = mAudioManager.getStreamMaxVolume(mStreamType); mMaxStreamVolume = mAudioManager.getStreamMaxVolume(mStreamType);
mCallback = callback; mCallback = callback;
mOriginalStreamVolume = mAudioManager.getStreamVolume(mStreamType); mOriginalStreamVolume = mAudioManager.getStreamVolume(mStreamType);
mMuted = mAudioManager.isStreamMute(mStreamType);
if (mCallback != null) {
mCallback.onMuted(mMuted);
}
if (defaultUri == null) { if (defaultUri == null) {
if (mStreamType == AudioManager.STREAM_RING) { if (mStreamType == AudioManager.STREAM_RING) {
defaultUri = Settings.System.DEFAULT_RINGTONE_URI; defaultUri = Settings.System.DEFAULT_RINGTONE_URI;
@@ -89,6 +103,10 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
mDefaultUri = defaultUri; mDefaultUri = defaultUri;
} }
private static boolean isNotificationOrRing(int stream) {
return stream == AudioManager.STREAM_RING || stream == AudioManager.STREAM_NOTIFICATION;
}
public void setSeekBar(SeekBar seekBar) { public void setSeekBar(SeekBar seekBar) {
if (mSeekBar != null) { if (mSeekBar != null) {
mSeekBar.setOnSeekBarChangeListener(null); mSeekBar.setOnSeekBarChangeListener(null);
@@ -96,10 +114,23 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
mSeekBar = seekBar; mSeekBar = seekBar;
mSeekBar.setOnSeekBarChangeListener(null); mSeekBar.setOnSeekBarChangeListener(null);
mSeekBar.setMax(mMaxStreamVolume); mSeekBar.setMax(mMaxStreamVolume);
mSeekBar.setProgress(mLastProgress > -1 ? mLastProgress : mOriginalStreamVolume); updateSeekBar();
mSeekBar.setOnSeekBarChangeListener(this); mSeekBar.setOnSeekBarChangeListener(this);
} }
protected void updateSeekBar() {
if (mNotificationOrRing && mRingerMode == AudioManager.RINGER_MODE_VIBRATE) {
mSeekBar.setEnabled(true);
mSeekBar.setProgress(0);
} else if (mMuted) {
mSeekBar.setEnabled(false);
mSeekBar.setProgress(0);
} else {
mSeekBar.setEnabled(true);
mSeekBar.setProgress(mLastProgress > -1 ? mLastProgress : mOriginalStreamVolume);
}
}
@Override @Override
public boolean handleMessage(Message msg) { public boolean handleMessage(Message msg) {
switch (msg.what) { switch (msg.what) {
@@ -193,13 +224,13 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
mAudioManager.setStreamVolume(mStreamType, mOriginalStreamVolume, 0); mAudioManager.setStreamVolume(mStreamType, mOriginalStreamVolume, 0);
} }
public void onProgressChanged(SeekBar seekBar, int progress, public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
boolean fromTouch) { if (fromTouch) {
if (!fromTouch) { postSetVolume(progress);
return; }
if (mCallback != null) {
mCallback.onProgressChanged(seekBar, progress, fromTouch);
} }
postSetVolume(progress);
} }
private void postSetVolume(int progress) { private void postSetVolume(int progress) {
@@ -276,14 +307,29 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
public void handleMessage(Message msg) { public void handleMessage(Message msg) {
if (msg.what == UPDATE_SLIDER) { if (msg.what == UPDATE_SLIDER) {
if (mSeekBar != null) { if (mSeekBar != null) {
mSeekBar.setProgress(msg.arg1); mLastProgress = msg.arg1;
mLastProgress = mSeekBar.getProgress(); final boolean muted = msg.arg2 != 0;
if (muted != mMuted) {
mMuted = muted;
if (mCallback != null) {
mCallback.onMuted(mMuted);
}
}
updateSeekBar();
} }
} }
} }
public void postUpdateSlider(int volume) { public void postUpdateSlider(int volume, boolean mute) {
obtainMessage(UPDATE_SLIDER, volume, 0).sendToTarget(); obtainMessage(UPDATE_SLIDER, volume, mute ? 1 : 0).sendToTarget();
}
}
private void updateSlider() {
if (mSeekBar != null && mAudioManager != null) {
final int volume = mAudioManager.getStreamVolume(mStreamType);
final boolean mute = mAudioManager.isStreamMute(mStreamType);
mUiHandler.postUpdateSlider(volume, mute);
} }
} }
@@ -295,10 +341,7 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
@Override @Override
public void onChange(boolean selfChange) { public void onChange(boolean selfChange) {
super.onChange(selfChange); super.onChange(selfChange);
if (mSeekBar != null && mAudioManager != null) { updateSlider();
final int volume = mAudioManager.getStreamVolume(mStreamType);
mUiHandler.postUpdateSlider(volume);
}
} }
} }
@@ -310,6 +353,7 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
mListening = listening; mListening = listening;
if (listening) { if (listening) {
final IntentFilter filter = new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION); final IntentFilter filter = new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION);
filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);
mContext.registerReceiver(this, filter); mContext.registerReceiver(this, filter);
} else { } else {
mContext.unregisterReceiver(this); mContext.unregisterReceiver(this);
@@ -318,11 +362,23 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
if (!AudioManager.VOLUME_CHANGED_ACTION.equals(intent.getAction())) return; final String action = intent.getAction();
final int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); if (AudioManager.VOLUME_CHANGED_ACTION.equals(action)) {
final int streamValue = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, -1); int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1);
if (mSeekBar != null && streamType == mStreamType && streamValue != -1) { int streamValue = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, -1);
mUiHandler.postUpdateSlider(streamValue); final boolean streamMatch = mNotificationOrRing ? isNotificationOrRing(streamType)
: (streamType == mStreamType);
if (mSeekBar != null && streamMatch && streamValue != -1) {
final boolean muted = mAudioManager.isStreamMute(mStreamType);
mUiHandler.postUpdateSlider(streamValue, muted);
}
} else if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) {
if (mNotificationOrRing) {
mRingerMode = mAudioManager.getRingerModeInternal();
}
if (mAffectedByRingerMode) {
updateSlider();
}
} }
} }
} }

View File

@@ -149,6 +149,16 @@ public class VolumePreference extends SeekBarDialogPreference implements
} }
} }
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
// noop
}
@Override
public void onMuted(boolean muted) {
// noop
}
@Override @Override
protected Parcelable onSaveInstanceState() { protected Parcelable onSaveInstanceState() {
final Parcelable superState = super.onSaveInstanceState(); final Parcelable superState = super.onSaveInstanceState();

View File

@@ -89,6 +89,17 @@ public class AudioManager {
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String RINGER_MODE_CHANGED_ACTION = "android.media.RINGER_MODE_CHANGED"; public static final String RINGER_MODE_CHANGED_ACTION = "android.media.RINGER_MODE_CHANGED";
/**
* @hide
* Sticky broadcast intent action indicating that the internal ringer mode has
* changed. Includes the new ringer mode.
*
* @see #EXTRA_RINGER_MODE
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String INTERNAL_RINGER_MODE_CHANGED_ACTION =
"android.media.INTERNAL_RINGER_MODE_CHANGED_ACTION";
/** /**
* The new ringer mode. * The new ringer mode.
* *

View File

@@ -926,8 +926,9 @@ public class AudioService extends IAudioService.Stub {
// Each stream will read its own persisted settings // Each stream will read its own persisted settings
// Broadcast the sticky intent // Broadcast the sticky intents
broadcastRingerMode(ringerMode); broadcastRingerMode(AudioManager.RINGER_MODE_CHANGED_ACTION, mRingerModeExternal);
broadcastRingerMode(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION, mRingerMode);
// Broadcast vibrate settings // Broadcast vibrate settings
broadcastVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER); broadcastVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER);
@@ -1836,7 +1837,6 @@ public class AudioService extends IAudioService.Stub {
} else /*internal*/ { } else /*internal*/ {
if (ringerMode != ringerModeInternal) { if (ringerMode != ringerModeInternal) {
setRingerModeInt(ringerMode, true /*persist*/); setRingerModeInt(ringerMode, true /*persist*/);
mVolumeController.postInternalRingerModeChanged(ringerMode);
} }
if (mRingerModeDelegate != null) { if (mRingerModeDelegate != null) {
ringerMode = mRingerModeDelegate.onSetRingerModeInternal(ringerModeInternal, ringerMode = mRingerModeDelegate.onSetRingerModeInternal(ringerModeInternal,
@@ -1852,11 +1852,13 @@ public class AudioService extends IAudioService.Stub {
mRingerModeExternal = ringerMode; mRingerModeExternal = ringerMode;
} }
// Send sticky broadcast // Send sticky broadcast
broadcastRingerMode(ringerMode); broadcastRingerMode(AudioManager.RINGER_MODE_CHANGED_ACTION, ringerMode);
} }
private void setRingerModeInt(int ringerMode, boolean persist) { private void setRingerModeInt(int ringerMode, boolean persist) {
final boolean change;
synchronized(mSettingsLock) { synchronized(mSettingsLock) {
change = mRingerMode != ringerMode;
mRingerMode = ringerMode; mRingerMode = ringerMode;
} }
@@ -1902,6 +1904,10 @@ public class AudioService extends IAudioService.Stub {
sendMsg(mAudioHandler, MSG_PERSIST_RINGER_MODE, sendMsg(mAudioHandler, MSG_PERSIST_RINGER_MODE,
SENDMSG_REPLACE, 0, 0, null, PERSIST_DELAY); SENDMSG_REPLACE, 0, 0, null, PERSIST_DELAY);
} }
if (change) {
// Send sticky broadcast
broadcastRingerMode(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION, ringerMode);
}
} }
private void restoreMasterVolume() { private void restoreMasterVolume() {
@@ -3275,9 +3281,9 @@ public class AudioService extends IAudioService.Stub {
return suggestedStreamType; return suggestedStreamType;
} }
private void broadcastRingerMode(int ringerMode) { private void broadcastRingerMode(String action, int ringerMode) {
// Send sticky broadcast // Send sticky broadcast
Intent broadcast = new Intent(AudioManager.RINGER_MODE_CHANGED_ACTION); Intent broadcast = new Intent(action);
broadcast.putExtra(AudioManager.EXTRA_RINGER_MODE, ringerMode); broadcast.putExtra(AudioManager.EXTRA_RINGER_MODE, ringerMode);
broadcast.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT broadcast.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT
| Intent.FLAG_RECEIVER_REPLACE_PENDING); | Intent.FLAG_RECEIVER_REPLACE_PENDING);
@@ -5711,16 +5717,6 @@ public class AudioService extends IAudioService.Stub {
Log.w(TAG, "Error calling dismiss", e); Log.w(TAG, "Error calling dismiss", e);
} }
} }
public void postInternalRingerModeChanged(int mode) {
if (mController == null)
return;
try {
mController.internalRingerModeChanged(mode);
} catch (RemoteException e) {
Log.w(TAG, "Error calling internalRingerModeChanged", e);
}
}
} }
/** /**

View File

@@ -34,6 +34,4 @@ oneway interface IVolumeController {
void setLayoutDirection(int layoutDirection); void setLayoutDirection(int layoutDirection);
void dismiss(); void dismiss();
void internalRingerModeChanged(int mode);
} }

View File

@@ -1030,12 +1030,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
} }
} }
public void onInternalRingerModeChanged() {
if (mIconPolicy != null) {
mIconPolicy.updateVolumeZen();
}
}
private void startKeyguard() { private void startKeyguard() {
KeyguardViewMediator keyguardViewMediator = getComponent(KeyguardViewMediator.class); KeyguardViewMediator keyguardViewMediator = getComponent(KeyguardViewMediator.class);
mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this, mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this,

View File

@@ -90,7 +90,8 @@ public class PhoneStatusBarPolicy {
action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) { action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {
updateBluetooth(); updateBluetooth();
} }
else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) { else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION) ||
action.equals(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION)) {
updateVolumeZen(); updateVolumeZen();
} }
else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) { else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
@@ -116,6 +117,7 @@ public class PhoneStatusBarPolicy {
filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED); filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED); filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED);
filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED); filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
@@ -208,7 +210,7 @@ public class PhoneStatusBarPolicy {
} }
} }
public final void updateVolumeZen() { private final void updateVolumeZen() {
AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
boolean zenVisible = false; boolean zenVisible = false;

View File

@@ -546,6 +546,7 @@ public class VolumePanel extends Handler implements DemoMode {
private void registerReceiver() { private void registerReceiver() {
final IntentFilter filter = new IntentFilter(); final IntentFilter filter = new IntentFilter();
filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);
filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_OFF);
mContext.registerReceiver(new BroadcastReceiver() { mContext.registerReceiver(new BroadcastReceiver() {
@Override @Override
@@ -554,7 +555,12 @@ public class VolumePanel extends Handler implements DemoMode {
if (AudioManager.RINGER_MODE_CHANGED_ACTION.equals(action)) { if (AudioManager.RINGER_MODE_CHANGED_ACTION.equals(action)) {
removeMessages(MSG_RINGER_MODE_CHANGED); removeMessages(MSG_RINGER_MODE_CHANGED);
sendMessage(obtainMessage(MSG_RINGER_MODE_CHANGED)); sendEmptyMessage(MSG_RINGER_MODE_CHANGED);
}
if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) {
removeMessages(MSG_INTERNAL_RINGER_MODE_CHANGED);
sendEmptyMessage(MSG_INTERNAL_RINGER_MODE_CHANGED);
} }
if (Intent.ACTION_SCREEN_OFF.equals(action)) { if (Intent.ACTION_SCREEN_OFF.equals(action)) {
@@ -991,11 +997,6 @@ public class VolumePanel extends Handler implements DemoMode {
obtainMessage(MSG_LAYOUT_DIRECTION, layoutDirection, 0).sendToTarget(); obtainMessage(MSG_LAYOUT_DIRECTION, layoutDirection, 0).sendToTarget();
} }
public void postInternalRingerModeChanged(int mode) {
removeMessages(MSG_INTERNAL_RINGER_MODE_CHANGED);
obtainMessage(MSG_INTERNAL_RINGER_MODE_CHANGED, mode, 0).sendToTarget();
}
private static String flagsToString(int flags) { private static String flagsToString(int flags) {
return flags == 0 ? "0" : (flags + "=" + AudioManager.flagsToString(flags)); return flags == 0 ? "0" : (flags + "=" + AudioManager.flagsToString(flags));
} }

View File

@@ -181,15 +181,6 @@ public class VolumeUI extends SystemUI {
dismissNow(); dismissNow();
} }
@Override
public void internalRingerModeChanged(int mode) throws RemoteException {
mPanel.postInternalRingerModeChanged(mode);
final PhoneStatusBar psb = getComponent(PhoneStatusBar.class);
if (psb != null) {
psb.onInternalRingerModeChanged();
}
}
@Override @Override
public ZenModeController getZenController() { public ZenModeController getZenController() {
return mPanel.getZenController(); return mPanel.getZenController();