package cn.mutils.app.ui;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.Date;
import cn.mutils.app.R;
import cn.mutils.app.util.AppUtil;
import kankan.wheel.widget.NumericWheelAdapter;
import kankan.wheel.widget.OnWheelChangedListener;
import kankan.wheel.widget.WheelView;
/**
* Date chooser like iOS
*/
@SuppressLint("InflateParams")
@SuppressWarnings({"deprecation", "unused"})
public class DateChooser {
/**
* Date chooser listener
*/
public static abstract class OnChooseDateListener {
/**
* Submit date choose
*/
public abstract void onChoosed(DateChooser chooser, Date date);
/**
* Give date while choosing
*/
public void onChoosing(DateChooser chooser, Date date) {
}
/**
* Cancel choose
*/
public void onCancel(DateChooser chooser) {
}
/**
* Get text for InfoToast when choose date is above maximum date
*/
public String onChoosedAboveMaxDate(DateChooser chooser, Date maxDate) {
return "无效时间";
}
/**
* Get text for InfoToast when choose date is down minimum date
*/
public String onChoosedDownMinDate(DateChooser chooser, Date minDate) {
return "无效时间";
}
}
/**
* Listener
*/
protected OnChooseDateListener mOnChooseDateListener;
/**
* Dialog
*/
protected Dialoger mDialog;
protected Context mContext;
/**
* Whether pick hour minute
*/
protected boolean mPickTime;
/**
* Start year to pick
*/
protected Integer mStartYear;
/**
* End year to pick
*/
protected Integer mEndYear;
protected View mContentView;
/**
* Year wheel view
*/
protected WheelView mYearView;
/**
* Month wheel view
*/
protected WheelView mMonthView;
/**
* Day wheel view
*/
protected WheelView mDayView;
/**
* Hour wheel view
*/
protected WheelView mHourView;
/**
* Minute wheel view
*/
protected WheelView mMinuteView;
protected InfoToast mInfoToast;
/**
* Date picked
*/
protected Date mPickedDate;
protected Date mMinDate;
protected Date mMaxDate;
public DateChooser(Context context) {
mContext = context;
}
public void setMinDate(Date minDate) {
mMinDate = minDate;
}
public void setMaxDate(Date maxDate) {
mMaxDate = maxDate;
}
public void setStartYear(int startYear) {
if (mDialog != null) {
return;
}
mStartYear = startYear;
}
public void setEndYear(int endYear) {
if (mDialog != null) {
return;
}
mEndYear = endYear;
}
public boolean isPickTime() {
return mPickTime;
}
public void setPickTime(boolean pickTime) {
if (mDialog != null) {
return;
}
mPickTime = pickTime;
}
public void setListener(OnChooseDateListener listener) {
mOnChooseDateListener = listener;
}
public void ok() {
if (mDialog == null) {
return;
}
if (mOnChooseDateListener != null) {
int year = mYearView.getCurrentItem() + mStartYear;
int month = mMonthView.getCurrentItem() + 1;
int day = mDayView.getCurrentItem() + 1;
int hour = mPickTime ? mHourView.getCurrentItem() : 0;
int minute = mPickTime ? mMinuteView.getCurrentItem() : 0;
mPickedDate = AppUtil.getDate(year, month, day, hour, minute);
if (mMaxDate != null && mPickedDate.getTime() > mMaxDate.getTime()) {
if (mOnChooseDateListener != null) {
mInfoToast.show(mOnChooseDateListener.onChoosedAboveMaxDate(DateChooser.this, mMaxDate), 3000);
} else {
mInfoToast.show("无效时间", 3000);
}
return;
}
if (mMinDate != null && mPickedDate.getTime() < mMinDate.getTime()) {
if (mOnChooseDateListener != null) {
mInfoToast.show(mOnChooseDateListener.onChoosedDownMinDate(DateChooser.this, mMinDate), 3000);
} else {
mInfoToast.show("无效时间", 3000);
}
return;
}
if (mOnChooseDateListener != null) {
mOnChooseDateListener.onChoosed(DateChooser.this, mPickedDate);
}
}
dismiss();
}
public void cancel() {
if (mDialog == null) {
return;
}
if (mOnChooseDateListener != null) {
mOnChooseDateListener.onCancel(this);
}
mDialog.cancel();
mDialog = null;
}
public void dismiss() {
if (mDialog == null) {
return;
}
mDialog.dismiss();
mDialog = null;
}
public void show() {
show(null);
}
public void show(Date pickedDate) {
if (mDialog != null) {
mDialog.show();
return;
}
Date current = null;
LayoutInflater inflater = LayoutInflater.from(mContext);
mContentView = inflater.inflate(R.layout.date_chooser, null);
mContentView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cancel();
}
});
mContentView.findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cancel();
}
});
mContentView.findViewById(R.id.ok).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ok();
}
});
mInfoToast = (InfoToast) mContentView.findViewById(R.id.info_toast);
mYearView = (WheelView) mContentView.findViewById(R.id.year);
if (mStartYear == null) {
current = new Date();
mStartYear = AppUtil.getYear(current) - 50;
}
if (mEndYear == null) {
current = current != null ? current : new Date();
mEndYear = AppUtil.getYear(current) + 50;
}
if (pickedDate == null) {
current = current != null ? current : new Date();
pickedDate = current;
}
mYearView.setAdapter(new NumericWheelAdapter(mStartYear, mEndYear));
mYearView.setCyclic(true);
mYearView.setLabel("年");
mYearView.setCurrentItem(AppUtil.getYear(pickedDate) - mStartYear);
mMonthView = (WheelView) mContentView.findViewById(R.id.month);
mMonthView.setAdapter(new NumericWheelAdapter(1, 12));
mMonthView.setCyclic(true);
mMonthView.setLabel("月");
mMonthView.setCurrentItem(AppUtil.getMonth(pickedDate) - 1);
mDayView = (WheelView) mContentView.findViewById(R.id.day);
mDayView.setCyclic(true);
mDayView.setAdapter(new NumericWheelAdapter(1, AppUtil.getDaysOfMonth(pickedDate)));
mDayView.setLabel("日");
mDayView.setCurrentItem(AppUtil.getDay(pickedDate) - 1);
mHourView = (WheelView) mContentView.findViewById(R.id.hour);
mMinuteView = (WheelView) mContentView.findViewById(R.id.min);
if (mPickTime) {
mHourView.setVisibility(View.VISIBLE);
mMinuteView.setVisibility(View.VISIBLE);
mHourView.setAdapter(new NumericWheelAdapter(0, 23));
mHourView.setCyclic(true);
mHourView.setLabel("时");
mHourView.setCurrentItem(pickedDate.getHours());
mMinuteView.setAdapter(new NumericWheelAdapter(0, 59));
mMinuteView.setCyclic(true);
mMinuteView.setLabel("分");
mMinuteView.setCurrentItem(pickedDate.getMinutes());
} else {
mHourView.setVisibility(View.GONE);
mMinuteView.setVisibility(View.GONE);
}
OnWheelChangedListener onWheelChangedListener4Leap = new OnWheelChangedListener() {
@Override
public void onChanged(WheelView wheel, int oldValue, int newValue) {
int year = mYearView.getCurrentItem() + mStartYear;
int month = mMonthView.getCurrentItem() + 1;
int dayIndex = mDayView.getCurrentItem();
int dayCount = AppUtil.getDaysOfMonth(year, month);
mDayView.setAdapter(new NumericWheelAdapter(1, dayCount));
if (dayIndex >= dayCount) {
mDayView.setCurrentItem(0);
}
}
};
mYearView.addChangingListener(onWheelChangedListener4Leap);
mMonthView.addChangingListener(onWheelChangedListener4Leap);
int screenHeight = mContext.getResources().getDisplayMetrics().heightPixels;
int textSize = (int) ((screenHeight / 100.0) * (mPickTime ? 3 : 4));
mYearView.TEXT_SIZE = textSize;
mMonthView.TEXT_SIZE = textSize;
mDayView.TEXT_SIZE = textSize;
mHourView.TEXT_SIZE = textSize;
mMinuteView.TEXT_SIZE = textSize;
OnWheelChangedListener onWheelChangedListener = new OnWheelChangedListener() {
@Override
public void onChanged(WheelView wheel, int oldValue, int newValue) {
int year = mYearView.getCurrentItem() + mStartYear;
int month = mMonthView.getCurrentItem() + 1;
int day = mDayView.getCurrentItem() + 1;
int hour = mPickTime ? mHourView.getCurrentItem() : 0;
int minute = mPickTime ? mMinuteView.getCurrentItem() : 0;
mPickedDate = AppUtil.getDate(year, month, day, hour, minute);
if (mOnChooseDateListener != null) {
mOnChooseDateListener.onChoosing(DateChooser.this, mPickedDate);
}
}
};
mYearView.addChangingListener(onWheelChangedListener);
mMonthView.addChangingListener(onWheelChangedListener);
mDayView.addChangingListener(onWheelChangedListener);
mHourView.addChangingListener(onWheelChangedListener);
mMinuteView.addChangingListener(onWheelChangedListener);
mDialog = new Dialoger(mContext);
mDialog.setWindowAnimations(R.style.DialogerOnBottomAnim);
mDialog.setContentView(mContentView,
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
cancel();
}
});
mDialog.requestHFill();
mDialog.show();
}
}