Loading packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java +11 −16 Original line number Diff line number Diff line Loading @@ -16,8 +16,6 @@ package com.android.systemui.media.dialog; import static com.android.systemui.media.dialog.MediaOutputSeekbar.VOLUME_PERCENTAGE_SCALE_SIZE; import android.animation.Animator; import android.animation.ValueAnimator; import android.app.WallpaperColors; Loading Loading @@ -289,10 +287,7 @@ public abstract class MediaOutputBaseAdapter extends } } else { if (!mVolumeAnimator.isStarted()) { int percentage = (int) ((double) currentVolume * VOLUME_PERCENTAGE_SCALE_SIZE / (double) mSeekBar.getMax()); if (percentage == 0) { if (currentVolume == 0) { updateMutedVolumeIcon(device); } else { updateUnmutedVolumeIcon(device); Loading @@ -319,20 +314,20 @@ public abstract class MediaOutputBaseAdapter extends if (device == null || !fromUser) { return; } int progressToVolume = MediaOutputSeekbar.scaleProgressToVolume(progress); int deviceVolume = device.getCurrentVolume(); int percentage = (int) ((double) progressToVolume * VOLUME_PERCENTAGE_SCALE_SIZE / (double) seekBar.getMax()); mVolumeValueText.setText(mContext.getResources().getString( R.string.media_output_dialog_volume_percentage, percentage)); final String percentageString = mContext.getResources().getString( R.string.media_output_dialog_volume_percentage, mSeekBar.getPercentage()); mVolumeValueText.setText(percentageString); if (mStartFromMute) { updateUnmutedVolumeIcon(device); mStartFromMute = false; } if (progressToVolume != deviceVolume) { mLatestUpdateVolume = progressToVolume; mController.adjustVolume(device, progressToVolume); int seekBarVolume = MediaOutputSeekbar.scaleProgressToVolume(progress); if (seekBarVolume != device.getCurrentVolume()) { mLatestUpdateVolume = seekBarVolume; mController.adjustVolume(device, seekBarVolume); } } Loading packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputSeekbar.java +53 −5 Original line number Diff line number Diff line Loading @@ -16,22 +16,62 @@ package com.android.systemui.media.dialog; import android.annotation.Nullable; import android.content.Context; import android.util.AttributeSet; import android.widget.SeekBar; import com.android.systemui.res.R; /** * Customized SeekBar for MediaOutputDialog, apply scale between device volume and progress, to make * adjustment smoother. */ public class MediaOutputSeekbar extends SeekBar { // The scale is added to make slider value change smooth. private static final int SCALE_SIZE = 1000; private static final int INITIAL_PROGRESS = 500; public static final int VOLUME_PERCENTAGE_SCALE_SIZE = 100000; @Nullable private SeekBar.OnSeekBarChangeListener mOnSeekBarChangeListener = null; public MediaOutputSeekbar(Context context, AttributeSet attrs) { super(context, attrs); setMin(0); super.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { final String percentageString = context.getResources().getString( R.string.media_output_dialog_volume_percentage, getPercentage()); // Override the default TTS for the seekbar. The percentage should correspond to // the volume value, not the progress value. I.e. for the volume range 0 - 25, the // percentage should be 0%, 4%, 8%, etc. It should never be 6% since 6% doesn't map // to an integer volume value. setStateDescription(percentageString); if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onProgressChanged(seekBar, progress, fromUser); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onStartTrackingTouch(seekBar); } } @Override public void onStopTrackingTouch(SeekBar seekBar) { if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onStopTrackingTouch(seekBar); } } }); } @Override public void setOnSeekBarChangeListener(@Nullable SeekBar.OnSeekBarChangeListener listener) { mOnSeekBarChangeListener = listener; } static int scaleProgressToVolume(int progress) { Loading @@ -39,11 +79,11 @@ public class MediaOutputSeekbar extends SeekBar { } static int scaleVolumeToProgress(int volume) { return volume == 0 ? 0 : INITIAL_PROGRESS + volume * SCALE_SIZE; return volume * SCALE_SIZE; } int getVolume() { return getProgress() / SCALE_SIZE; return scaleProgressToVolume(getProgress()); } void setVolume(int volume) { Loading @@ -51,10 +91,18 @@ public class MediaOutputSeekbar extends SeekBar { } void setMaxVolume(int maxVolume) { setMax(maxVolume * SCALE_SIZE); setMax(scaleVolumeToProgress(maxVolume)); } void resetVolume() { setProgress(getMin()); } int getPercentage() { // The progress -> volume -> progress conversion is necessary to ensure that progress // strictly corresponds to an integer volume value. // Example: 10424 (progress) -> 10 (volume) -> 10000 (progress). int normalizedProgress = scaleVolumeToProgress(scaleProgressToVolume(getProgress())); return (int) ((double) normalizedProgress * 100 / getMax()); } } Loading
packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java +11 −16 Original line number Diff line number Diff line Loading @@ -16,8 +16,6 @@ package com.android.systemui.media.dialog; import static com.android.systemui.media.dialog.MediaOutputSeekbar.VOLUME_PERCENTAGE_SCALE_SIZE; import android.animation.Animator; import android.animation.ValueAnimator; import android.app.WallpaperColors; Loading Loading @@ -289,10 +287,7 @@ public abstract class MediaOutputBaseAdapter extends } } else { if (!mVolumeAnimator.isStarted()) { int percentage = (int) ((double) currentVolume * VOLUME_PERCENTAGE_SCALE_SIZE / (double) mSeekBar.getMax()); if (percentage == 0) { if (currentVolume == 0) { updateMutedVolumeIcon(device); } else { updateUnmutedVolumeIcon(device); Loading @@ -319,20 +314,20 @@ public abstract class MediaOutputBaseAdapter extends if (device == null || !fromUser) { return; } int progressToVolume = MediaOutputSeekbar.scaleProgressToVolume(progress); int deviceVolume = device.getCurrentVolume(); int percentage = (int) ((double) progressToVolume * VOLUME_PERCENTAGE_SCALE_SIZE / (double) seekBar.getMax()); mVolumeValueText.setText(mContext.getResources().getString( R.string.media_output_dialog_volume_percentage, percentage)); final String percentageString = mContext.getResources().getString( R.string.media_output_dialog_volume_percentage, mSeekBar.getPercentage()); mVolumeValueText.setText(percentageString); if (mStartFromMute) { updateUnmutedVolumeIcon(device); mStartFromMute = false; } if (progressToVolume != deviceVolume) { mLatestUpdateVolume = progressToVolume; mController.adjustVolume(device, progressToVolume); int seekBarVolume = MediaOutputSeekbar.scaleProgressToVolume(progress); if (seekBarVolume != device.getCurrentVolume()) { mLatestUpdateVolume = seekBarVolume; mController.adjustVolume(device, seekBarVolume); } } Loading
packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputSeekbar.java +53 −5 Original line number Diff line number Diff line Loading @@ -16,22 +16,62 @@ package com.android.systemui.media.dialog; import android.annotation.Nullable; import android.content.Context; import android.util.AttributeSet; import android.widget.SeekBar; import com.android.systemui.res.R; /** * Customized SeekBar for MediaOutputDialog, apply scale between device volume and progress, to make * adjustment smoother. */ public class MediaOutputSeekbar extends SeekBar { // The scale is added to make slider value change smooth. private static final int SCALE_SIZE = 1000; private static final int INITIAL_PROGRESS = 500; public static final int VOLUME_PERCENTAGE_SCALE_SIZE = 100000; @Nullable private SeekBar.OnSeekBarChangeListener mOnSeekBarChangeListener = null; public MediaOutputSeekbar(Context context, AttributeSet attrs) { super(context, attrs); setMin(0); super.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { final String percentageString = context.getResources().getString( R.string.media_output_dialog_volume_percentage, getPercentage()); // Override the default TTS for the seekbar. The percentage should correspond to // the volume value, not the progress value. I.e. for the volume range 0 - 25, the // percentage should be 0%, 4%, 8%, etc. It should never be 6% since 6% doesn't map // to an integer volume value. setStateDescription(percentageString); if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onProgressChanged(seekBar, progress, fromUser); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onStartTrackingTouch(seekBar); } } @Override public void onStopTrackingTouch(SeekBar seekBar) { if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onStopTrackingTouch(seekBar); } } }); } @Override public void setOnSeekBarChangeListener(@Nullable SeekBar.OnSeekBarChangeListener listener) { mOnSeekBarChangeListener = listener; } static int scaleProgressToVolume(int progress) { Loading @@ -39,11 +79,11 @@ public class MediaOutputSeekbar extends SeekBar { } static int scaleVolumeToProgress(int volume) { return volume == 0 ? 0 : INITIAL_PROGRESS + volume * SCALE_SIZE; return volume * SCALE_SIZE; } int getVolume() { return getProgress() / SCALE_SIZE; return scaleProgressToVolume(getProgress()); } void setVolume(int volume) { Loading @@ -51,10 +91,18 @@ public class MediaOutputSeekbar extends SeekBar { } void setMaxVolume(int maxVolume) { setMax(maxVolume * SCALE_SIZE); setMax(scaleVolumeToProgress(maxVolume)); } void resetVolume() { setProgress(getMin()); } int getPercentage() { // The progress -> volume -> progress conversion is necessary to ensure that progress // strictly corresponds to an integer volume value. // Example: 10424 (progress) -> 10 (volume) -> 10000 (progress). int normalizedProgress = scaleVolumeToProgress(scaleProgressToVolume(getProgress())); return (int) ((double) normalizedProgress * 100 / getMax()); } }