From e9afa7c7c6f94dc04a5af1541a433d00a0f425f1 Mon Sep 17 00:00:00 2001 From: Jacky Wang Date: Tue, 11 Feb 2025 10:59:58 +0800 Subject: [PATCH] [Catalyst] Fix restriction issue on sound settings After ag/31443354, sliders on sound settings are not disabled when "no_adjust_volume" restriction is set. The root cause is that `SeekBarVolumizer.setSeekBar` updates the SeekBar enabled state. Bug: 386162594 Flag: EXEMPT bugfix Test: atest&manual Change-Id: I5d37c9958a693a26717a8e2d9a62ec5ef225e28f --- .../notification/VolumeSeekBarPreference.java | 25 ++++++++++++------- .../settings/widget/SeekBarPreference.java | 4 ++- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/notification/VolumeSeekBarPreference.java b/src/com/android/settings/notification/VolumeSeekBarPreference.java index 836962875b8..cd16940402e 100644 --- a/src/com/android/settings/notification/VolumeSeekBarPreference.java +++ b/src/com/android/settings/notification/VolumeSeekBarPreference.java @@ -47,7 +47,6 @@ public class VolumeSeekBarPreference extends SeekBarPreference { private final InteractionJankMonitor mJankMonitor = InteractionJankMonitor.getInstance(); - protected SeekBar mSeekBar; private int mStream; private SeekBarVolumizer mVolumizer; @VisibleForTesting @@ -115,17 +114,20 @@ public class VolumeSeekBarPreference extends SeekBarPreference { @Override public void onDetached() { + destroyVolumizer(); + super.onDetached(); + } + + private void destroyVolumizer() { if (mVolumizer != null) { mVolumizer.stop(); mVolumizer = null; } - super.onDetached(); } @Override public void onBindViewHolder(PreferenceViewHolder view) { super.onBindViewHolder(view); - mSeekBar = (SeekBar) view.findViewById(com.android.internal.R.id.seekbar); mIconView = (ImageView) view.findViewById(com.android.internal.R.id.icon); mSuppressionTextView = (TextView) view.findViewById(R.id.suppression_text); mTitle = (TextView) view.findViewById(com.android.internal.R.id.title); @@ -133,15 +135,20 @@ public class VolumeSeekBarPreference extends SeekBarPreference { } protected void onBindViewHolder() { - boolean isEnabled = isEnabled(); - mSeekBar.setEnabled(isEnabled); - if (mVolumizer == null) { - createSeekBarVolumizer(); + if (isEnabled()) { + if (mVolumizer == null) { + createSeekBarVolumizer(); + } + // note that setSeekBar will update enabled state! + mVolumizer.setSeekBar(mSeekBar); + } else { + // destroy volumizer to avoid updateSeekBar reset enabled state + destroyVolumizer(); + mSeekBar.setEnabled(false); } - mVolumizer.setSeekBar(mSeekBar); updateIconView(); updateSuppressionText(); - if (isEnabled && mListener != null) { + if (mListener != null) { mListener.onUpdateMuteState(); } } diff --git a/src/com/android/settings/widget/SeekBarPreference.java b/src/com/android/settings/widget/SeekBarPreference.java index 78f2fa5fe2a..b671a64af4f 100644 --- a/src/com/android/settings/widget/SeekBarPreference.java +++ b/src/com/android/settings/widget/SeekBarPreference.java @@ -33,6 +33,7 @@ import android.view.accessibility.AccessibilityNodeInfo; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; +import androidx.annotation.VisibleForTesting; import androidx.core.content.res.TypedArrayUtils; import androidx.preference.PreferenceViewHolder; @@ -59,7 +60,8 @@ public class SeekBarPreference extends RestrictedPreference private int mHapticFeedbackMode = HAPTIC_FEEDBACK_MODE_NONE; private int mDefaultProgress = -1; - private SeekBar mSeekBar; + @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED) + public SeekBar mSeekBar; private boolean mShouldBlink; private int mAccessibilityRangeInfoType = AccessibilityNodeInfo.RangeInfo.RANGE_TYPE_INT; private CharSequence mOverrideSeekBarStateDescription;