diff --git a/api/current.txt b/api/current.txt index d7721819e404d..15a6ec7d7d32c 100644 --- a/api/current.txt +++ b/api/current.txt @@ -50383,6 +50383,7 @@ package android.widget { method public int getAutoSizeMaxTextSize(); method public int getAutoSizeMinTextSize(); method public int getAutoSizeStepGranularity(); + method public int[] getAutoSizeTextPresetSizes(); method public int getAutoSizeTextType(); method public int getBreakStrategy(); method public int getCompoundDrawablePadding(); @@ -50496,6 +50497,7 @@ package android.widget { method public void setAutoSizeMaxTextSize(int, float); method public void setAutoSizeMinTextSize(int, float); method public void setAutoSizeStepGranularity(int, float); + method public void setAutoSizeTextPresetSizes(int[]); method public void setAutoSizeTextType(int); method public void setBreakStrategy(int); method public void setCompoundDrawablePadding(int); diff --git a/api/system-current.txt b/api/system-current.txt index 6affa7fea40f5..d24dc4212b7ac 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -54154,6 +54154,7 @@ package android.widget { method public int getAutoSizeMaxTextSize(); method public int getAutoSizeMinTextSize(); method public int getAutoSizeStepGranularity(); + method public int[] getAutoSizeTextPresetSizes(); method public int getAutoSizeTextType(); method public int getBreakStrategy(); method public int getCompoundDrawablePadding(); @@ -54267,6 +54268,7 @@ package android.widget { method public void setAutoSizeMaxTextSize(int, float); method public void setAutoSizeMinTextSize(int, float); method public void setAutoSizeStepGranularity(int, float); + method public void setAutoSizeTextPresetSizes(int[]); method public void setAutoSizeTextType(int); method public void setBreakStrategy(int); method public void setCompoundDrawablePadding(int); diff --git a/api/test-current.txt b/api/test-current.txt index bbb7f898d201a..0ac218c3cb2a1 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -50703,6 +50703,7 @@ package android.widget { method public int getAutoSizeMaxTextSize(); method public int getAutoSizeMinTextSize(); method public int getAutoSizeStepGranularity(); + method public int[] getAutoSizeTextPresetSizes(); method public int getAutoSizeTextType(); method public int getBreakStrategy(); method public int getCompoundDrawablePadding(); @@ -50816,6 +50817,7 @@ package android.widget { method public void setAutoSizeMaxTextSize(int, float); method public void setAutoSizeMinTextSize(int, float); method public void setAutoSizeStepGranularity(int, float); + method public void setAutoSizeTextPresetSizes(int[]); method public void setAutoSizeTextType(int); method public void setBreakStrategy(int); method public void setCompoundDrawablePadding(int); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index a5ff29119dc9d..31bb6b65cb85b 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -109,6 +109,7 @@ import android.text.style.URLSpan; import android.text.style.UpdateAppearance; import android.text.util.Linkify; import android.util.AttributeSet; +import android.util.IntArray; import android.util.Log; import android.util.TypedValue; import android.view.AccessibilityIterators.TextSegmentIterator; @@ -159,6 +160,8 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.util.FastMath; import com.android.internal.widget.EditableInputConnection; +import libcore.util.EmptyArray; + import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; @@ -166,6 +169,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.Arrays; import java.util.Locale; /** @@ -262,6 +266,7 @@ import java.util.Locale; * @attr ref android.R.styleable#TextView_autoSizeMinTextSize * @attr ref android.R.styleable#TextView_autoSizeMaxTextSize * @attr ref android.R.styleable#TextView_autoSizeStepGranularity + * @attr ref android.R.styleable#TextView_autoSizeStepSizeSet */ @RemoteView public class TextView extends View implements ViewTreeObserver.OnPreDrawListener { @@ -708,8 +713,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private int mAutoSizeMinTextSizeInPx = 0; // Maximum text size for auto-sizing in pixels. private int mAutoSizeMaxTextSizeInPx = 0; - // Contains the sorted set of desired text sizes in pixels to pick from when auto-sizing text. - private int[] mAutoSizeTextSizesInPx; + // Contains a (specified or computed) distinct sorted set of text sizes in pixels to pick from + // when auto-sizing text. + private int[] mAutoSizeTextSizesInPx = EmptyArray.INT; + // Specifies whether auto-size should use the provided auto size steps set or if it should + // build the steps set using mAutoSizeMinTextSizeInPx, mAutoSizeMaxTextSizeInPx and + // mAutoSizeStepGranularityInPx. + private boolean mHasPredefinedAutoSizeSet = false; // Watcher used to notify changes to auto-fill manager. private AutoFillChangeWatcher mAutoFillChangeWatcher; @@ -1301,8 +1311,19 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener case com.android.internal.R.styleable.TextView_autoSizeMaxTextSize: mAutoSizeMaxTextSizeInPx = a.getDimensionPixelSize(attr, 0); break; + + case com.android.internal.R.styleable.TextView_autoSizeStepSizeSet: + final int autoSizeStepSizeArrayResId = a.getResourceId(attr, 0); + if (autoSizeStepSizeArrayResId > 0) { + final TypedArray autoSizePreDefTextSizes = a.getResources() + .obtainTypedArray(autoSizeStepSizeArrayResId); + setupAutoSizeStepSizeSet(autoSizePreDefTextSizes); + autoSizePreDefTextSizes.recycle(); + } + break; } } + a.recycle(); BufferType bufferType = BufferType.EDITABLE; @@ -1599,7 +1620,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mAutoSizeMinTextSizeInPx = 0; mAutoSizeMaxTextSizeInPx = 0; mAutoSizeStepGranularityInPx = 0; - mAutoSizeTextSizesInPx = null; + mAutoSizeTextSizesInPx = EmptyArray.INT; mNeedsAutoSizeText = false; } break; @@ -1651,6 +1672,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (supportsAutoSizeText()) { mAutoSizeStepGranularityInPx = (int) TypedValue.applyDimension( unit, size, getResources().getDisplayMetrics()); + mHasPredefinedAutoSizeSet = false; setupAutoSizeTextXY(); } } @@ -1683,6 +1705,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (supportsAutoSizeText()) { mAutoSizeMinTextSizeInPx = (int) TypedValue.applyDimension( unit, size, getResources().getDisplayMetrics()); + mHasPredefinedAutoSizeSet = false; setupAutoSizeTextXY(); } } @@ -1716,6 +1739,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (supportsAutoSizeText()) { mAutoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension( unit, size, getResources().getDisplayMetrics()); + mHasPredefinedAutoSizeSet = false; setupAutoSizeTextXY(); } } @@ -1730,44 +1754,137 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return mAutoSizeMaxTextSizeInPx; } + /** + * Sets a predefined array of sizes to be used when auto-sizing. + * + *
presetSizes is not empty then the auto-size algorithm will use the
+ * values provided here instead of calculating the values based on min, max and step size. Also
+ * the values will be de-duplicated, sorted and negative or zero values will be removed.
+ * presetSizes is empty then the auto-size algorithm will use the min, max
+ * and step size to build the set of available sizes to choose from. Note that if no values have
+ * been provided for any of min, max or step size then defaults will be used.
+ *