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