package org.sana.android.widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.DatePicker;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.ViewSwitcher;
import org.joda.time.LocalDate;
import org.joda.time.Years;
import org.sana.R;
import org.sana.android.app.Locales;
import org.sana.android.app.Preferences;
import org.sana.android.util.Dates;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
*
*/
public class DateOfBirthWidget extends LinearLayout {
public static final String TAG = DateOfBirthWidget.class.getSimpleName();
public static final int MAX_AGE = 120;
DatePicker mDatePicker;
Spinner mSpinner;
CheckBox mCheckBox;
ViewSwitcher mSwitcher;
LocalDate mDate = LocalDate.now();
public DateOfBirthWidget(Context context) {
this(context, null);
}
public DateOfBirthWidget(Context context, AttributeSet attrs) {
this(context, attrs, new Date());
}
public DateOfBirthWidget(Context context, AttributeSet attrs, Date value) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.DateOfBirthWidget, 0, 0);
a.recycle();
setOrientation(LinearLayout.HORIZONTAL);
setGravity(Gravity.CENTER_VERTICAL);
String locale = Preferences.getString(getContext(),
getContext().getString(R.string.setting_locale), "en");
Locales.updateLocale(getContext(), locale);
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.widget_date_of_birth, this, true);
mSpinner = (Spinner)findViewById(R.id.spinner);
mSpinner.setAdapter((SpinnerAdapter) getYearsAdapter());
mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
onAgeSelected(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
onAgeSelected(0);
}
});
// Set the date
if(value != null){
mDate = new LocalDate(value);
}
mDatePicker = (DatePicker)findViewById(R.id.datePicker);
init(mDate, new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
onDateSelected(year, monthOfYear, dayOfMonth);
}
});
mSwitcher = (ViewSwitcher)findViewById(R.id.viewSwitcher);
mCheckBox = (CheckBox)findViewById(R.id.checkbox);
mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
onDefaultSelectorChecked(isChecked);
}
});
}
protected Adapter getYearsAdapter(){
List<Integer> years = new ArrayList<Integer>(MAX_AGE + 1);
for(int i = 0; i < years.size(); i++){
years.add(i,i);
}
ArrayAdapter<Integer> adapter = new ArrayAdapter<Integer>(getContext(),
android.R.layout.simple_spinner_item, years);
return adapter;
}
protected final void onAgeSelected(int age){
mDate = LocalDate.now().withMonthOfYear(6).withDayOfMonth(15)
.minusYears(age);
}
protected final void onDateSelected(int year, int month, int day){
mDate = new LocalDate(year,month,day);
}
protected final void onDefaultSelectorChecked(boolean isChecked){
mDatePicker.updateDate(mDate.getYear(), mDate.getMonthOfYear(), mDate.getDayOfMonth());
int age = Years.yearsBetween(mDate, LocalDate.now()).getYears();
mSpinner.setSelection(age);
mSwitcher.showNext();
}
public String getValue(){
return Dates.toSQL(mDate.toDate());
}
public void setValue(String value){
try {
mDate = new LocalDate(Dates.fromSQL(value));
} catch (ParseException e) {
e.printStackTrace();
}
updateDate(mDate.getYear(),mDate.getMonthOfYear(),mDate.getDayOfMonth());
}
public void init(LocalDate date, DatePicker.OnDateChangedListener mListener){
mDatePicker.init(date.getYear(), date.getMonthOfYear(), date.getDayOfMonth(), mListener);
int age = Years.yearsBetween(date, LocalDate.now()).getYears();
mSpinner.setSelection(age);
}
public void updateDate(int year, int month, int day){
mDatePicker.updateDate(mDate.getYear(), mDate.getMonthOfYear(), mDate.getDayOfMonth());
int age = Years.yearsBetween(mDate, LocalDate.now()).getYears();
mSpinner.setSelection(age);
}
public void setDefaultText(String text){
mCheckBox.setText(text);
}
public void setDefaultText(int resId){
String locale = Preferences.getString(getContext(),
getContext().getString(R.string.setting_locale), "en");
Locales.updateLocale(getContext(), locale);
mCheckBox.setText(resId);
}
}