package it.geosolutions.geocollect.android.core.widgets; import java.text.ParseException; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import android.R; import android.annotation.SuppressLint; import android.app.DatePickerDialog; import android.content.Context; import android.os.Build; import android.text.InputType; import android.text.format.DateFormat; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.EditText; /** * Date Picker that seems like the Google Calendar's one * * **Note**: Min and Max date works only with versions of android sdk >10 * @author Lorenzo Natali (lorenzo.natali@geo-solutions.it) * */ @SuppressLint("NewApi") public class DatePicker extends EditText implements DatePickerDialog.OnDateSetListener { public interface OnDateSetListener { public void onDateSet(DatePicker view, int year, int month, int day); } protected int year; protected int month; protected int day; protected long maxDate = -1; protected long minDate = -1; protected OnDateSetListener onDateSetListener = null; protected java.text.DateFormat dateFormat; /** * get the DateSetListener * @return OnDateSetListener */ public OnDateSetListener getOnDateSetListener() { return onDateSetListener; } /** * set the OnDateSetListener * @param onDateSetListener */ public void setOnDateSetListener(OnDateSetListener onDateSetListener) { this.onDateSetListener = onDateSetListener; } /** * Constructor for the date picker * @param context * @param attrs */ public DatePicker(Context context, AttributeSet attrs) { //spinner look super(context, attrs,android.R.attr.spinnerStyle); dateFormat = DateFormat.getMediumDateFormat(getContext()); setInputType(InputType.TYPE_DATETIME_VARIATION_DATE); setFocusable(false); setToday(); } public int getYear() { return year; } public void setYear(int year) { this.year = year; updateText(); } public int getMonth() { return month; } public void setMonth(int month) { this.month = month; updateText(); } public int getDay() { return day; } public void setDay(int day) { this.day = day; updateText(); } public void setDate(int year, int month, int day) { this.year = year; this.month = month; this.day = day; updateText(); } /** * Set the date from a formatted String * @param s */ public void setDate(String s) { if (s==null) return; Log.v("DatePitcker", "Got :"+s); try { Calendar c = Calendar.getInstance(); c.setTime(this.dateFormat.parse(s)); this.year = c.get(Calendar.YEAR); this.month = c.get(Calendar.MONTH); this.day = c.get(Calendar.DAY_OF_MONTH); updateText(); } catch (ParseException e) { Log.e("DatePitcker", Log.getStackTraceString(e)); } } @Override public boolean onTouchEvent(MotionEvent event) { if((event.getAction() == MotionEvent.ACTION_DOWN) && (event.getAction() != MotionEvent.ACTION_POINTER_DOWN)) showDatePicker(); return super.onTouchEvent(event); } public java.text.DateFormat getDateFormat() { return dateFormat; } public void setDateFormat(java.text.DateFormat dateFormat) { this.dateFormat = dateFormat; updateText(); } public void setMaxDate(int year, int month, int day) { Calendar c = Calendar.getInstance(); c.set(year, month, day, 23, 59, 59); this.maxDate = c.getTimeInMillis(); } public void setMinDate(int year, int month, int day) { Calendar c = Calendar.getInstance(); c.set(year, month, day, 0, 0, 0); this.minDate = c.getTimeInMillis(); } public void setToday() { Calendar c = Calendar.getInstance(); setDate(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)); } protected void showDatePicker() { DatePickerDialog datePickerDialog; datePickerDialog = new DatePickerDialog( getContext(), this, getYear(), getMonth(), getDay()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { if (this.maxDate != -1) { datePickerDialog.getDatePicker().setMaxDate(maxDate); } if (this.minDate != -1) { datePickerDialog.getDatePicker().setMinDate(minDate); } } else { Log.w("DatePicker", "API Level < 11 so not restricting date range..."); } datePickerDialog.show(); } @Override public void onDateSet(android.widget.DatePicker view, int year, int month, int day) { setDate(year, month, day); clearFocus(); if(onDateSetListener != null) onDateSetListener.onDateSet(this, year, month, day); } public void updateText() { Calendar cal = new GregorianCalendar(getYear(), getMonth(), getDay()); setText(dateFormat.format(cal.getTime())); } }