Source code
package android.support.v4.widget;
import android.util.Log;
import android.widget.TextView;
import java.lang.reflect.Field;
class TextViewCompatDonut {
private static final int LINES = 1;
private static final String LOG_TAG = "TextViewCompatDonut";
private static Field sMaxModeField;
private static boolean sMaxModeFieldFetched;
private static Field sMaximumField;
private static boolean sMaximumFieldFetched;
private static Field sMinModeField;
private static boolean sMinModeFieldFetched;
private static Field sMinimumField;
private static boolean sMinimumFieldFetched;
TextViewCompatDonut() {
}
static int getMaxLines(TextView textView) {
if (!sMaxModeFieldFetched) {
sMaxModeField = retrieveField("mMaxMode");
sMaxModeFieldFetched = true;
}
if (sMaxModeField != null && retrieveIntFromField(sMaxModeField, textView) == 1) {
if (!sMaximumFieldFetched) {
sMaximumField = retrieveField("mMaximum");
sMaximumFieldFetched = true;
}
if (sMaximumField != null) {
return retrieveIntFromField(sMaximumField, textView);
}
}
return -1;
}
static int getMinLines(TextView textView) {
if (!sMinModeFieldFetched) {
sMinModeField = retrieveField("mMinMode");
sMinModeFieldFetched = true;
}
if (sMinModeField != null && retrieveIntFromField(sMinModeField, textView) == 1) {
if (!sMinimumFieldFetched) {
sMinimumField = retrieveField("mMinimum");
sMinimumFieldFetched = true;
}
if (sMinimumField != null) {
return retrieveIntFromField(sMinimumField, textView);
}
}
return -1;
}
private static Field retrieveField(String fieldName) {
Field field = null;
try {
field = TextView.class.getDeclaredField(fieldName);
field.setAccessible(true);
return field;
} catch (NoSuchFieldException e) {
Log.e(LOG_TAG, "Could not retrieve " + fieldName + " field.");
return field;
}
}
private static int retrieveIntFromField(Field field, TextView textView) {
try {
return field.getInt(textView);
} catch (IllegalAccessException e) {
Log.d(LOG_TAG, "Could not retrieve value of " + field.getName() + " field.");
return -1;
}
}
}