summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Keyvan Amiri <keyvana@google.com> 2016-09-29 17:53:24 -0700
committer Keyvan Amiri <keyvana@google.com> 2016-10-04 12:56:47 -0700
commit86fb2a2b678288214ddb30ffafbd42eccfea6733 (patch)
treef2d5bf75a50f7df785a613eae915cbf3fb6ed7c7
parentde7a02299e649231425670131eb88cdc28f073d6 (diff)
Added min support to ProgressBar and SeekBar
ProgressBar, AbsSeekBar, and SeekBar now support min attributes for the lower range of the progress bar. It used to be 0 by default. Change-Id: I3308eff80f4c7f58a940dec9cc517dcdff4a1d83
-rw-r--r--api/current.txt3
-rw-r--r--api/system-current.txt3
-rw-r--r--api/test-current.txt3
-rw-r--r--core/java/android/widget/AbsSeekBar.java37
-rw-r--r--core/java/android/widget/ProgressBar.java74
-rw-r--r--core/java/android/widget/SeekBar.java6
-rw-r--r--core/res/res/values/attrs.xml9
-rw-r--r--core/res/res/values/public.xml1
8 files changed, 115 insertions, 21 deletions
diff --git a/api/current.txt b/api/current.txt
index 7b8930c0cd8e..6e5666c22fce 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -855,6 +855,7 @@ package android {
field public static final int mediaRouteTypes = 16843694; // 0x10103ae
field public static final int menuCategory = 16843230; // 0x10101de
field public static final int mimeType = 16842790; // 0x1010026
+ field public static final int min = 16843367; // 0x1010267
field public static final int minDate = 16843583; // 0x101033f
field public static final int minEms = 16843098; // 0x101015a
field public static final int minHeight = 16843072; // 0x1010140
@@ -47475,6 +47476,7 @@ package android.widget {
method public android.graphics.PorterDuff.Mode getIndeterminateTintMode();
method public android.view.animation.Interpolator getInterpolator();
method public synchronized int getMax();
+ method public synchronized int getMin();
method public synchronized int getProgress();
method public android.content.res.ColorStateList getProgressBackgroundTintList();
method public android.graphics.PorterDuff.Mode getProgressBackgroundTintMode();
@@ -47497,6 +47499,7 @@ package android.widget {
method public void setInterpolator(android.content.Context, int);
method public void setInterpolator(android.view.animation.Interpolator);
method public synchronized void setMax(int);
+ method public synchronized void setMin(int);
method public synchronized void setProgress(int);
method public void setProgress(int, boolean);
method public void setProgressBackgroundTintList(android.content.res.ColorStateList);
diff --git a/api/system-current.txt b/api/system-current.txt
index ca1c61d433a1..7044e7799618 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -962,6 +962,7 @@ package android {
field public static final int mediaRouteTypes = 16843694; // 0x10103ae
field public static final int menuCategory = 16843230; // 0x10101de
field public static final int mimeType = 16842790; // 0x1010026
+ field public static final int min = 16843367; // 0x1010267
field public static final int minDate = 16843583; // 0x101033f
field public static final int minEms = 16843098; // 0x101015a
field public static final int minHeight = 16843072; // 0x1010140
@@ -51012,6 +51013,7 @@ package android.widget {
method public android.graphics.PorterDuff.Mode getIndeterminateTintMode();
method public android.view.animation.Interpolator getInterpolator();
method public synchronized int getMax();
+ method public synchronized int getMin();
method public synchronized int getProgress();
method public android.content.res.ColorStateList getProgressBackgroundTintList();
method public android.graphics.PorterDuff.Mode getProgressBackgroundTintMode();
@@ -51034,6 +51036,7 @@ package android.widget {
method public void setInterpolator(android.content.Context, int);
method public void setInterpolator(android.view.animation.Interpolator);
method public synchronized void setMax(int);
+ method public synchronized void setMin(int);
method public synchronized void setProgress(int);
method public void setProgress(int, boolean);
method public void setProgressBackgroundTintList(android.content.res.ColorStateList);
diff --git a/api/test-current.txt b/api/test-current.txt
index eda4019fe592..0ad3466e49cb 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -855,6 +855,7 @@ package android {
field public static final int mediaRouteTypes = 16843694; // 0x10103ae
field public static final int menuCategory = 16843230; // 0x10101de
field public static final int mimeType = 16842790; // 0x1010026
+ field public static final int min = 16843367; // 0x1010267
field public static final int minDate = 16843583; // 0x101033f
field public static final int minEms = 16843098; // 0x101015a
field public static final int minHeight = 16843072; // 0x1010140
@@ -47563,6 +47564,7 @@ package android.widget {
method public android.graphics.PorterDuff.Mode getIndeterminateTintMode();
method public android.view.animation.Interpolator getInterpolator();
method public synchronized int getMax();
+ method public synchronized int getMin();
method public synchronized int getProgress();
method public android.content.res.ColorStateList getProgressBackgroundTintList();
method public android.graphics.PorterDuff.Mode getProgressBackgroundTintMode();
@@ -47585,6 +47587,7 @@ package android.widget {
method public void setInterpolator(android.content.Context, int);
method public void setInterpolator(android.view.animation.Interpolator);
method public synchronized void setMax(int);
+ method public synchronized void setMin(int);
method public synchronized void setProgress(int);
method public void setProgress(int, boolean);
method public void setProgressBackgroundTintList(android.content.res.ColorStateList);
diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java
index 01a95a4205d4..8ee43342795c 100644
--- a/core/java/android/widget/AbsSeekBar.java
+++ b/core/java/android/widget/AbsSeekBar.java
@@ -469,7 +469,7 @@ public abstract class AbsSeekBar extends ProgressBar {
/**
* Returns the amount of progress changed via the arrow keys.
* <p>
- * By default, this will be a value that is derived from the max progress.
+ * By default, this will be a value that is derived from the progress range.
*
* @return The amount to increment or decrement when the user presses the
* arrow keys. This will be positive.
@@ -479,13 +479,27 @@ public abstract class AbsSeekBar extends ProgressBar {
}
@Override
+ public synchronized void setMin(int min) {
+ super.setMin(min);
+ int range = getMax() - getMin();
+
+ if ((mKeyProgressIncrement == 0) || (range / mKeyProgressIncrement > 20)) {
+
+ // It will take the user too long to change this via keys, change it
+ // to something more reasonable
+ setKeyProgressIncrement(Math.max(1, Math.round((float) range / 20)));
+ }
+ }
+
+ @Override
public synchronized void setMax(int max) {
super.setMax(max);
+ int range = getMax() - getMin();
- if ((mKeyProgressIncrement == 0) || (getMax() / mKeyProgressIncrement > 20)) {
+ if ((mKeyProgressIncrement == 0) || (range / mKeyProgressIncrement > 20)) {
// It will take the user too long to change this via keys, change it
// to something more reasonable
- setKeyProgressIncrement(Math.max(1, Math.round((float) getMax() / 20)));
+ setKeyProgressIncrement(Math.max(1, Math.round((float) range / 20)));
}
}
@@ -596,8 +610,10 @@ public abstract class AbsSeekBar extends ProgressBar {
}
private float getScale() {
- final int max = getMax();
- return max > 0 ? getProgress() / (float) max : 0;
+ int min = getMin();
+ int max = getMax();
+ int range = max - min;
+ return range > 0 ? (getProgress() - min) / (float) range : 0;
}
/**
@@ -691,7 +707,7 @@ public abstract class AbsSeekBar extends ProgressBar {
*/
void drawTickMarks(Canvas canvas) {
if (mTickMark != null) {
- final int count = getMax();
+ final int count = getMax() - getMin();
if (count > 1) {
final int w = mTickMark.getIntrinsicWidth();
final int h = mTickMark.getIntrinsicHeight();
@@ -847,8 +863,8 @@ public abstract class AbsSeekBar extends ProgressBar {
}
}
- final int max = getMax();
- progress += scale * max;
+ final int range = getMax() - getMin();
+ progress += scale * range;
setHotspot(x, y);
setProgressInternal(Math.round(progress), true, false);
@@ -922,7 +938,7 @@ public abstract class AbsSeekBar extends ProgressBar {
if (isEnabled()) {
final int progress = getProgress();
- if (progress > 0) {
+ if (progress > getMin()) {
info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_BACKWARD);
}
if (progress < getMax()) {
@@ -960,7 +976,8 @@ public abstract class AbsSeekBar extends ProgressBar {
if (!canUserSetProgress()) {
return false;
}
- int increment = Math.max(1, Math.round((float) getMax() / 20));
+ int range = getMax() - getMin();
+ int increment = Math.max(1, Math.round((float) range / 20));
if (action == AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD) {
increment = -increment;
}
diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java
index 3c967acdfc55..4a28cc469227 100644
--- a/core/java/android/widget/ProgressBar.java
+++ b/core/java/android/widget/ProgressBar.java
@@ -185,6 +185,7 @@ import java.util.ArrayList;
* @attr ref android.R.styleable#ProgressBar_indeterminateDuration
* @attr ref android.R.styleable#ProgressBar_indeterminateOnly
* @attr ref android.R.styleable#ProgressBar_interpolator
+ * @attr ref android.R.styleable#ProgressBar_min
* @attr ref android.R.styleable#ProgressBar_max
* @attr ref android.R.styleable#ProgressBar_maxHeight
* @attr ref android.R.styleable#ProgressBar_maxWidth
@@ -215,7 +216,10 @@ public class ProgressBar extends View {
private int mProgress;
private int mSecondaryProgress;
+ private int mMin;
+ private boolean mMinInitialized;
private int mMax;
+ private boolean mMaxInitialized;
private int mBehavior;
private int mDuration;
@@ -308,6 +312,7 @@ public class ProgressBar extends View {
setInterpolator(context, resID);
}
+ setMin(a.getInt(R.styleable.ProgressBar_min, mMin));
setMax(a.getInt(R.styleable.ProgressBar_max, mMax));
setProgress(a.getInt(R.styleable.ProgressBar_progress, mProgress));
@@ -565,6 +570,7 @@ public class ProgressBar extends View {
* </ul>
*/
private void initProgressBar() {
+ mMin = 0;
mMax = 100;
mProgress = 0;
mSecondaryProgress = 0;
@@ -1310,7 +1316,8 @@ public class ProgressBar extends View {
private synchronized void doRefreshProgress(int id, int progress, boolean fromUser,
boolean callBackToApp, boolean animate) {
- final float scale = mMax > 0 ? progress / (float) mMax : 0;
+ int range = mMax - mMin;
+ final float scale = range > 0 ? (progress - mMin) / (float) range : 0;
final boolean isPrimary = id == R.id.progress;
if (isPrimary && animate) {
@@ -1436,7 +1443,7 @@ public class ProgressBar extends View {
return false;
}
- progress = MathUtils.constrain(progress, 0, mMax);
+ progress = MathUtils.constrain(progress, mMin, mMax);
if (progress == mProgress) {
// No change from current.
@@ -1466,8 +1473,8 @@ public class ProgressBar extends View {
return;
}
- if (secondaryProgress < 0) {
- secondaryProgress = 0;
+ if (secondaryProgress < mMin) {
+ secondaryProgress = mMin;
}
if (secondaryProgress > mMax) {
@@ -1515,6 +1522,20 @@ public class ProgressBar extends View {
}
/**
+ * <p>Return the lower limit of this progress bar's range.</p>
+ *
+ * @return a positive integer
+ *
+ * @see #setMin(int)
+ * @see #getProgress()
+ * @see #getSecondaryProgress()
+ */
+ @ViewDebug.ExportedProperty(category = "progress")
+ public synchronized int getMin() {
+ return mMin;
+ }
+
+ /**
* <p>Return the upper limit of this progress bar's range.</p>
*
* @return a positive integer
@@ -1529,7 +1550,37 @@ public class ProgressBar extends View {
}
/**
- * <p>Set the range of the progress bar to 0...<tt>max</tt>.</p>
+ * <p>Set the lower range of the progress bar to <tt>min</tt>.</p>
+ *
+ * @param min the lower range of this progress bar
+ *
+ * @see #getMin()
+ * @see #setProgress(int)
+ * @see #setSecondaryProgress(int)
+ */
+ @android.view.RemotableViewMethod
+ public synchronized void setMin(int min) {
+ if (mMaxInitialized) {
+ if (min > mMax) {
+ min = mMax;
+ }
+ }
+ mMinInitialized = true;
+ if (mMaxInitialized && min != mMin) {
+ mMin = min;
+ postInvalidate();
+
+ if (mProgress < min) {
+ mProgress = min;
+ }
+ refreshProgress(R.id.progress, mProgress, false, false);
+ } else {
+ mMin = min;
+ }
+ }
+
+ /**
+ * <p>Set the upper range of the progress bar <tt>max</tt>.</p>
*
* @param max the upper range of this progress bar
*
@@ -1539,10 +1590,13 @@ public class ProgressBar extends View {
*/
@android.view.RemotableViewMethod
public synchronized void setMax(int max) {
- if (max < 0) {
- max = 0;
+ if (mMinInitialized) {
+ if (max < mMin) {
+ max = mMin;
+ }
}
- if (max != mMax) {
+ mMaxInitialized = true;
+ if (mMinInitialized && max != mMax) {
mMax = max;
postInvalidate();
@@ -1550,6 +1604,8 @@ public class ProgressBar extends View {
mProgress = max;
}
refreshProgress(R.id.progress, mProgress, false, false);
+ } else {
+ mMax = max;
}
}
@@ -1959,7 +2015,7 @@ public class ProgressBar extends View {
@Override
public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
super.onInitializeAccessibilityEventInternal(event);
- event.setItemCount(mMax);
+ event.setItemCount(mMax - mMin);
event.setCurrentItemIndex(mProgress);
}
diff --git a/core/java/android/widget/SeekBar.java b/core/java/android/widget/SeekBar.java
index 5d01d8d7cb16..f9aced09adcf 100644
--- a/core/java/android/widget/SeekBar.java
+++ b/core/java/android/widget/SeekBar.java
@@ -46,8 +46,10 @@ public class SeekBar extends AbsSeekBar {
* to distinguish user-initiated changes from those that occurred programmatically.
*
* @param seekBar The SeekBar whose progress has changed
- * @param progress The current progress level. This will be in the range 0..max where max
- * was set by {@link ProgressBar#setMax(int)}. (The default value for max is 100.)
+ * @param progress The current progress level. This will be in the range min..max where min
+ * and max were set by {@link ProgressBar#setMin(int)} and
+ * {@link ProgressBar#setMax(int)}, respectively. (The default values for
+ * min is 0 and max is 100.)
* @param fromUser True if the progress change was initiated by the user.
*/
void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser);
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index aca2bcc0887d..f0a95bd8571d 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -3965,6 +3965,7 @@ i
</declare-styleable>
<declare-styleable name="ProgressBar">
+ <attr name="min" format="integer" />
<!-- Defines the maximum value the progress can take. -->
<attr name="max" format="integer" />
<!-- Defines the default progress value, between 0 and max. -->
@@ -7931,6 +7932,14 @@ i
<declare-styleable name="SeekBarPreference">
<attr name="layout" />
+ <!-- Attribute indicating whether the slider within this preference can be adjusted, that is
+ pressing left/right keys when this preference is focused will move the slider accordingly (e.g.
+ inline adjustable preferences). False, if the slider within the preference is read-only and
+ cannot be adjusted. By default, the seekbar is adjustable. -->
+ <attr name="adjustable" format="boolean" />
+ <!-- Flag indicating whether the TextView next to the seekbar that shows the current seekbar value will be
+ displayed. If true, the view is VISIBLE; if false, the view will be GONE. By default, this view is VISIBLE. -->
+ <attr name="showSeekBarValue" format="boolean" />
</declare-styleable>
<!-- Base attributes available to PreferenceFragment. -->
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 7bce3792e166..7999e7e48365 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2764,4 +2764,5 @@
<public-group type="id" first-id="0x01020041">
</public-group>
+ <public type="attr" name="min" />
</resources>