diff --git a/api/current.txt b/api/current.txt index 5c1bff80b655c..f2d7e2155a056 100644 --- a/api/current.txt +++ b/api/current.txt @@ -50369,6 +50369,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(); @@ -50482,6 +50483,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 a29c7f8a71e49..760ba13785be4 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -54149,6 +54149,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(); @@ -54262,6 +54263,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 5d6f5d08646db..df2e7cea6963e 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -50689,6 +50689,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(); @@ -50802,6 +50803,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 28c5c60686ed0..20e325cb6d9e6 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -113,6 +113,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; @@ -164,6 +165,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; @@ -268,6 +271,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 { @@ -715,8 +719,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; @@ -1308,8 +1317,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; @@ -1606,7 +1626,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mAutoSizeMinTextSizeInPx = 0; mAutoSizeMaxTextSizeInPx = 0; mAutoSizeStepGranularityInPx = 0; - mAutoSizeTextSizesInPx = null; + mAutoSizeTextSizesInPx = EmptyArray.INT; mNeedsAutoSizeText = false; } break; @@ -1658,6 +1678,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (supportsAutoSizeText()) { mAutoSizeStepGranularityInPx = (int) TypedValue.applyDimension( unit, size, getResources().getDisplayMetrics()); + mHasPredefinedAutoSizeSet = false; setupAutoSizeTextXY(); } } @@ -1690,6 +1711,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (supportsAutoSizeText()) { mAutoSizeMinTextSizeInPx = (int) TypedValue.applyDimension( unit, size, getResources().getDisplayMetrics()); + mHasPredefinedAutoSizeSet = false; setupAutoSizeTextXY(); } } @@ -1723,6 +1745,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (supportsAutoSizeText()) { mAutoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension( unit, size, getResources().getDisplayMetrics()); + mHasPredefinedAutoSizeSet = false; setupAutoSizeTextXY(); } } @@ -1737,44 +1760,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.
+ *