Merge "Add haptic effect for the seekbar in Settings 2/n."
This commit is contained in:
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user