Merge "Add haptic effect for the seekbar in Settings 2/n."

This commit is contained in:
John Li
2020-12-01 10:50:28 +00:00
committed by Android (Google) Code Review
2 changed files with 38 additions and 6 deletions

View File

@@ -16,6 +16,7 @@
package com.android.settings.accessibility; package com.android.settings.accessibility;
import static android.view.HapticFeedbackConstants.CLOCK_TICK;
import static com.android.settings.Utils.isNightMode; import static com.android.settings.Utils.isNightMode;
import android.content.Context; import android.content.Context;
@@ -44,6 +45,7 @@ public class BalanceSeekBar extends SeekBar {
private final Context mContext; private final Context mContext;
private final Object mListenerLock = new Object(); private final Object mListenerLock = new Object();
private OnSeekBarChangeListener mOnSeekBarChangeListener; private OnSeekBarChangeListener mOnSeekBarChangeListener;
private int mLastProgress = -1;
private final OnSeekBarChangeListener mProxySeekBarListener = new OnSeekBarChangeListener() { private final OnSeekBarChangeListener mProxySeekBarListener = new OnSeekBarChangeListener() {
@Override @Override
public void onStopTrackingTouch(SeekBar seekBar) { public void onStopTrackingTouch(SeekBar seekBar) {
@@ -73,6 +75,12 @@ public class BalanceSeekBar extends SeekBar {
progress = mCenter; progress = mCenter;
seekBar.setProgress(progress); // direct update (fromUser becomes false) 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; final float balance = (progress - mCenter) * 0.01f;
Settings.System.putFloatForUser(mContext.getContentResolver(), Settings.System.putFloatForUser(mContext.getContentResolver(),
Settings.System.MASTER_BALANCE, balance, UserHandle.USER_CURRENT); Settings.System.MASTER_BALANCE, balance, UserHandle.USER_CURRENT);
@@ -152,10 +160,5 @@ public class BalanceSeekBar extends SeekBar {
canvas.restore(); canvas.restore();
super.onDraw(canvas); super.onDraw(canvas);
} }
@VisibleForTesting
OnSeekBarChangeListener getProxySeekBarListener() {
return mProxySeekBarListener;
}
} }

View File

@@ -16,12 +16,16 @@
package com.android.settings.accessibility; 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 com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.eq; import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.robolectric.Shadows.shadowOf;
import android.content.Context; import android.content.Context;
import android.util.AttributeSet; import android.util.AttributeSet;
@@ -49,7 +53,7 @@ public class BalanceSeekBarTest {
public void setUp() { public void setUp() {
mContext = RuntimeEnvironment.application; mContext = RuntimeEnvironment.application;
mSeekBar = new BalanceSeekBar(mContext, mAttrs); mSeekBar = new BalanceSeekBar(mContext, mAttrs);
mProxySeekBarListener = mSeekBar.getProxySeekBarListener(); mProxySeekBarListener = shadowOf(mSeekBar).getOnSeekBarChangeListener();
mockSeekBarChangeListener = mock(SeekBar.OnSeekBarChangeListener.class); mockSeekBarChangeListener = mock(SeekBar.OnSeekBarChangeListener.class);
mSeekBar.setOnSeekBarChangeListener(mockSeekBarChangeListener); mSeekBar.setOnSeekBarChangeListener(mockSeekBarChangeListener);
} }
@@ -77,6 +81,31 @@ public class BalanceSeekBarTest {
eq(MAX_PROGRESS_VALUE), eq(true)); 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 @Test
public void setMaxTest_shouldSetValue() { public void setMaxTest_shouldSetValue() {
mSeekBar.setMax(MAX_PROGRESS_VALUE); mSeekBar.setMax(MAX_PROGRESS_VALUE);