package org.itsnat.droid.impl.xmlinflater.layout.attr.widget; import android.os.Build; import android.text.TextUtils; import android.view.View; import android.widget.DatePicker; import org.itsnat.droid.impl.dom.DOMAttr; import org.itsnat.droid.impl.util.MiscUtil; import org.itsnat.droid.impl.xmlinflater.FieldContainer; 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; import java.util.Calendar; import java.util.Locale; /** * Created by jmarranz on 30/04/14. */ public class AttrDescView_widget_DatePicker_endYear_startYear extends AttrDesc<ClassDescViewBased,View,AttrLayoutContext> { private static final int DEFAULT_START_YEAR = 1900; private static final int DEFAULT_END_YEAR = 2100; protected FieldContainer<Object> fieldDelegate; protected FieldContainer<Locale> fieldCurrentLocale; protected MethodContainer<Void> methodMaxMinDate; public AttrDescView_widget_DatePicker_endYear_startYear(ClassDescViewBased parent, String name) { super(parent,name); Class datePickerClass1,datePickerClass2; if (Build.VERSION.SDK_INT < MiscUtil.LOLLIPOP) { datePickerClass1 = parent.getDeclaredClass(); datePickerClass2 = datePickerClass1; } else // Lollipop { this.fieldDelegate = new FieldContainer<Object>(parent.getDeclaredClass(), "mDelegate"); datePickerClass1 = MiscUtil.resolveClass(DatePicker.class.getName() + "$AbstractDatePickerDelegate"); datePickerClass2 = MiscUtil.resolveClass(DatePicker.class.getName() + "$DatePickerSpinnerDelegate"); } this.fieldCurrentLocale = new FieldContainer<Locale>(datePickerClass1, "mCurrentLocale"); String methodName = null; if ("endYear".equals(name)) methodName = "setMaxDate"; else if ("startYear".equals(name)) methodName = "setMinDate"; this.methodMaxMinDate = new MethodContainer<Void>(datePickerClass2,methodName,new Class[]{long.class}); } @Override public void setAttribute(final View view, DOMAttr attr, AttrLayoutContext attrCtx) { final String year = getString(attr.getResourceDesc(),attrCtx.getXMLInflaterContext()); Object datePickerObject = getDatePickerObject(view); // Delegamos al final porque los atributos maxDate y minDate tienen prioridad (ganan si están definidos) // sobre startYear y endYear Locale currentLocale = fieldCurrentLocale.get(datePickerObject); Calendar tempDate = Calendar.getInstance(currentLocale); tempDate.clear(); if (!TextUtils.isEmpty(year)) { int yearInt = Integer.parseInt(year); if ("endYear".equals(name)) tempDate.set(yearInt, Calendar.DECEMBER /*11*/, 31); else if ("startYear".equals(name)) tempDate.set(yearInt,Calendar.JANUARY /*0*/, 1); } else { // Caso de eliminación de atributo, intrepretamos como el deseo de poner los valores por defecto (más o menos es así en el código fuente) // hay que tener en cuenta que es un valor explícito por lo que ignoramos/reemplazamos los posibles valores anteriores if ("endYear".equals(name)) tempDate.set(DEFAULT_END_YEAR, Calendar.DECEMBER /*11*/, 31); else if ("startYear".equals(name)) tempDate.set(DEFAULT_START_YEAR,Calendar.JANUARY /*0*/, 1); } methodMaxMinDate.invoke(datePickerObject,tempDate.getTimeInMillis()); } @Override public void removeAttribute(View view, AttrLayoutContext attrCtx) { setAttributeToRemove(view, "",attrCtx); } private Object getDatePickerObject(View view) { if (Build.VERSION.SDK_INT < MiscUtil.LOLLIPOP) return (DatePicker)view; else return fieldDelegate.get(view); } }