package org.commcare.views;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.TextView;
import org.commcare.dalvik.R;
/**
* A basic text view that will resize itself to update its text size if text wraps longer than
* a single line
*
* Created by ctsims on 3/14/15.
*/
public class ResizingTextView extends TextView {
private boolean isResizable = false;
private int mSmallTextPixels;
private float mOriginalTextSize;
private boolean mHasTriedSmallLayout = false;
public ResizingTextView(Context context, AttributeSet attrs) {
super(context, attrs);
setParams(context, attrs);
}
public ResizingTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setParams(context, attrs);
}
@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
if (!getText().equals(text)) {
resetOriginalTextSize();
}
super.onTextChanged(text, start, lengthBefore, lengthAfter);
}
private void resetOriginalTextSize() {
if (isResizable && mHasTriedSmallLayout) {
setTextSize(TypedValue.COMPLEX_UNIT_PX, mOriginalTextSize);
mHasTriedSmallLayout = false;
requestLayout();
}
}
private void setParams(Context context, AttributeSet attrs) {
if (attrs != null) {
TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ResizingTextView, 0, 0);
mSmallTextPixels = typedArray.getDimensionPixelSize(R.styleable.ResizingTextView_text_size_small, -1);
if (mSmallTextPixels != -1) {
isResizable = true;
}
}
}
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (isResizable && !mHasTriedSmallLayout && this.getLineCount() > 1) {
setTextSizeToSmall();
}
}
private void setTextSizeToSmall() {
mOriginalTextSize = getTextSize();
mHasTriedSmallLayout = true;
setTextSize(TypedValue.COMPLEX_UNIT_PX, mSmallTextPixels);
requestLayout();
}
}