package org.sana.android.procedure; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; import org.sana.R; import org.sana.android.Constants; import org.sana.android.app.Locales; import org.sana.android.app.Preferences; import org.sana.android.widget.CustomDatePicker; import org.sana.util.DateUtil; import org.w3c.dom.Node; import android.content.Context; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.DatePicker; /** * A ProcedureElement for collecting a date value. * <p/> * <ul type="none"> * <li><b>Clinical Use </b> Defined by subclasses.</li> * <li><b>Collects </b>Date value formatted as <code>yyyy/MM/dd</code></li> * </ul> * * @author Sana Development Team */ public class DateElement extends ProcedureElement { class DateValueSetter implements CustomDatePicker.OnDateChangedListener{ final String TAG = DateValueSetter.class.getSimpleName(); @Override public void onDateChanged(CustomDatePicker view, int year, int monthOfYear, int dayOfMonth) { Log.i(TAG, "onDateChanged()"); Log.d(TAG, "current value: " + answer); dateValue.set(Calendar.YEAR, year); dateValue.set(Calendar.MONTH, monthOfYear); dateValue.set(Calendar.DAY_OF_MONTH, dayOfMonth); answer = DateUtil.format(dateValue.getTime()); Log.d(TAG, "new value: " + answer); } } CustomDatePicker dp = null; Date dateAnswer = new Date(); Calendar dateValue = Calendar.getInstance(TimeZone.getDefault()); /** {@inheritDoc} */ @Override protected View createView(Context c) { dp = new CustomDatePicker(c); String locale = Preferences.getString(c, Constants.PREFERENCE_LOCALE, "en"); Locales.updateLocale(c, locale); String[] months = c.getResources().getStringArray(R.array.months_long_format); dp.setMonthValues(months); dp.init(dateValue.get(Calendar.YEAR), dateValue.get(Calendar.MONTH), dateValue.get(Calendar.DAY_OF_MONTH), new DateValueSetter()); return encapsulateQuestion(c, dp); } /** {@inheritDoc} */ @Override public String getAnswer() { if(!isViewActive()) return answer; else { dateValue.set(Calendar.YEAR, dp.getYear()); dateValue.set(Calendar.MONTH, dp.getMonth()); dateValue.set(Calendar.DAY_OF_MONTH, dp.getDayOfMonth()); return DateUtil.format(dateValue.getTime()); } } /** {@inheritDoc} */ @Override public ElementType getType() { return ElementType.DATE; } /** {@inheritDoc} */ @Override public void setAnswer(String answer) { if(!TextUtils.isEmpty(answer)){ try { dateValue.setTime(DateUtil.parseDate(answer)); } catch (ParseException e) { Log.e(DateElement.class.getSimpleName(), "Invalid date string? " + answer); e.printStackTrace(); } } if (isViewActive()) { dp.updateDate(dateValue.get(Calendar.YEAR), dateValue.get(Calendar.MONTH), dateValue.get(Calendar.DAY_OF_MONTH)); } } private DateElement(String id, String question, String answer, String concept, String figure, String audio) { super(id, question, answer, concept, figure, audio); } /** * Creates the element from an XML procedure definition. * * @param id The unique identifier of this element within its procedure. * @param question The text that will be displayed to the user as a question * @param answer The result of data capture. * @param concept A required categorization of the type of data captured. * @param figure An optional figure to display to the user. * @param audio An optional audio prompt to play for the user. * @param node The source xml node. * @return A new element. * @throws ProcedureParseException if an error occurred while parsing * additional information from the Node */ public static DateElement fromXML(String id, String question, String answer, String concept, String figure, String audio, Node node) throws ProcedureParseException { return new DateElement(id, question, answer, concept, figure, audio); } }