Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1a7445ad authored by Alexandr Shabalin's avatar Alexandr Shabalin Committed by Android (Google) Code Review
Browse files

Merge "Align the Talkback slider percentage announcement with the UI." into main

parents f239e535 a597785f
Loading
Loading
Loading
Loading
+11 −16
Original line number Diff line number Diff line
@@ -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;
@@ -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);
@@ -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);
                    }
                }

+53 −5
Original line number Diff line number Diff line
@@ -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) {
@@ -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) {
@@ -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());
    }
}