17fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing/* 27fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * Copyright (C) 2014 The Android Open Source Project 37fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * 47fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 57fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * in compliance with the License. You may obtain a copy of the License at 67fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * 77fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * http://www.apache.org/licenses/LICENSE-2.0 87fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * 97fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * Unless required by applicable law or agreed to in writing, software distributed under the License 107fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 117fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * or implied. See the License for the specific language governing permissions and limitations under 127fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * the License. 137fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing */ 147fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesingpackage android.support.v17.leanback.widget; 157fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 167fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesingimport android.content.Context; 177fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesingimport android.content.res.TypedArray; 187fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesingimport android.text.Layout; 197fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesingimport android.util.AttributeSet; 207fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesingimport android.util.TypedValue; 217fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesingimport android.widget.TextView; 227fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 237fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesingimport android.support.v17.leanback.R; 247fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 257fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing/** 267fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * <p>A {@link android.widget.TextView} that adjusts text size automatically in response 277fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * to certain trigger conditions, such as text that wraps over multiple lines.</p> 287fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * @hide 297fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing */ 307fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesingclass ResizingTextView extends TextView { 317fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 327fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing /** 337fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * Trigger text resize when text flows into the last line of a multi-line text view. 347fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing */ 357fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing public static final int TRIGGER_MAX_LINES = 0x01; 367fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 377fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing private int mTriggerConditions; // Union of trigger conditions 387fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing private int mResizedTextSize; 39dc5b25a4083e1d00716fa9f70d26712453fdbeabKris Giesing // Note: Maintaining line spacing turned out not to be useful, and will be removed in 40dc5b25a4083e1d00716fa9f70d26712453fdbeabKris Giesing // the next round of design for this class (b/18736630). For now it simply defaults to false. 417fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing private boolean mMaintainLineSpacing; 427fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing private int mResizedPaddingAdjustmentTop; 437fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing private int mResizedPaddingAdjustmentBottom; 447fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 457fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing private boolean mIsResized = false; 467fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing // Remember default properties in case we need to restore them 477fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing private boolean mDefaultsInitialized = false; 487fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing private int mDefaultTextSize; 497fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing private float mDefaultLineSpacingExtra; 507fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing private int mDefaultPaddingTop; 517fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing private int mDefaultPaddingBottom; 527fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 537fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing public ResizingTextView(Context ctx, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 547fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing super(ctx, attrs, defStyleAttr); 557fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.lbResizingTextView, 567fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing defStyleAttr, defStyleRes); 577fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 587fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing try { 597fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing mTriggerConditions = a.getInt( 607fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing R.styleable.lbResizingTextView_resizeTrigger, TRIGGER_MAX_LINES); 617fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing mResizedTextSize = a.getDimensionPixelSize( 627fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing R.styleable.lbResizingTextView_resizedTextSize, -1); 637fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing mMaintainLineSpacing = a.getBoolean( 64dc5b25a4083e1d00716fa9f70d26712453fdbeabKris Giesing R.styleable.lbResizingTextView_maintainLineSpacing, false); 657fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing mResizedPaddingAdjustmentTop = a.getDimensionPixelOffset( 667fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing R.styleable.lbResizingTextView_resizedPaddingAdjustmentTop, 0); 677fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing mResizedPaddingAdjustmentBottom = a.getDimensionPixelOffset( 687fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing R.styleable.lbResizingTextView_resizedPaddingAdjustmentBottom, 0); 697fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } finally { 707fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing a.recycle(); 717fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 727fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 737fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 747fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing public ResizingTextView(Context ctx, AttributeSet attrs, int defStyleAttr) { 757fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing this(ctx, attrs, defStyleAttr, 0); 767fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 777fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 787fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing public ResizingTextView(Context ctx, AttributeSet attrs) { 79afb8ae27a2d6f7d7088a39b9eb4a43369df91270Kris Giesing // TODO We should define our own style that inherits from TextViewStyle, to set defaults 80afb8ae27a2d6f7d7088a39b9eb4a43369df91270Kris Giesing // for new styleables, We then pass the appropriate R.attr up the constructor chain here. 81afb8ae27a2d6f7d7088a39b9eb4a43369df91270Kris Giesing this(ctx, attrs, android.R.attr.textViewStyle); 827fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 837fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 847fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing public ResizingTextView(Context ctx) { 857fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing this(ctx, null); 867fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 877fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 887fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing /** 897fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * @return the trigger conditions used to determine whether resize occurs 907fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing */ 917fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing public int getTriggerConditions() { 927fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing return mTriggerConditions; 937fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 947fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 957fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing /** 967fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * Set the trigger conditions used to determine whether resize occurs. Pass 977fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * a union of trigger condition constants, such as {@link ResizingTextView#TRIGGER_MAX_LINES}. 987fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * 997fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * @param conditions A union of trigger condition constants 1007fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing */ 1017fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing public void setTriggerConditions(int conditions) { 1027fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (mTriggerConditions != conditions) { 1037fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing mTriggerConditions = conditions; 1047fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing // Always request a layout when trigger conditions change 1057fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing requestLayout(); 1067fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 1077fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 1087fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 1097fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing /** 1107fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * @return the resized text size 1117fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing */ 1127fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing public int getResizedTextSize() { 1137fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing return mResizedTextSize; 1147fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 1157fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 1167fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing /** 1177fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * Set the text size for resized text. 1187fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * 1197fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * @param size The text size for resized text 1207fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing */ 1217fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing public void setResizedTextSize(int size) { 1227fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (mResizedTextSize != size) { 1237fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing mResizedTextSize = size; 1247fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing resizeParamsChanged(); 1257fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 1267fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 1277fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 1287fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing /** 1297fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * @return whether or not to maintain line spacing when resizing text. 1307fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * The default is true. 1317fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing */ 1327fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing public boolean getMaintainLineSpacing() { 1337fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing return mMaintainLineSpacing; 1347fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 1357fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 1367fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing /** 1377fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * Set whether or not to maintain line spacing when resizing text. 1387fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * The default is true. 1397fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * 1407fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * @param maintain Whether or not to maintain line spacing 1417fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing */ 1427fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing public void setMaintainLineSpacing(boolean maintain) { 1437fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (mMaintainLineSpacing != maintain) { 1447fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing mMaintainLineSpacing = maintain; 1457fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing resizeParamsChanged(); 1467fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 1477fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 1487fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 1497fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing /** 1507fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * @return desired adjustment to top padding for resized text 1517fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing */ 1527fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing public int getResizedPaddingAdjustmentTop() { 1537fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing return mResizedPaddingAdjustmentTop; 1547fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 1557fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 1567fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing /** 1577fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * Set the desired adjustment to top padding for resized text. 1587fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * 1597fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * @param adjustment The adjustment to top padding, in pixels 1607fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing */ 1617fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing public void setResizedPaddingAdjustmentTop(int adjustment) { 1627fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (mResizedPaddingAdjustmentTop != adjustment) { 1637fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing mResizedPaddingAdjustmentTop = adjustment; 1647fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing resizeParamsChanged(); 1657fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 1667fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 1677fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 1687fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing /** 1697fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * @return desired adjustment to bottom padding for resized text 1707fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing */ 1717fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing public int getResizedPaddingAdjustmentBottom() { 1727fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing return mResizedPaddingAdjustmentBottom; 1737fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 1747fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 1757fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing /** 1767fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * Set the desired adjustment to bottom padding for resized text. 1777fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * 1787fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing * @param adjustment The adjustment to bottom padding, in pixels 1797fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing */ 1807fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing public void setResizedPaddingAdjustmentBottom(int adjustment) { 1817fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (mResizedPaddingAdjustmentBottom != adjustment) { 1827fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing mResizedPaddingAdjustmentBottom = adjustment; 1837fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing resizeParamsChanged(); 1847fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 1857fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 1867fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 1877fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing private void resizeParamsChanged() { 1887fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing // If we're not resized, then changing resize parameters doesn't 1897fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing // affect layout, so don't bother requesting. 1907fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (mIsResized) { 1917fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing requestLayout(); 1927fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 1937fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 1947fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 1957fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing @Override 1967fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 1977fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (!mDefaultsInitialized) { 1987fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing mDefaultTextSize = (int) getTextSize(); 1997fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing mDefaultLineSpacingExtra = getLineSpacingExtra(); 2007fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing mDefaultPaddingTop = getPaddingTop(); 2017fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing mDefaultPaddingBottom = getPaddingBottom(); 2027fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing mDefaultsInitialized = true; 2037fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 2047fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 2057fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing // Always try first to measure with defaults. Otherwise, we may think we can get away 2067fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing // with larger text sizes later when we actually can't. 2077fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing setTextSize(TypedValue.COMPLEX_UNIT_PX, mDefaultTextSize); 2087fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing setLineSpacing(mDefaultLineSpacingExtra, getLineSpacingMultiplier()); 2097fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing setPaddingTopAndBottom(mDefaultPaddingTop, mDefaultPaddingBottom); 2107fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 2117fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing super.onMeasure(widthMeasureSpec, heightMeasureSpec); 2127fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 2137fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing boolean resizeText = false; 2147fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 2157fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing final Layout layout = getLayout(); 2167fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (layout != null) { 2177fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if ((mTriggerConditions & TRIGGER_MAX_LINES) > 0) { 2187fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing final int lineCount = layout.getLineCount(); 2197fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing final int maxLines = getMaxLines(); 2207fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (maxLines > 1) { 2217fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing resizeText = lineCount == maxLines; 2227fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 2237fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 2247fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 2257fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 2267fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing final int currentSizePx = (int) getTextSize(); 2277fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing boolean remeasure = false; 2287fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (resizeText) { 2297fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (mResizedTextSize != -1 && currentSizePx != mResizedTextSize) { 2307fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing setTextSize(TypedValue.COMPLEX_UNIT_PX, mResizedTextSize); 2317fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing remeasure = true; 2327fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 2337fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing // Check for other desired adjustments in addition to the text size 2347fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing final float targetLineSpacingExtra = mDefaultLineSpacingExtra + 2357fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing mDefaultTextSize - mResizedTextSize; 2367fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (mMaintainLineSpacing && getLineSpacingExtra() != targetLineSpacingExtra) { 2377fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing setLineSpacing(targetLineSpacingExtra, getLineSpacingMultiplier()); 2387fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing remeasure = true; 2397fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 2407fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing final int paddingTop = mDefaultPaddingTop + mResizedPaddingAdjustmentTop; 2417fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing final int paddingBottom = mDefaultPaddingBottom + mResizedPaddingAdjustmentBottom; 2427fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (getPaddingTop() != paddingTop || getPaddingBottom() != paddingBottom) { 2437fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing setPaddingTopAndBottom(paddingTop, paddingBottom); 2447fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing remeasure = true; 2457fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 2467fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } else { 2477fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing // Use default size, line spacing, and padding 2487fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (mResizedTextSize != -1 && currentSizePx != mDefaultTextSize) { 2497fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing setTextSize(TypedValue.COMPLEX_UNIT_PX, mDefaultTextSize); 2507fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing remeasure = true; 2517fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 2527fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (mMaintainLineSpacing && getLineSpacingExtra() != mDefaultLineSpacingExtra) { 2537fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing setLineSpacing(mDefaultLineSpacingExtra, getLineSpacingMultiplier()); 2547fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing remeasure = true; 2557fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 2567fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (getPaddingTop() != mDefaultPaddingTop || 2577fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing getPaddingBottom() != mDefaultPaddingBottom) { 2587fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing setPaddingTopAndBottom(mDefaultPaddingTop, mDefaultPaddingBottom); 2597fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing remeasure = true; 2607fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 2617fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 2627fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing mIsResized = resizeText; 2637fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (remeasure) { 2647fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing super.onMeasure(widthMeasureSpec, heightMeasureSpec); 2657fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 2667fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 2677fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing 2687fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing private void setPaddingTopAndBottom(int paddingTop, int paddingBottom) { 2697fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing if (isPaddingRelative()) { 2707fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing setPaddingRelative(getPaddingStart(), paddingTop, getPaddingEnd(), paddingBottom); 2717fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } else { 2727fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing setPadding(getPaddingLeft(), paddingTop, getPaddingRight(), paddingBottom); 2737fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 2747fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing } 2757fa663ffa812ebc8cb2bb492eecc40485b145ebaKris Giesing} 276