diff --git a/src/com/android/settings/accessibility/BalanceSeekBar.java b/src/com/android/settings/accessibility/BalanceSeekBar.java index 15526b65d47..8a88d6c8376 100644 --- a/src/com/android/settings/accessibility/BalanceSeekBar.java +++ b/src/com/android/settings/accessibility/BalanceSeekBar.java @@ -16,6 +16,7 @@ package com.android.settings.accessibility; +import static android.view.HapticFeedbackConstants.CLOCK_TICK; import static com.android.settings.Utils.isNightMode; import android.content.Context; @@ -44,6 +45,7 @@ public class BalanceSeekBar extends SeekBar { private final Context mContext; private final Object mListenerLock = new Object(); private OnSeekBarChangeListener mOnSeekBarChangeListener; + private int mLastProgress = -1; private final OnSeekBarChangeListener mProxySeekBarListener = new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { @@ -73,6 +75,12 @@ public class BalanceSeekBar extends SeekBar { progress = mCenter; seekBar.setProgress(progress); // direct update (fromUser becomes false) } + if (progress != mLastProgress) { + if (progress == mCenter || progress == getMin() || progress == getMax()) { + seekBar.performHapticFeedback(CLOCK_TICK); + } + mLastProgress = progress; + } final float balance = (progress - mCenter) * 0.01f; Settings.System.putFloatForUser(mContext.getContentResolver(), Settings.System.MASTER_BALANCE, balance, UserHandle.USER_CURRENT); @@ -152,10 +160,5 @@ public class BalanceSeekBar extends SeekBar { canvas.restore(); super.onDraw(canvas); } - - @VisibleForTesting - OnSeekBarChangeListener getProxySeekBarListener() { - return mProxySeekBarListener; - } } diff --git a/tests/robotests/src/com/android/settings/accessibility/BalanceSeekBarTest.java b/tests/robotests/src/com/android/settings/accessibility/BalanceSeekBarTest.java index e0dc68160b9..93f1a7b4eb3 100644 --- a/tests/robotests/src/com/android/settings/accessibility/BalanceSeekBarTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/BalanceSeekBarTest.java @@ -16,12 +16,16 @@ package com.android.settings.accessibility; +import static android.view.HapticFeedbackConstants.CLOCK_TICK; +import static android.view.HapticFeedbackConstants.CONTEXT_CLICK; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.robolectric.Shadows.shadowOf; import android.content.Context; import android.util.AttributeSet; @@ -49,7 +53,7 @@ public class BalanceSeekBarTest { public void setUp() { mContext = RuntimeEnvironment.application; mSeekBar = new BalanceSeekBar(mContext, mAttrs); - mProxySeekBarListener = mSeekBar.getProxySeekBarListener(); + mProxySeekBarListener = shadowOf(mSeekBar).getOnSeekBarChangeListener(); mockSeekBarChangeListener = mock(SeekBar.OnSeekBarChangeListener.class); mSeekBar.setOnSeekBarChangeListener(mockSeekBarChangeListener); } @@ -77,6 +81,31 @@ public class BalanceSeekBarTest { eq(MAX_PROGRESS_VALUE), eq(true)); } + @Test + public void onProgressChanged_minimumValue_clockTickFeedbackPerformed() { + mSeekBar.performHapticFeedback(CONTEXT_CLICK); + mProxySeekBarListener.onProgressChanged(mSeekBar, 0, true); + + assertThat(shadowOf(mSeekBar).lastHapticFeedbackPerformed()).isEqualTo(CLOCK_TICK); + } + + @Test + public void onProgressChanged_centerValue_clockTickFeedbackPerformed() { + mSeekBar.performHapticFeedback(CONTEXT_CLICK); + mProxySeekBarListener.onProgressChanged(mSeekBar, MAX_PROGRESS_VALUE / 2, true); + + assertThat(shadowOf(mSeekBar).lastHapticFeedbackPerformed()).isEqualTo(CLOCK_TICK); + } + + @Test + public void onProgressChanged_maximumValue_clockTickFeedbackPerformed() { + mSeekBar.setMax(MAX_PROGRESS_VALUE); + mSeekBar.performHapticFeedback(CONTEXT_CLICK); + mProxySeekBarListener.onProgressChanged(mSeekBar, MAX_PROGRESS_VALUE, true); + + assertThat(shadowOf(mSeekBar).lastHapticFeedbackPerformed()).isEqualTo(CLOCK_TICK); + } + @Test public void setMaxTest_shouldSetValue() { mSeekBar.setMax(MAX_PROGRESS_VALUE);