package fr.prcaen.externalresources.model;
import android.support.annotation.NonNull;
import android.util.DisplayMetrics;
import android.util.TypedValue;
public final class DimensionResource {
private static final String TYPE_DP = "dp";
private static final String TYPE_DIP = "dip";
private static final String TYPE_SP = "sp";
private static final String TYPE_PT = "pt";
private static final String TYPE_IN = "in";
private static final String TYPE_MM = "mm";
private static final String TYPE_PX = "px";
protected final int type;
protected final float value;
public DimensionResource(int type, float value) {
this.type = type;
this.value = value;
}
public static DimensionResource fromString(@NonNull String resource)
throws IllegalArgumentException {
return new DimensionResource(getTypeFromString(resource), getValueFromString(resource));
}
protected static float getValueFromString(@NonNull String str) {
String[] split = str.trim().split("[a-z-A-Z]");
try {
return Float.valueOf(split[0]);
} catch (NumberFormatException | IndexOutOfBoundsException e) {
throw new IllegalArgumentException(str + " is not a valid dimension format.");
}
}
protected static int getTypeFromString(@NonNull String str) {
String[] split = str.trim().split("[0-9]");
if (split.length > 0) {
final String typeStr = split[split.length - 1];
switch (typeStr) {
case TYPE_DP:
case TYPE_DIP:
return TypedValue.COMPLEX_UNIT_DIP;
case TYPE_SP:
return TypedValue.COMPLEX_UNIT_SP;
case TYPE_PT:
return TypedValue.COMPLEX_UNIT_PT;
case TYPE_IN:
return TypedValue.COMPLEX_UNIT_IN;
case TYPE_MM:
return TypedValue.COMPLEX_UNIT_MM;
case TYPE_PX:
return TypedValue.COMPLEX_UNIT_PX;
default:
throw new IllegalArgumentException(typeStr + " is not a valid type dimension format.");
}
} else {
return TypedValue.COMPLEX_UNIT_PX;
}
}
public float toFloat(DisplayMetrics metrics) {
return TypedValue.applyDimension(type, value, metrics);
}
}