diff options
author | Mike Lockwood <lockwood@android.com> | 2011-10-27 09:52:41 -0400 |
---|---|---|
committer | Mike Lockwood <lockwood@google.com> | 2012-02-10 09:05:49 -0800 |
commit | 8dc1dabd254249b7ddb8743e88fdb96580ffc585 (patch) | |
tree | 3bff43a9256894541d407f8d6ea18ae375b9ca31 /core/java | |
parent | 8517e46f3d3c2ce11de09aa849a8533ffc1a2026 (diff) | |
download | frameworks_base-8dc1dabd254249b7ddb8743e88fdb96580ffc585.zip frameworks_base-8dc1dabd254249b7ddb8743e88fdb96580ffc585.tar.gz frameworks_base-8dc1dabd254249b7ddb8743e88fdb96580ffc585.tar.bz2 |
VolumePanel: Add support for master volume
Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'core/java')
-rw-r--r-- | core/java/android/view/VolumePanel.java | 91 |
1 files changed, 79 insertions, 12 deletions
diff --git a/core/java/android/view/VolumePanel.java b/core/java/android/view/VolumePanel.java index 24a3066..0d60d3f 100644 --- a/core/java/android/view/VolumePanel.java +++ b/core/java/android/view/VolumePanel.java @@ -92,6 +92,9 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie private static final int MSG_TIMEOUT = 5; private static final int MSG_RINGER_MODE_CHANGED = 6; + // Pseudo stream type for master volume + private static final int STREAM_MASTER = -1; + protected Context mContext; private AudioManager mAudioManager; protected AudioService mAudioService; @@ -148,7 +151,13 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie R.string.volume_icon_description_notification, R.drawable.ic_audio_notification, R.drawable.ic_audio_notification_mute, - true); + true), + // for now, use media resources for master volume + MasterStream(STREAM_MASTER, + R.string.volume_icon_description_media, + R.drawable.ic_audio_vol, + R.drawable.ic_audio_vol_mute, + false); int streamType; int descRes; @@ -173,7 +182,8 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie StreamResources.VoiceStream, StreamResources.MediaStream, StreamResources.NotificationStream, - StreamResources.AlarmStream + StreamResources.AlarmStream, + StreamResources.MasterStream }; /** Object that contains data for each slider */ @@ -195,6 +205,16 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); mAudioService = volumeService; + // For now, only show master volume if master volume is supported + boolean useMasterVolume = context.getResources().getBoolean( + com.android.internal.R.bool.config_useMasterVolume); + if (useMasterVolume) { + for (int i = 0; i < STREAMS.length; i++) { + StreamResources streamRes = STREAMS[i]; + streamRes.show = (streamRes.streamType == STREAM_MASTER); + } + } + LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = mView = inflater.inflate(R.layout.volume_adjust, null); @@ -245,7 +265,7 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie mVibrator = new Vibrator(); mVoiceCapable = context.getResources().getBoolean(R.bool.config_voice_capable); - mShowCombinedVolumes = !mVoiceCapable; + mShowCombinedVolumes = !mVoiceCapable && !useMasterVolume; // If we don't want to show multiple volumes, hide the settings button and divider if (!mShowCombinedVolumes) { mMoreButton.setVisibility(View.GONE); @@ -274,7 +294,49 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie } private boolean isMuted(int streamType) { - return mAudioManager.isStreamMute(streamType); + if (streamType == STREAM_MASTER) { + // master volume mute not yet supported + return false; + } else { + return mAudioService.isStreamMute(streamType); + } + } + + private int getStreamMaxVolume(int streamType) { + // master volume is 0.0f - 1.0f, but we will use 0 - 100 internally + if (streamType == STREAM_MASTER) { + return 100; + } else { + return mAudioService.getStreamMaxVolume(streamType); + } + } + + private int getStreamVolume(int streamType) { + // master volume is 0.0f - 1.0f, but we will use 0 - 100 internally + if (streamType == STREAM_MASTER) { + return Math.round(mAudioService.getMasterVolume() * 100); + } else { + return mAudioService.getStreamVolume(streamType); + } + } + + private void setStreamVolume(int streamType, int index, int flags) { + // master volume is 0.0f - 1.0f, but we will use 0 - 100 internally + if (streamType == STREAM_MASTER) { + mAudioService.setMasterVolume((float)index / 100.0f); + } else { + mAudioService.setStreamVolume(streamType, index, flags); + } + } + + private int getLastAudibleStreamVolume(int streamType) { + // master volume is 0.0f - 1.0f, but we will use 0 - 100 internally + if (streamType == STREAM_MASTER) { + // master volume mute not yet supported + return getStreamVolume(STREAM_MASTER); + } else { + return mAudioService.getLastAudibleStreamVolume(streamType); + } } private void createSliders() { @@ -301,7 +363,7 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie sc.seekbarView = (SeekBar) sc.group.findViewById(R.id.seekbar); int plusOne = (streamType == AudioSystem.STREAM_BLUETOOTH_SCO || streamType == AudioSystem.STREAM_VOICE_CALL) ? 1 : 0; - sc.seekbarView.setMax(mAudioManager.getStreamMaxVolume(streamType) + plusOne); + sc.seekbarView.setMax(getStreamMaxVolume(streamType) + plusOne); sc.seekbarView.setOnSeekBarChangeListener(this); sc.seekbarView.setTag(sc); mStreamControls.put(streamType, sc); @@ -342,7 +404,7 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie /** Update the mute and progress state of a slider */ private void updateSlider(StreamControl sc) { - sc.seekbarView.setProgress(mAudioManager.getLastAudibleStreamVolume(sc.streamType)); + sc.seekbarView.setProgress(getLastAudibleStreamVolume(sc.streamType)); final boolean muted = isMuted(sc.streamType); sc.icon.setImageResource(muted ? sc.iconMuteRes : sc.iconRes); if (sc.streamType == AudioManager.STREAM_RING && muted @@ -390,6 +452,10 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie obtainMessage(MSG_VOLUME_CHANGED, streamType, flags).sendToTarget(); } + public void postMasterVolumeChanged(int flags) { + postVolumeChanged(STREAM_MASTER, flags); + } + /** * Override this if you have other work to do when the volume changes (for * example, vibrating, playing a sound, etc.). Make sure to call through to @@ -424,9 +490,9 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie } protected void onShowVolumeChanged(int streamType, int flags) { - int index = mAudioService.isStreamMute(streamType) ? - mAudioService.getLastAudibleStreamVolume(streamType) - : mAudioService.getStreamVolume(streamType); + int index = isMuted(streamType) ? + getLastAudibleStreamVolume(streamType) + : getStreamVolume(streamType); mRingIsSilent = false; @@ -437,7 +503,7 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie // get max volume for progress bar - int max = mAudioService.getStreamMaxVolume(streamType); + int max = getStreamMaxVolume(streamType); switch (streamType) { @@ -571,6 +637,7 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie * Lock on this VolumePanel instance as long as you use the returned ToneGenerator. */ private ToneGenerator getOrCreateToneGenerator(int streamType) { + if (streamType == STREAM_MASTER) return null; synchronized (this) { if (mToneGenerators[streamType] == null) { try { @@ -671,8 +738,8 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie final Object tag = seekBar.getTag(); if (fromUser && tag instanceof StreamControl) { StreamControl sc = (StreamControl) tag; - if (mAudioManager.getStreamVolume(sc.streamType) != progress) { - mAudioManager.setStreamVolume(sc.streamType, progress, 0); + if (getStreamVolume(sc.streamType) != progress) { + setStreamVolume(sc.streamType, progress, 0); } } resetTimeout(); |