package com.heinrichreimersoftware.singleinputform.steps;
import android.app.DatePickerDialog;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.text.InputType;
import android.text.TextUtils;
import android.view.View;
import android.widget.DatePicker;
import android.widget.TextView;
import com.heinrichreimersoftware.singleinputform.R;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class DateStep extends TextStep{
public static final String DATA_YEAR = "data_year";
public static final String DATA_MONTH = "data_month";
public static final String DATA_DAY = "data_day";
private int mYear;
private int mMonth;
private int mDay;
private StepChecker mChecker;
public DateStep(Context context, String dataKey, int titleResId, int errorResId, int detailsResId, StepChecker checker, TextView.OnEditorActionListener l){
super(context, dataKey, InputType.TYPE_NULL, titleResId, errorResId, detailsResId, new TextStep.StepChecker(){
@Override
public boolean check(String input){
return !TextUtils.isEmpty(input);
}
}, l);
mChecker = checker;
if(!(context instanceof FragmentActivity)){
throw new ClassCastException("context has to implement FragmentActivity");
}
final FragmentManager fragmentManager = ((FragmentActivity)context).getSupportFragmentManager();
setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Calendar initial = new GregorianCalendar();
if(mYear >= 0){
initial.set(Calendar.YEAR, mYear);
}
if(mMonth >= 0){
initial.set(Calendar.MONTH, mMonth);
}
if(mDay >= 0){
initial.set(Calendar.DAY_OF_MONTH, mDay);
}
new DatePickerDialog(getContext(), new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) {
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
updateText();
}
}, initial.get(Calendar.YEAR), initial.get(Calendar.MONTH), initial.get(Calendar.DAY_OF_MONTH)).show();
}
});
}
public DateStep(Context context, String dataKey, int titleResId, int errorResId, int detailsResId, TextView.OnEditorActionListener l){
this(context, dataKey, titleResId, errorResId, detailsResId, new StepChecker(){
@Override
public boolean check(int year, int month, int day){
return true;
}
}, l);
}
public DateStep(Context context, String dataKey, int titleResId, int errorResId, int detailsResId, StepChecker checker){
this(context, dataKey, titleResId, errorResId, detailsResId, checker, null);
}
public DateStep(Context context, String dataKey, int titleResId, int errorResId, int detailsResId){
this(context, dataKey, titleResId, errorResId, detailsResId, new StepChecker(){
@Override
public boolean check(int year, int month, int day){
return true;
}
}, null);
}
public DateStep(Context context, String dataKey, String title, String error, String details, StepChecker checker, TextView.OnEditorActionListener l){
super(context, dataKey, InputType.TYPE_NULL, title, error, details, new TextStep.StepChecker(){
@Override
public boolean check(String input){
return !TextUtils.isEmpty(input);
}
}, l);
mChecker = checker;
if(!(context instanceof FragmentActivity)){
throw new ClassCastException("context has to implement FragmentActivity");
}
final FragmentManager fragmentManager = ((FragmentActivity)context).getSupportFragmentManager();
setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Calendar initial = new GregorianCalendar();
if(mYear >= 0){
initial.set(Calendar.YEAR, mYear);
}
if(mMonth >= 0){
initial.set(Calendar.MONTH, mMonth);
}
if(mDay >= 0){
initial.set(Calendar.DAY_OF_MONTH, mDay);
}
new DatePickerDialog(getContext(), new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePickerDialog, int year, int monthOfYear, int dayOfMonth) {
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
updateText();
}
}, initial.get(Calendar.YEAR), initial.get(Calendar.MONTH), initial.get(Calendar.DAY_OF_MONTH)).show();
}
});
}
public DateStep(Context context, String dataKey, String title, String error, String details, TextView.OnEditorActionListener l){
this(context, dataKey, title, error, details, new StepChecker(){
@Override
public boolean check(int year, int month, int day){
return true;
}
}, l);
}
public DateStep(Context context, String dataKey, String title, String error, String details, StepChecker checker){
this(context, dataKey, title, error, details, checker, null);
}
public DateStep(Context context, String dataKey, String title, String error, String details){
this(context, dataKey, title, error, details, new StepChecker(){
@Override
public boolean check(int year, int month, int day){
return true;
}
}, null);
}
public static int year(Bundle data, String dataKey){
int year = Integer.MIN_VALUE;
if(data != null && data.containsKey(dataKey)){
Bundle bundleYear = data.getBundle(dataKey);
if(bundleYear != null){
year = bundleYear.getInt(DATA_YEAR, Integer.MIN_VALUE);
}
}
return year;
}
public static int month(Bundle data, String dataKey){
int month = Integer.MIN_VALUE;
if(data != null && data.containsKey(dataKey)){
Bundle bundleMonth = data.getBundle(dataKey);
if(bundleMonth != null){
month = bundleMonth.getInt(DATA_MONTH, Integer.MIN_VALUE);
}
}
return month;
}
public static int day(Bundle data, String dataKey){
int day = Integer.MIN_VALUE;
if(data != null && data.containsKey(dataKey)){
Bundle bundleDay = data.getBundle(dataKey);
if(bundleDay != null){
day = bundleDay.getInt(DATA_DAY, Integer.MIN_VALUE);
}
}
return day;
}
private void updateText(){
String output = "";
if(mYear >= 0 && mMonth >= 0 && mDay >= 0){
output = getContext().getString(R.string.date_format, mYear, mMonth + 1, mDay);
}
setText(output);
}
@Override
public boolean check(){
return mChecker.check(mYear, mMonth, mDay);
}
@Override
protected void onSave(){
data().putInt(DATA_YEAR, mYear);
data().putInt(DATA_MONTH, mMonth);
data().putInt(DATA_DAY, mDay);
}
@Override
protected void onRestore(){
mYear = data().getInt(DATA_YEAR, -1);
mMonth = data().getInt(DATA_MONTH, -1);
mDay = data().getInt(DATA_DAY, -1);
updateText();
}
public interface StepChecker{
boolean check(int year, int month, int day);
}
}