package org.sana.android.procedure; import android.app.Activity; import android.content.Context; import android.os.Build; import android.text.TextUtils; import android.text.method.DigitsKeyListener; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.NumberPicker; import org.joda.time.DateTime; import org.sana.R; import org.sana.util.DateUtil; import org.sana.util.Functions; import org.w3c.dom.Node; import java.text.ParseException; import java.util.Calendar; import java.util.Date; /** * Element which accepts an integer as input and calculates an estimated date. This * is useful for entering approximate dates of birth when precise value is not * known. */ public class AgeElement extends TextEntryElement { public static final String TAG = AgeElement.class.getSimpleName(); Date dateAnswer = new Date(); NumberPicker mWidget; long age = 0; /** * Default constructor * * @param id * @param question * @param answer * @param concept * @param figure * @param audio */ protected AgeElement(String id, String question, String answer, String concept, String figure, String audio) { super(id, question, answer, concept, figure, audio, NumericType.INTEGER); setAnswer(answer); } @Override public ElementType getType() { return ElementType.AGE; } @Override public void setAnswer(String answer) { Log.i(TAG,"["+id+"]setAnswer(String)"); this.answer = new String(answer); try { dateAnswer = DateUtil.parseDate(answer); age = Functions.age(dateAnswer); } catch (ParseException e) { e.printStackTrace(); } if(isViewActive()) { mWidget.setValue((int)age); //et.setText(String.valueOf(age)); } Log.d(TAG, "...answer='" + this.answer + "'"); Log.d(TAG, "...calculated age='" + age + "'"); } /** {@inheritDoc} */ @Override public String getAnswer() { Log.i(TAG, "[" + id + "]getAnswer()"); if(isViewActive()) { } Log.d(TAG,"...returning answer='" + answer + "'"); return answer; } @Override protected View createView(Context c) { LayoutInflater inflater = ((Activity)c).getLayoutInflater(); LinearLayout v = (LinearLayout)inflater.inflate(R.layout.widget_element_age, null); mWidget = (NumberPicker) v.findViewById(R.id.answer); mWidget.setMaxValue(120); mWidget.setMinValue(0); mWidget.setValue((int) age); mWidget.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { setAge(newVal); } }); /* et = new EditText(c); et.setText(String.valueOf(age)); et.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); et.setKeyListener(new DigitsKeyListener()); */ //return encapsulateQuestion(c, et); return encapsulateQuestion(c, v); } public void setAge(long age){ Log.i(TAG, "[" + id + "]setAge()"); Log.d(TAG, "....age="+age); this.age = age; DateTime dateTime = new DateTime(); int month = dateTime.getMonthOfYear(); int day = dateTime.getDayOfMonth(); if(month < 6 || (month == 6 && day < 15)) { dateAnswer = dateTime.minusYears((int)age + 1).withMonthOfYear(6) .withDayOfMonth(15).toLocalDate().toDate(); } else { dateAnswer = dateTime.minusYears((int)age).withMonthOfYear(6) .withDayOfMonth(15).toLocalDate().toDate(); } answer = DateUtil.format(dateAnswer); Log.d(TAG, "....answer="+answer); } public static AgeElement fromXML(String id, String question, String answer, String concept, String figure, String audio, Node n) throws ProcedureParseException { return new AgeElement(id, question, answer, concept, figure, audio); } }