10cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout/*
20cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout * Copyright (C) 2016 The Android Open Source Project
30cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout *
40cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout * Licensed under the Apache License, Version 2.0 (the "License");
50cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout * you may not use this file except in compliance with the License.
60cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout * You may obtain a copy of the License at
70cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout *
80cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout *      http://www.apache.org/licenses/LICENSE-2.0
90cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout *
100cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout * Unless required by applicable law or agreed to in writing, software
110cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout * distributed under the License is distributed on an "AS IS" BASIS,
120cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout * See the License for the specific language governing permissions and
140cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout * limitations under the License.
150cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout */
160cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout
170cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stoutpackage com.android.deskclock.widget;
180cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout
190cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stoutimport android.content.Context;
205ea8dcc77ded62f1fb7195eae100522a87ebf705Sean Stoutimport android.support.v7.widget.AppCompatTextView;
210cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stoutimport android.util.AttributeSet;
220cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout
230cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout/**
240cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout * A TextView which automatically re-sizes its text to fit within its boundaries.
250cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout */
265ea8dcc77ded62f1fb7195eae100522a87ebf705Sean Stoutpublic class AutoSizingTextView extends AppCompatTextView {
270cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout
28e96017ffe206b3212a9573982290f9faf0e371baChristine Franks    private final TextSizeHelper mTextSizeHelper;
290cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout
300cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout    public AutoSizingTextView(Context context) {
31e96017ffe206b3212a9573982290f9faf0e371baChristine Franks        this(context, null);
320cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout    }
330cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout
340cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout    public AutoSizingTextView(Context context, AttributeSet attrs) {
350cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout        this(context, attrs, android.R.attr.textViewStyle);
360cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout    }
370cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout
380cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout    public AutoSizingTextView(Context context, AttributeSet attrs, int defStyleAttr) {
390cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout        super(context, attrs, defStyleAttr);
40e96017ffe206b3212a9573982290f9faf0e371baChristine Franks        mTextSizeHelper = new TextSizeHelper(this);
410cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout    }
420cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout
430cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout    @Override
440cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
45e96017ffe206b3212a9573982290f9faf0e371baChristine Franks        mTextSizeHelper.onMeasure(widthMeasureSpec, heightMeasureSpec);
460cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
470cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout    }
480cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout
490cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout    @Override
505159d31fc05c7da276d02eeae124dd2fafd9f43bJustin Klaassen    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
515159d31fc05c7da276d02eeae124dd2fafd9f43bJustin Klaassen        super.onTextChanged(text, start, lengthBefore, lengthAfter);
52e96017ffe206b3212a9573982290f9faf0e371baChristine Franks        if (mTextSizeHelper != null) {
53e96017ffe206b3212a9573982290f9faf0e371baChristine Franks            mTextSizeHelper.onTextChanged(lengthBefore, lengthAfter);
5488301ac327d7c5800e2db92ae619c8783b13720bChristine Franks        } else {
5588301ac327d7c5800e2db92ae619c8783b13720bChristine Franks            requestLayout();
565159d31fc05c7da276d02eeae124dd2fafd9f43bJustin Klaassen        }
575159d31fc05c7da276d02eeae124dd2fafd9f43bJustin Klaassen    }
585159d31fc05c7da276d02eeae124dd2fafd9f43bJustin Klaassen
595159d31fc05c7da276d02eeae124dd2fafd9f43bJustin Klaassen    @Override
600cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout    public void requestLayout() {
61e96017ffe206b3212a9573982290f9faf0e371baChristine Franks        if (mTextSizeHelper == null || !mTextSizeHelper.shouldIgnoreRequestLayout()) {
620cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout            super.requestLayout();
630cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout        }
640cdf9bb0d4b3519049276133c04adc62bb7be23eSean Stout    }
65e96017ffe206b3212a9573982290f9faf0e371baChristine Franks}