Merge "Override the state description of volume seekbar." into udc-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
4b77d876b9
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (C) 2023 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.notification;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
import android.preference.SeekBarVolumizer;
|
||||
|
||||
/**
|
||||
* Testable wrapper around {@link SeekBarVolumizer} constructor.
|
||||
*/
|
||||
public class SeekBarVolumizerFactory {
|
||||
private final Context mContext;
|
||||
|
||||
public SeekBarVolumizerFactory(Context context) {
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new SeekBarVolumizer.
|
||||
*
|
||||
* @param streamType of the audio manager.
|
||||
* @param defaultUri of the volume.
|
||||
* @param sbvc callback of the seekbar volumizer.
|
||||
* @return a SeekBarVolumizer.
|
||||
*/
|
||||
public SeekBarVolumizer create(int streamType, Uri defaultUri, SeekBarVolumizer.Callback sbvc) {
|
||||
return new SeekBarVolumizer(mContext, streamType, defaultUri, sbvc);
|
||||
}
|
||||
}
|
@@ -37,6 +37,8 @@ import com.android.internal.jank.InteractionJankMonitor;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.widget.SeekBarPreference;
|
||||
|
||||
import java.text.NumberFormat;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
|
||||
/** A slider preference that directly controls an audio stream volume (no dialog) **/
|
||||
@@ -47,8 +49,9 @@ public class VolumeSeekBarPreference extends SeekBarPreference {
|
||||
|
||||
protected SeekBar mSeekBar;
|
||||
private int mStream;
|
||||
private SeekBarVolumizer mVolumizer;
|
||||
@VisibleForTesting
|
||||
SeekBarVolumizer mVolumizer;
|
||||
SeekBarVolumizerFactory mSeekBarVolumizerFactory;
|
||||
private Callback mCallback;
|
||||
private Listener mListener;
|
||||
private ImageView mIconView;
|
||||
@@ -62,30 +65,36 @@ public class VolumeSeekBarPreference extends SeekBarPreference {
|
||||
private boolean mStopped;
|
||||
@VisibleForTesting
|
||||
AudioManager mAudioManager;
|
||||
private Locale mLocale;
|
||||
private NumberFormat mNumberFormat;
|
||||
|
||||
public VolumeSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr,
|
||||
int defStyleRes) {
|
||||
super(context, attrs, defStyleAttr, defStyleRes);
|
||||
setLayoutResource(R.layout.preference_volume_slider);
|
||||
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
|
||||
mSeekBarVolumizerFactory = new SeekBarVolumizerFactory(context);
|
||||
}
|
||||
|
||||
public VolumeSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
setLayoutResource(R.layout.preference_volume_slider);
|
||||
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
|
||||
mSeekBarVolumizerFactory = new SeekBarVolumizerFactory(context);
|
||||
}
|
||||
|
||||
public VolumeSeekBarPreference(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
setLayoutResource(R.layout.preference_volume_slider);
|
||||
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
|
||||
mSeekBarVolumizerFactory = new SeekBarVolumizerFactory(context);
|
||||
}
|
||||
|
||||
public VolumeSeekBarPreference(Context context) {
|
||||
super(context);
|
||||
setLayoutResource(R.layout.preference_volume_slider);
|
||||
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
|
||||
mSeekBarVolumizerFactory = new SeekBarVolumizerFactory(context);
|
||||
}
|
||||
|
||||
public void setStream(int stream) {
|
||||
@@ -143,6 +152,7 @@ public class VolumeSeekBarPreference extends SeekBarPreference {
|
||||
if (mCallback != null) {
|
||||
mCallback.onStreamValueChanged(mStream, progress);
|
||||
}
|
||||
overrideSeekBarStateDescription(formatStateDescription(progress));
|
||||
}
|
||||
@Override
|
||||
public void onMuted(boolean muted, boolean zenMuted) {
|
||||
@@ -170,7 +180,7 @@ public class VolumeSeekBarPreference extends SeekBarPreference {
|
||||
};
|
||||
final Uri sampleUri = mStream == AudioManager.STREAM_MUSIC ? getMediaVolumeUri() : null;
|
||||
if (mVolumizer == null) {
|
||||
mVolumizer = new SeekBarVolumizer(getContext(), mStream, sampleUri, sbvc);
|
||||
mVolumizer = mSeekBarVolumizerFactory.create(mStream, sampleUri, sbvc);
|
||||
}
|
||||
mVolumizer.start();
|
||||
mVolumizer.setSeekBar(mSeekBar);
|
||||
@@ -216,6 +226,33 @@ public class VolumeSeekBarPreference extends SeekBarPreference {
|
||||
+ "/" + R.raw.media_volume);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
CharSequence formatStateDescription(int progress) {
|
||||
// This code follows the same approach in ProgressBar.java, but it rounds down the percent
|
||||
// to match it with what the talkback feature says after any progress change. (b/285458191)
|
||||
// Cache the locale-appropriate NumberFormat. Configuration locale is guaranteed
|
||||
// non-null, so the first time this is called we will always get the appropriate
|
||||
// NumberFormat, then never regenerate it unless the locale changes on the fly.
|
||||
Locale curLocale = getContext().getResources().getConfiguration().getLocales().get(0);
|
||||
if (mLocale == null || !mLocale.equals(curLocale)) {
|
||||
mLocale = curLocale;
|
||||
mNumberFormat = NumberFormat.getPercentInstance(mLocale);
|
||||
}
|
||||
return mNumberFormat.format(getPercent(progress));
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
double getPercent(float progress) {
|
||||
final float maxProgress = getMax();
|
||||
final float minProgress = getMin();
|
||||
final float diffProgress = maxProgress - minProgress;
|
||||
if (diffProgress <= 0.0f) {
|
||||
return 0.0f;
|
||||
}
|
||||
final float percent = (progress - minProgress) / diffProgress;
|
||||
return Math.floor(Math.max(0.0f, Math.min(1.0f, percent)) * 100) / 100;
|
||||
}
|
||||
|
||||
public void setSuppressionText(String text) {
|
||||
if (Objects.equals(text, mSuppressionText)) return;
|
||||
mSuppressionText = text;
|
||||
|
Reference in New Issue
Block a user