diff options
| author | 2025-03-10 15:31:22 +0800 | |
|---|---|---|
| committer | 2025-03-12 11:39:29 +0800 | |
| commit | d39a4cf5bf93463a9e02bfbeaa8c66acc33a09de (patch) | |
| tree | 8603031d1e8951f0db301c0af4a270c17a855184 | |
| parent | e79b4fc3b2a39133ed34171ea3f72ddf0c7ce13e (diff) | |
[Expressive Design] Update sliderPreference
- Set slider in discrete mode if only the `int` position is valid in `SliderPreference`.
- Provide a method to change the visibility of tick marks.
- Add haptic feedback.
Bug: 378392789
Test: atest BatterySaverSchedulePreferenceControllerTest BatterySaverSliderPreferenceControllerTest
Flag: com.android.settingslib.widget.theme.flags.is_expressive_design_enabled
Change-Id: Ia052254450419f97fb02f8c4713dc6f9d8f666cb
| -rw-r--r-- | packages/SettingsLib/SliderPreference/src/com/android/settingslib/widget/SliderPreference.java | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/packages/SettingsLib/SliderPreference/src/com/android/settingslib/widget/SliderPreference.java b/packages/SettingsLib/SliderPreference/src/com/android/settingslib/widget/SliderPreference.java index fe8e8b6f1d46..6d02c5d48715 100644 --- a/packages/SettingsLib/SliderPreference/src/com/android/settingslib/widget/SliderPreference.java +++ b/packages/SettingsLib/SliderPreference/src/com/android/settingslib/widget/SliderPreference.java @@ -16,6 +16,8 @@ package com.android.settingslib.widget; +import static android.view.HapticFeedbackConstants.CLOCK_TICK; + import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Resources; @@ -46,6 +48,9 @@ import com.google.android.material.slider.Slider; */ public class SliderPreference extends Preference { private static final String TAG = "SliderPreference"; + public static final int HAPTIC_FEEDBACK_MODE_NONE = 0; + public static final int HAPTIC_FEEDBACK_MODE_ON_TICKS = 1; + public static final int HAPTIC_FEEDBACK_MODE_ON_ENDS = 2; private final int mTextStartId; private final int mTextEndId; @@ -71,6 +76,8 @@ public class SliderPreference extends Preference { private int mMin; private int mMax; private int mSliderIncrement; + private int mHapticFeedbackMode = HAPTIC_FEEDBACK_MODE_NONE; + private boolean mTickVisible = false; private boolean mAdjustable; private boolean mTrackingTouch; private CharSequence mSliderContentDescription; @@ -265,6 +272,7 @@ public class SliderPreference extends Preference { } if (mSliderIncrement != 0) { mSlider.setStepSize(mSliderIncrement); + mSlider.setTickVisible(mTickVisible); } else { mSliderIncrement = (int) (mSlider.getStepSize()); } @@ -442,6 +450,29 @@ public class SliderPreference extends Preference { } /** + * Sets the haptic feedback mode. HAPTIC_FEEDBACK_MODE_ON_TICKS means to perform haptic feedback + * as the {@link Slider} value is updated; HAPTIC_FEEDBACK_MODE_ON_ENDS means to perform haptic + * feedback as the {@link Slider} value is equal to the min/max value. + * + * @param hapticFeedbackMode The haptic feedback mode. + */ + public void setHapticFeedbackMode(int hapticFeedbackMode) { + mHapticFeedbackMode = hapticFeedbackMode; + } + + /** + * Sets whether the tick marks are visible. Only used when the slider is in discrete mode. + * + * @param tickVisible The visibility of tick marks. + */ + public void setTickVisible(boolean tickVisible) { + if (tickVisible != mTickVisible) { + mTickVisible = tickVisible; + notifyChanged(); + } + } + + /** * Gets whether the current {@link Slider} value is displayed to the user. * * @return Whether the current {@link Slider} value is displayed to the user @@ -519,7 +550,16 @@ public class SliderPreference extends Preference { if (sliderValue != mSliderValue) { if (callChangeListener(sliderValue)) { setValueInternal(sliderValue, false); - // TODO: mHapticFeedbackMode + switch (mHapticFeedbackMode) { + case HAPTIC_FEEDBACK_MODE_ON_TICKS: + slider.performHapticFeedback(CLOCK_TICK); + break; + case HAPTIC_FEEDBACK_MODE_ON_ENDS: + if (mSliderValue == mMax || mSliderValue == mMin) { + slider.performHapticFeedback(CLOCK_TICK); + } + break; + } } else { slider.setValue(mSliderValue); } |