diff options
-rw-r--r-- | core/java/android/view/VolumePanel.java | 150 | ||||
-rw-r--r-- | media/java/android/media/AudioService.java | 25 |
2 files changed, 89 insertions, 86 deletions
diff --git a/core/java/android/view/VolumePanel.java b/core/java/android/view/VolumePanel.java index 2497e95..2c5d395 100644 --- a/core/java/android/view/VolumePanel.java +++ b/core/java/android/view/VolumePanel.java @@ -27,6 +27,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Resources; +import android.database.ContentObserver; import android.media.AudioManager; import android.media.AudioService; import android.media.AudioSystem; @@ -38,7 +39,6 @@ import android.os.Message; import android.os.RemoteException; import android.os.Vibrator; import android.provider.Settings; -import android.provider.Settings.System; import android.util.Log; import android.view.WindowManager.LayoutParams; import android.widget.ImageView; @@ -102,8 +102,10 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie private static final int STREAM_MASTER = -100; // Pseudo stream type for remote volume is defined in AudioService.STREAM_REMOTE_MUSIC - public static final String ACTION_VOLUME_OVERLAY_CHANGED - = "android.intent.action.VOLUME_OVERLAY_CHANGED"; + public static final int VOLUME_OVERLAY_SINGLE = 0; + public static final int VOLUME_OVERLAY_EXPANDABLE = 1; + public static final int VOLUME_OVERLAY_EXPANDED = 2; + public static final int VOLUME_OVERLAY_NONE = 3; protected Context mContext; private AudioManager mAudioManager; @@ -111,6 +113,7 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie private boolean mRingIsSilent; private boolean mShowCombinedVolumes; private boolean mVoiceCapable; + private boolean mVolumeLinkNotification; private int mCurrentOverlayStyle = -1; // True if we want to play tones on the system stream when the master stream is specified. @@ -145,7 +148,7 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie R.string.volume_icon_description_ringer, R.drawable.ic_audio_ring_notif, R.drawable.ic_audio_ring_notif_mute, - false), + true), VoiceStream(AudioManager.STREAM_VOICE_CALL, R.string.volume_icon_description_incall, R.drawable.ic_audio_phone, @@ -155,7 +158,7 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie R.string.volume_alarm, R.drawable.ic_audio_alarm, R.drawable.ic_audio_alarm_mute, - false), + true), MediaStream(AudioManager.STREAM_MUSIC, R.string.volume_icon_description_media, R.drawable.ic_audio_vol, @@ -220,6 +223,17 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie private ToneGenerator mToneGenerators[]; private Vibrator mVibrator; + private ContentObserver mSettingsObserver = new ContentObserver(this) { + @Override + public void onChange(boolean selfChange) { + mVolumeLinkNotification = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.VOLUME_LINK_NOTIFICATION, 1) == 1; + final int overlayStyle = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.MODE_VOLUME_OVERLAY, VOLUME_OVERLAY_EXPANDABLE); + changeOverlayStyle(overlayStyle); + } + }; + private static AlertDialog sConfirmSafeVolumeDialog; private static Object sConfirmSafeVolumeLock = new Object(); @@ -269,7 +283,7 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - View view = mView = inflater.inflate(R.layout.volume_adjust, null); + mView = inflater.inflate(R.layout.volume_adjust, null); mView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { resetTimeout(); @@ -315,44 +329,38 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie mToneGenerators = new ToneGenerator[AudioSystem.getNumStreamTypes()]; mVibrator = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE); - mVoiceCapable = context.getResources().getBoolean(R.bool.config_voice_capable); - mShowCombinedVolumes = !mVoiceCapable && !useMasterVolume; - // If we don't want to show multiple volumes, hide the settings button and divider - if (!mShowCombinedVolumes) { - mMoreButton.setVisibility(View.GONE); - mDivider.setVisibility(View.GONE); - } else { - mMoreButton.setOnClickListener(this); - } + // Get the user's preferences + mVolumeLinkNotification = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.VOLUME_LINK_NOTIFICATION, 1) == 1; + final int chosenStyle = Settings.System.getInt(context.getContentResolver(), + Settings.System.MODE_VOLUME_OVERLAY, VOLUME_OVERLAY_EXPANDABLE); + changeOverlayStyle(chosenStyle); + + context.getContentResolver().registerContentObserver( + Settings.System.getUriFor(Settings.System.VOLUME_LINK_NOTIFICATION), false, + mSettingsObserver); + context.getContentResolver().registerContentObserver( + Settings.System.getUriFor(Settings.System.MODE_VOLUME_OVERLAY), false, + mSettingsObserver); + + // This is new with 4.2 it seems boolean masterVolumeOnly = context.getResources().getBoolean( com.android.internal.R.bool.config_useMasterVolume); boolean masterVolumeKeySounds = mContext.getResources().getBoolean( com.android.internal.R.bool.config_useVolumeKeySounds); mPlayMasterStreamTones = masterVolumeOnly && masterVolumeKeySounds; + // End this is new - // get the users preference - int choosenStyle = Settings.System.getInt(context.getContentResolver(),Settings.System.MODE_VOLUME_OVERLAY, -1); - // by default -1 is expected - deal with choosing the right default - if (choosenStyle == -1) { - if (mVoiceCapable) { - choosenStyle = Settings.System.VOLUME_OVERLAY_SINGLE; - } else { - choosenStyle = Settings.System.VOLUME_OVERLAY_EXPANDABLE; - } - } - changeOverlayStyle(choosenStyle); mMoreButton.setOnClickListener(this); - listenToRingerMode(); } private void listenToRingerMode() { final IntentFilter filter = new IntentFilter(); filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); - filter.addAction(ACTION_VOLUME_OVERLAY_CHANGED); mContext.registerReceiver(new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { @@ -361,9 +369,6 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie if (AudioManager.RINGER_MODE_CHANGED_ACTION.equals(action)) { removeMessages(MSG_RINGER_MODE_CHANGED); sendMessage(obtainMessage(MSG_RINGER_MODE_CHANGED)); - } else if (ACTION_VOLUME_OVERLAY_CHANGED.equals(action)) { - int state = (Integer) intent.getExtra("state"); - changeOverlayStyle(state); } } }, filter); @@ -374,31 +379,31 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie // Don't change to the same style if (newStyle == mCurrentOverlayStyle) return; switch (newStyle) { - case Settings.System.VOLUME_OVERLAY_SINGLE : + case VOLUME_OVERLAY_SINGLE : mMoreButton.setVisibility(View.GONE); mDivider.setVisibility(View.GONE); mShowCombinedVolumes = false; - mCurrentOverlayStyle = Settings.System.VOLUME_OVERLAY_SINGLE; + mCurrentOverlayStyle = VOLUME_OVERLAY_SINGLE; break; - case Settings.System.VOLUME_OVERLAY_EXPANDABLE : + case VOLUME_OVERLAY_EXPANDABLE : mMoreButton.setVisibility(View.VISIBLE); mDivider.setVisibility(View.VISIBLE); mShowCombinedVolumes = true; - mCurrentOverlayStyle = Settings.System.VOLUME_OVERLAY_EXPANDABLE; + mCurrentOverlayStyle = VOLUME_OVERLAY_EXPANDABLE; break; - case Settings.System.VOLUME_OVERLAY_EXPANDED : + case VOLUME_OVERLAY_EXPANDED : mMoreButton.setVisibility(View.GONE); mDivider.setVisibility(View.GONE); mShowCombinedVolumes = true; - if (mCurrentOverlayStyle == Settings.System.VOLUME_OVERLAY_NONE) { + if (mCurrentOverlayStyle == VOLUME_OVERLAY_NONE) { addOtherVolumes(); expand(); } - mCurrentOverlayStyle = Settings.System.VOLUME_OVERLAY_EXPANDED; + mCurrentOverlayStyle = VOLUME_OVERLAY_EXPANDED; break; - case Settings.System.VOLUME_OVERLAY_NONE : + case VOLUME_OVERLAY_NONE : mShowCombinedVolumes = false; - mCurrentOverlayStyle = Settings.System.VOLUME_OVERLAY_NONE; + mCurrentOverlayStyle = VOLUME_OVERLAY_NONE; break; } } @@ -434,7 +439,13 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie } private boolean isMuted(int streamType) { - return mAudioManager.isStreamMute(streamType); + if (streamType == STREAM_MASTER) { + return mAudioManager.isMasterMute(); + } else if (streamType == AudioService.STREAM_REMOTE_MUSIC) { + return (mAudioService.getRemoteStreamVolume() <= 0); + } else { + return mAudioManager.isStreamMute(streamType); + } } private void createSliders() { @@ -445,9 +456,6 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie for (int i = 0; i < STREAMS.length; i++) { StreamResources streamRes = STREAMS[i]; int streamType = streamRes.streamType; - if (mVoiceCapable && streamRes == StreamResources.NotificationStream) { - streamRes = StreamResources.RingerStream; - } StreamControl sc = new StreamControl(); sc.streamType = streamType; sc.group = (ViewGroup) inflater.inflate(R.layout.volume_adjust_item, null); @@ -499,6 +507,11 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie if (!mVoiceCapable && streamType == AudioManager.STREAM_RING) { continue; } + // Skip notification volume if linked with ring volume + if (mVoiceCapable && mVolumeLinkNotification && + streamType == AudioManager.STREAM_NOTIFICATION) { + continue; + } StreamControl sc = mStreamControls.get(streamType); mSliderGroup.addView(sc.group); updateSlider(sc); @@ -647,12 +660,11 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie if ((flags & AudioManager.FLAG_SHOW_UI) != 0) { synchronized (this) { - if (mActiveStreamType == -1 || streamType != mActiveStreamType) { - if (streamType != mActiveStreamType && - mCurrentOverlayStyle == Settings.System.VOLUME_OVERLAY_EXPANDABLE) { - hideSlider(mActiveStreamType); - } - reorderSliders(streamType); + if (streamType != mActiveStreamType) { + if (mCurrentOverlayStyle == VOLUME_OVERLAY_EXPANDABLE) { + hideSlider(mActiveStreamType); + } + reorderSliders(streamType); } onShowVolumeChanged(streamType, flags); } @@ -782,30 +794,20 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie } else { sc.seekbarView.setEnabled(true); } - // If adjusting Ring volume and preference is to link it to Notification - if (streamType == mAudioManager.STREAM_RING && - System.getInt(mContext.getContentResolver(),System.VOLUME_LINK_NOTIFICATION, 1) == 1) { - StreamControl notifySc = mStreamControls.get(mAudioManager.STREAM_NOTIFICATION); - if (index > notifySc.seekbarView.getMax()) { - notifySc.seekbarView.setProgress(notifySc.seekbarView.getMax()); - } else { - notifySc.seekbarView.setProgress(index); - } - } } // Only Show if style needs it - if (!mDialog.isShowing() && mCurrentOverlayStyle != Settings.System.VOLUME_OVERLAY_NONE) { + if (!mDialog.isShowing() && mCurrentOverlayStyle != VOLUME_OVERLAY_NONE) { int stream = (streamType == AudioService.STREAM_REMOTE_MUSIC) ? -1 : streamType; // when the stream is for remote playback, use -1 to reset the stream type evaluation mAudioManager.forceVolumeControlStream(stream); mDialog.setContentView(mView); // Showing dialog - use collapsed state - if (mShowCombinedVolumes && mCurrentOverlayStyle != Settings.System.VOLUME_OVERLAY_EXPANDED) { + if (mShowCombinedVolumes && mCurrentOverlayStyle != VOLUME_OVERLAY_EXPANDED) { collapse(); } // If just changed the style and we need to expand - if (mCurrentOverlayStyle == Settings.System.VOLUME_OVERLAY_EXPANDED) { + if (mCurrentOverlayStyle == VOLUME_OVERLAY_EXPANDED) { expand(); } mDialog.show(); @@ -1089,28 +1091,6 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie StreamControl sc = (StreamControl) tag; if (getStreamVolume(sc.streamType) != progress) { setStreamVolume(sc.streamType, progress, 0); - // if audio is linked then adjust other one if change made by user - if (fromUser && System.getInt(mContext.getContentResolver(),System.VOLUME_LINK_NOTIFICATION, 1) == 1) { - if (sc.streamType == AudioManager.STREAM_RING) { - StreamControl notifySc = mStreamControls.get(AudioManager.STREAM_NOTIFICATION); - if (notifySc != null) { - if (progress > notifySc.seekbarView.getMax()) { - notifySc.seekbarView.setProgress(notifySc.seekbarView.getMax()); - } else { - notifySc.seekbarView.setProgress(progress); - } - } - } else if (sc.streamType == AudioManager.STREAM_NOTIFICATION) { - StreamControl phoneSc = mStreamControls.get(AudioManager.STREAM_RING); - if (phoneSc != null) { - if (progress > phoneSc.seekbarView.getMax()) { - phoneSc.seekbarView.setProgress(phoneSc.seekbarView.getMax()); - } else { - phoneSc.seekbarView.setProgress(progress); - } - } - } - } } } resetTimeout(); diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 315196e..fe98458 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -236,7 +236,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished { * NOTE: do not create loops in aliases! * Some streams alias to different streams according to device category (phone or tablet) or * use case (in call s off call...).See updateStreamVolumeAlias() for more details - * mStreamVolumeAlias contains the default aliases for a voice capable device (phone) and + * STREAM_VOLUME_ALIAS contains the default aliases for a voice capable device (phone) and * STREAM_VOLUME_ALIAS_NON_VOICE for a non voice capable device (tablet).*/ private final int[] STREAM_VOLUME_ALIAS = new int[] { AudioSystem.STREAM_VOICE_CALL, // STREAM_VOICE_CALL @@ -278,6 +278,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished { "STREAM_TTS" }; + private boolean mLinkNotificationWithVolume; + private final AudioSystem.ErrorCallback mAudioSystemCallback = new AudioSystem.ErrorCallback() { public void onError(int error) { switch (error) { @@ -619,6 +621,13 @@ public class AudioService extends IAudioService.Stub implements OnFinished { dtmfStreamAlias = AudioSystem.STREAM_VOICE_CALL; } mStreamVolumeAlias[AudioSystem.STREAM_DTMF] = dtmfStreamAlias; + + if (mLinkNotificationWithVolume) { + mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_RING; + } else { + mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_NOTIFICATION; + } + if (updateVolumes) { mStreamStates[AudioSystem.STREAM_DTMF].setAllIndexes(mStreamStates[dtmfStreamAlias], false /*lastAudible*/); @@ -721,6 +730,12 @@ public class AudioService extends IAudioService.Stub implements OnFinished { readDockAudioSettings(cr); } + //****************************************************************** + //TODO: should this be a user specific setting or device (see below) + mLinkNotificationWithVolume = Settings.System.getInt(cr, + Settings.System.VOLUME_LINK_NOTIFICATION, 1) == 1; + //****************************************************************** + mMuteAffectedStreams = System.getIntForUser(cr, System.MUTE_STREAMS_AFFECTED, ((1 << AudioSystem.STREAM_MUSIC)| @@ -3472,6 +3487,14 @@ public class AudioService extends IAudioService.Stub implements OnFinished { setRingerModeInt(getRingerMode(), false); } readDockAudioSettings(mContentResolver); + + mLinkNotificationWithVolume = Settings.System.getInt(mContentResolver, + Settings.System.VOLUME_LINK_NOTIFICATION, 1) == 1; + if (mLinkNotificationWithVolume) { + mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_RING; + } else { + mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_NOTIFICATION; + } } } } |