Loading core/java/android/preference/SeekBarVolumizer.java +83 −3 Original line number Original line Diff line number Diff line Loading @@ -27,6 +27,8 @@ import android.media.AudioAttributes; import android.media.AudioManager; import android.media.AudioManager; import android.media.Ringtone; import android.media.Ringtone; import android.media.RingtoneManager; import android.media.RingtoneManager; import android.media.audiopolicy.AudioProductStrategies; import android.media.audiopolicy.AudioVolumeGroups; import android.net.Uri; import android.net.Uri; import android.os.Handler; import android.os.Handler; import android.os.HandlerThread; import android.os.HandlerThread; Loading @@ -41,6 +43,7 @@ import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.SeekBar.OnSeekBarChangeListener; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy; import com.android.internal.os.SomeArgs; /** /** * Turns a {@link SeekBar} into a volume control. * Turns a {@link SeekBar} into a volume control. Loading @@ -62,6 +65,26 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba void onMuted(boolean muted, boolean zenMuted); void onMuted(boolean muted, boolean zenMuted); } } private static final int MSG_GROUP_VOLUME_CHANGED = 1; private final Handler mVolumeHandler = new VolumeHandler(); private final AudioProductStrategies mAudioProductStrategies; private AudioAttributes mAttributes; private int mVolumeGroupId; private final AudioManager.VolumeGroupCallback mVolumeGroupCallback = new AudioManager.VolumeGroupCallback() { @Override public void onAudioVolumeGroupChanged(int group, int flags) { if (mHandler == null) { return; } SomeArgs args = SomeArgs.obtain(); args.arg1 = group; args.arg2 = flags; mVolumeHandler.sendMessage(mHandler.obtainMessage(MSG_GROUP_VOLUME_CHANGED, args)); } }; @UnsupportedAppUsage @UnsupportedAppUsage private final Context mContext; private final Context mContext; private final H mUiHandler = new H(); private final H mUiHandler = new H(); Loading Loading @@ -137,6 +160,15 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba mRingerMode = mAudioManager.getRingerModeInternal(); mRingerMode = mAudioManager.getRingerModeInternal(); } } mZenMode = mNotificationManager.getZenMode(); mZenMode = mNotificationManager.getZenMode(); mAudioProductStrategies = mAudioManager.getAudioProductStrategies(); if (mAudioProductStrategies.size() > 0) { mVolumeGroupId = mAudioProductStrategies.getVolumeGroupIdForLegacyStreamType( mStreamType); mAttributes = mAudioProductStrategies.getAudioAttributesForLegacyStreamType( mStreamType); } mMaxStreamVolume = mAudioManager.getStreamMaxVolume(mStreamType); mMaxStreamVolume = mAudioManager.getStreamMaxVolume(mStreamType); mCallback = callback; mCallback = callback; mOriginalStreamVolume = mAudioManager.getStreamVolume(mStreamType); mOriginalStreamVolume = mAudioManager.getStreamVolume(mStreamType); Loading Loading @@ -297,6 +329,9 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba postStopSample(); postStopSample(); mContext.getContentResolver().unregisterContentObserver(mVolumeObserver); mContext.getContentResolver().unregisterContentObserver(mVolumeObserver); mReceiver.setListening(false); mReceiver.setListening(false); if (mAudioProductStrategies.size() > 0) { unregisterVolumeGroupCb(); } mSeekBar.setOnSeekBarChangeListener(null); mSeekBar.setOnSeekBarChangeListener(null); mHandler.getLooper().quitSafely(); mHandler.getLooper().quitSafely(); mHandler = null; mHandler = null; Loading @@ -314,6 +349,9 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba System.getUriFor(System.VOLUME_SETTINGS_INT[mStreamType]), System.getUriFor(System.VOLUME_SETTINGS_INT[mStreamType]), false, mVolumeObserver); false, mVolumeObserver); mReceiver.setListening(true); mReceiver.setListening(true); if (mAudioProductStrategies.size() > 0) { registerVolumeGroupCb(); } } } public void revertVolume() { public void revertVolume() { Loading Loading @@ -469,7 +507,9 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba if (AudioManager.VOLUME_CHANGED_ACTION.equals(action)) { if (AudioManager.VOLUME_CHANGED_ACTION.equals(action)) { int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); int streamValue = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, -1); int streamValue = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, -1); if (mAudioProductStrategies.size() == 0) { updateVolumeSlider(streamType, streamValue); updateVolumeSlider(streamType, streamValue); } } else if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) { } else if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) { if (mNotificationOrRing) { if (mNotificationOrRing) { mRingerMode = mAudioManager.getRingerModeInternal(); mRingerMode = mAudioManager.getRingerModeInternal(); Loading @@ -479,8 +519,18 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba } } } else if (AudioManager.STREAM_DEVICES_CHANGED_ACTION.equals(action)) { } else if (AudioManager.STREAM_DEVICES_CHANGED_ACTION.equals(action)) { int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); if (mAudioProductStrategies.size() == 0) { int streamVolume = mAudioManager.getStreamVolume(streamType); updateVolumeSlider(streamType, streamVolume); } else { int volumeGroup = mAudioProductStrategies.getVolumeGroupIdForLegacyStreamType( streamType); if (volumeGroup != AudioVolumeGroups.DEFAULT_VOLUME_GROUP && volumeGroup == mVolumeGroupId) { int streamVolume = mAudioManager.getStreamVolume(streamType); int streamVolume = mAudioManager.getStreamVolume(streamType); updateVolumeSlider(streamType, streamVolume); updateVolumeSlider(streamType, streamVolume); } } } else if (NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED.equals(action)) { } else if (NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED.equals(action)) { mZenMode = mNotificationManager.getZenMode(); mZenMode = mNotificationManager.getZenMode(); updateSlider(); updateSlider(); Loading @@ -506,4 +556,34 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba } } } } } } private void registerVolumeGroupCb() { if (mVolumeGroupId != AudioVolumeGroups.DEFAULT_VOLUME_GROUP) { mAudioManager.registerVolumeGroupCallback(Runnable::run, mVolumeGroupCallback); mLastProgress = mAudioManager.getVolumeIndexForAttributes(mAttributes); } } private void unregisterVolumeGroupCb() { if (mVolumeGroupId != AudioVolumeGroups.DEFAULT_VOLUME_GROUP) { mAudioManager.unregisterVolumeGroupCallback(mVolumeGroupCallback); } } private class VolumeHandler extends Handler { @Override public void handleMessage(Message msg) { SomeArgs args = (SomeArgs) msg.obj; switch (msg.what) { case MSG_GROUP_VOLUME_CHANGED: int group = (int) args.arg1; if (mVolumeGroupId != group || mVolumeGroupId == AudioVolumeGroups.DEFAULT_VOLUME_GROUP) { return; } updateSlider(); break; } } } } } Loading
core/java/android/preference/SeekBarVolumizer.java +83 −3 Original line number Original line Diff line number Diff line Loading @@ -27,6 +27,8 @@ import android.media.AudioAttributes; import android.media.AudioManager; import android.media.AudioManager; import android.media.Ringtone; import android.media.Ringtone; import android.media.RingtoneManager; import android.media.RingtoneManager; import android.media.audiopolicy.AudioProductStrategies; import android.media.audiopolicy.AudioVolumeGroups; import android.net.Uri; import android.net.Uri; import android.os.Handler; import android.os.Handler; import android.os.HandlerThread; import android.os.HandlerThread; Loading @@ -41,6 +43,7 @@ import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.SeekBar.OnSeekBarChangeListener; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy; import com.android.internal.os.SomeArgs; /** /** * Turns a {@link SeekBar} into a volume control. * Turns a {@link SeekBar} into a volume control. Loading @@ -62,6 +65,26 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba void onMuted(boolean muted, boolean zenMuted); void onMuted(boolean muted, boolean zenMuted); } } private static final int MSG_GROUP_VOLUME_CHANGED = 1; private final Handler mVolumeHandler = new VolumeHandler(); private final AudioProductStrategies mAudioProductStrategies; private AudioAttributes mAttributes; private int mVolumeGroupId; private final AudioManager.VolumeGroupCallback mVolumeGroupCallback = new AudioManager.VolumeGroupCallback() { @Override public void onAudioVolumeGroupChanged(int group, int flags) { if (mHandler == null) { return; } SomeArgs args = SomeArgs.obtain(); args.arg1 = group; args.arg2 = flags; mVolumeHandler.sendMessage(mHandler.obtainMessage(MSG_GROUP_VOLUME_CHANGED, args)); } }; @UnsupportedAppUsage @UnsupportedAppUsage private final Context mContext; private final Context mContext; private final H mUiHandler = new H(); private final H mUiHandler = new H(); Loading Loading @@ -137,6 +160,15 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba mRingerMode = mAudioManager.getRingerModeInternal(); mRingerMode = mAudioManager.getRingerModeInternal(); } } mZenMode = mNotificationManager.getZenMode(); mZenMode = mNotificationManager.getZenMode(); mAudioProductStrategies = mAudioManager.getAudioProductStrategies(); if (mAudioProductStrategies.size() > 0) { mVolumeGroupId = mAudioProductStrategies.getVolumeGroupIdForLegacyStreamType( mStreamType); mAttributes = mAudioProductStrategies.getAudioAttributesForLegacyStreamType( mStreamType); } mMaxStreamVolume = mAudioManager.getStreamMaxVolume(mStreamType); mMaxStreamVolume = mAudioManager.getStreamMaxVolume(mStreamType); mCallback = callback; mCallback = callback; mOriginalStreamVolume = mAudioManager.getStreamVolume(mStreamType); mOriginalStreamVolume = mAudioManager.getStreamVolume(mStreamType); Loading Loading @@ -297,6 +329,9 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba postStopSample(); postStopSample(); mContext.getContentResolver().unregisterContentObserver(mVolumeObserver); mContext.getContentResolver().unregisterContentObserver(mVolumeObserver); mReceiver.setListening(false); mReceiver.setListening(false); if (mAudioProductStrategies.size() > 0) { unregisterVolumeGroupCb(); } mSeekBar.setOnSeekBarChangeListener(null); mSeekBar.setOnSeekBarChangeListener(null); mHandler.getLooper().quitSafely(); mHandler.getLooper().quitSafely(); mHandler = null; mHandler = null; Loading @@ -314,6 +349,9 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba System.getUriFor(System.VOLUME_SETTINGS_INT[mStreamType]), System.getUriFor(System.VOLUME_SETTINGS_INT[mStreamType]), false, mVolumeObserver); false, mVolumeObserver); mReceiver.setListening(true); mReceiver.setListening(true); if (mAudioProductStrategies.size() > 0) { registerVolumeGroupCb(); } } } public void revertVolume() { public void revertVolume() { Loading Loading @@ -469,7 +507,9 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba if (AudioManager.VOLUME_CHANGED_ACTION.equals(action)) { if (AudioManager.VOLUME_CHANGED_ACTION.equals(action)) { int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); int streamValue = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, -1); int streamValue = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, -1); if (mAudioProductStrategies.size() == 0) { updateVolumeSlider(streamType, streamValue); updateVolumeSlider(streamType, streamValue); } } else if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) { } else if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) { if (mNotificationOrRing) { if (mNotificationOrRing) { mRingerMode = mAudioManager.getRingerModeInternal(); mRingerMode = mAudioManager.getRingerModeInternal(); Loading @@ -479,8 +519,18 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba } } } else if (AudioManager.STREAM_DEVICES_CHANGED_ACTION.equals(action)) { } else if (AudioManager.STREAM_DEVICES_CHANGED_ACTION.equals(action)) { int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); if (mAudioProductStrategies.size() == 0) { int streamVolume = mAudioManager.getStreamVolume(streamType); updateVolumeSlider(streamType, streamVolume); } else { int volumeGroup = mAudioProductStrategies.getVolumeGroupIdForLegacyStreamType( streamType); if (volumeGroup != AudioVolumeGroups.DEFAULT_VOLUME_GROUP && volumeGroup == mVolumeGroupId) { int streamVolume = mAudioManager.getStreamVolume(streamType); int streamVolume = mAudioManager.getStreamVolume(streamType); updateVolumeSlider(streamType, streamVolume); updateVolumeSlider(streamType, streamVolume); } } } else if (NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED.equals(action)) { } else if (NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED.equals(action)) { mZenMode = mNotificationManager.getZenMode(); mZenMode = mNotificationManager.getZenMode(); updateSlider(); updateSlider(); Loading @@ -506,4 +556,34 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba } } } } } } private void registerVolumeGroupCb() { if (mVolumeGroupId != AudioVolumeGroups.DEFAULT_VOLUME_GROUP) { mAudioManager.registerVolumeGroupCallback(Runnable::run, mVolumeGroupCallback); mLastProgress = mAudioManager.getVolumeIndexForAttributes(mAttributes); } } private void unregisterVolumeGroupCb() { if (mVolumeGroupId != AudioVolumeGroups.DEFAULT_VOLUME_GROUP) { mAudioManager.unregisterVolumeGroupCallback(mVolumeGroupCallback); } } private class VolumeHandler extends Handler { @Override public void handleMessage(Message msg) { SomeArgs args = (SomeArgs) msg.obj; switch (msg.what) { case MSG_GROUP_VOLUME_CHANGED: int group = (int) args.arg1; if (mVolumeGroupId != group || mVolumeGroupId == AudioVolumeGroups.DEFAULT_VOLUME_GROUP) { return; } updateSlider(); break; } } } } }