package org.itsnat.droid.impl.xmlinflater.layout.attr.widget; import android.content.res.ColorStateList; import android.graphics.PorterDuff; import android.os.Build; import android.view.View; import org.itsnat.droid.impl.dom.DOMAttr; import org.itsnat.droid.impl.util.MiscUtil; import org.itsnat.droid.impl.xmlinflater.MethodContainer; import org.itsnat.droid.impl.xmlinflater.layout.AttrLayoutContext; import org.itsnat.droid.impl.xmlinflater.layout.classtree.ClassDescViewBased; import org.itsnat.droid.impl.xmlinflater.shared.attr.AttrDesc; /** * Created by jmarranz on 30/04/14. */ public class AttrDescView_widget_ImageView_tint extends AttrDesc<ClassDescViewBased,View,AttrLayoutContext> { protected String defaultValue; protected MethodContainer methodSetTint; protected MethodContainer methodSetImageTintMode; // LOLLIPOP and sup public AttrDescView_widget_ImageView_tint(ClassDescViewBased parent) { super(parent,"tint"); this.defaultValue = getDefaultValue(); // A partir de Lollipop (level 21) ya no se usa setColorFilter, se usa setImageTintList, en teoría el resultado // visual debería ser el mismo pero a nivel de estado interno no. // Si diera problemas setImageTintList podemos poner USE_EVER_OLD_APPROACH = true pues el caso es que setColorFilter SIGUE EXISTIENDO y no está deprecated por lo que podemos NO usar setImageTintList // pero como hemos conseguido que funcione igual pues usamos la versión moderna cuando proceda que es la que tiene futuro if (Build.VERSION.SDK_INT < MiscUtil.LOLLIPOP) { this.methodSetTint = new MethodContainer(parent.getDeclaredClass(),"setColorFilter",int.class); } else { this.methodSetTint = new MethodContainer(parent.getDeclaredClass(),"setImageTintList",ColorStateList.class); this.methodSetImageTintMode = new MethodContainer(parent.getDeclaredClass(), "setImageTintMode", new Class[]{PorterDuff.Mode.class}); } } protected static String getDefaultValue() { return "#000000"; } @Override public void setAttribute(View view, DOMAttr attr, AttrLayoutContext attrCtx) { final int convValue = getColor(attr.getResourceDesc(),attrCtx.getXMLInflaterContext()); if (Build.VERSION.SDK_INT < MiscUtil.LOLLIPOP) { methodSetTint.invoke(view,convValue); } else { methodSetImageTintMode.invoke(view, PorterDuff.Mode.SRC_ATOP); // SRC_ATOP es el método por defecto, es necesario llamarlo methodSetTint.invoke(view, ColorStateList.valueOf(convValue)); } } @Override public void removeAttribute(View view, AttrLayoutContext attrCtx) { if (defaultValue != null) setAttributeToRemove(view, defaultValue,attrCtx); } }