package com.qmusic.controls.dialogs; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog.Builder; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.os.Build; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.widget.DatePicker; import android.widget.TimePicker; import com.qmusic.R; import com.qmusic.common.BConstants; public final class BDateTimePickerFragment extends BaseDialogFragment implements DialogInterface.OnClickListener { static final String TAG = BDateTimePickerFragment.class.getSimpleName(); public static final int MODE_TIME = 0; public static final int MODE_DATE = 1; public static final int MODE_BOTH = 2; Calendar calendar; TimePicker timePicker; DatePicker datePicker; OnDateTimePickerSelectedCallback callback; long minimumDate = Long.MIN_VALUE; SimpleDateFormat sdf; int mode; String defaultDate, dateFormat; public static final BDateTimePickerFragment getInstance(int mode, String defaultDate, long minimumDate, String dateFormat) { BDateTimePickerFragment fragment = new BDateTimePickerFragment(); Bundle bundle = new Bundle(); bundle.putInt("mode", mode); bundle.putString("defaultDate", defaultDate); bundle.putLong("minimumDate", minimumDate); bundle.putString("dateFormat", dateFormat); fragment.setArguments(bundle); fragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0); fragment.setCancelable(false); return fragment; } /** * During creation, if arguments have been supplied to the fragment then * parse those out. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); calendar = Calendar.getInstance(); Bundle args; if (savedInstanceState != null) { args = savedInstanceState; } else { args = getArguments(); } mode = args.getInt("mode"); defaultDate = args.getString("defaultDate"); minimumDate = args.getLong("minimumDate"); dateFormat = args.getString("dateFormat"); if (!TextUtils.isEmpty(dateFormat) && !TextUtils.isEmpty(defaultDate)) { try { sdf = new SimpleDateFormat(dateFormat, Locale.US); Date date = null; try { if (TextUtils.isDigitsOnly(defaultDate)) { long epoch = Long.parseLong(defaultDate); date = new Date(epoch); } else { date = sdf.parse(defaultDate); } } catch (Exception ex1) { try { String tmpDateStr = defaultDate.replace("UTC", "GMT"); date = sdf.parse(tmpDateStr); } catch (Exception ex2) { ex2.printStackTrace(); } } if (date != null) { calendar.setTime(date); } } catch (Exception e) { e.printStackTrace(); } } } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (callback == null && activity instanceof OnDateTimePickerSelectedCallback) { callback = (OnDateTimePickerSelectedCallback) activity; } } @Override public void onSaveInstanceState(Bundle bundle) { bundle.putInt("mode", mode); bundle.putString("defaultDate", defaultDate); bundle.putLong("minimumDate", minimumDate); bundle.putString("dateFormat", dateFormat); } @SuppressLint("NewApi") @Override public Dialog onCreateDialog(Bundle savedInstanceState) { LayoutInflater vi = (LayoutInflater) this.getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layout = vi.inflate(R.layout.fragment_date_time_picker, null); timePicker = (TimePicker) layout.findViewById(R.id.fragment_time_picker1); datePicker = (DatePicker) layout.findViewById(R.id.fragment_date_picker1); if (Build.VERSION.SDK_INT >= 11 && minimumDate > 0) { datePicker.setMinDate(minimumDate); datePicker.setCalendarViewShown(false); } timePicker.setVisibility(View.GONE); datePicker.setVisibility(View.GONE); if (mode == MODE_TIME || mode == MODE_BOTH) { timePicker.setVisibility(View.VISIBLE); timePicker.setIs24HourView(true); timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY)); timePicker.setCurrentMinute(calendar.get(Calendar.MINUTE)); } if (mode == MODE_DATE || mode == MODE_BOTH) { datePicker.setVisibility(View.VISIBLE); datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE), null); } Builder builder = new Builder(this.getActivity()); builder.setView(layout); builder.setPositiveButton(android.R.string.ok, this); builder.setNegativeButton(android.R.string.cancel, this); Dialog dialog = builder.create(); return dialog; } public static interface OnDateTimePickerSelectedCallback { void callback(int result, Date date); } public void setCallbackDate(OnDateTimePickerSelectedCallback callback) { this.callback = callback; } @Override public void onClick(DialogInterface dialog, int which) { if (callback == null) return; if (which == DialogInterface.BUTTON_POSITIVE) { datePicker.clearFocus(); timePicker.clearFocus(); calendar.set(datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth(), timePicker.getCurrentHour(), timePicker.getCurrentMinute()); if (calendar.getTimeInMillis() >= minimumDate) { Date dateReturn = calendar.getTime(); callback.callback(BConstants.MSG_RESULT_OK, dateReturn); } else { callback.callback(BConstants.MSG_RESULT_CANCELED, null); if (sdf != null) { BToast.toast("Please select a date later than " + sdf.format(new Date(minimumDate))); } } } else if (which == DialogInterface.BUTTON_NEGATIVE) { callback.callback(BConstants.MSG_RESULT_CANCELED, null); } } }