package com.casic.smarttube.widgets import android.app.Dialog import android.content.Context import android.os.Bundle import android.view.Gravity import androidx.fragment.app.FragmentManager import com.casic.smarttube.R import com.casic.smarttube.databinding.DialogSelectDateBinding import com.casic.smarttube.utils.LocaleConstant import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.resetParams import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToTime import java.text.ParseException import java.text.SimpleDateFormat import java.util.Locale class DateSelectDialog private constructor(builder: Builder) : Dialog( builder.context, R.style.UserDefinedDialogStyle ) { private val ctx: Context = builder.context private val title: String = builder.title private val negativeBtn: String = builder.negativeBtn private val positiveBtn: String = builder.positiveBtn private val listener: OnDialogButtonClickListener = builder.listener private val fragmentManager: FragmentManager = builder.fragmentManager private val type: Type = builder.type class Builder { lateinit var context: Context lateinit var title: String lateinit var negativeBtn: String lateinit var positiveBtn: String lateinit var listener: OnDialogButtonClickListener lateinit var fragmentManager: FragmentManager lateinit var type: Type fun setContext(context: Context): Builder { this.context = context return this } fun setTitle(title: String): Builder { this.title = title return this } fun setNegativeButton(name: String): Builder { this.negativeBtn = name return this } fun setPositiveButton(name: String): Builder { this.positiveBtn = name return this } fun setOnDialogButtonClickListener(listener: OnDialogButtonClickListener): Builder { this.listener = listener return this } fun setFragmentManager(fragmentManager: FragmentManager): Builder { this.fragmentManager = fragmentManager return this } fun setCalendarType(calendarType: Type): Builder { this.type = calendarType return this } fun build(): DateSelectDialog { return DateSelectDialog(this) } } private val binding: DialogSelectDateBinding by binding() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.resetParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.85f) setContentView(R.layout.dialog_select_date) setCancelable(false) setCanceledOnTouchOutside(false) if (title.isNotBlank()) { binding.dialogTitleView.text = title } binding.startDateView.setOnClickListener { TimePickerDialog.Builder() .setThemeColor(R.color.mainThemeColor.convertColor(ctx)) .setTitleStringId("请选择起始时间") .setWheelItemTextSize(16) .setCyclic(false) .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) .setMaxMillseconds(System.currentTimeMillis()) .setType(type) .setCallBack { _: TimePickerDialog?, millSeconds: Long -> val textValue = if (type == Type.ALL) { millSeconds.timestampToTime() } else { millSeconds.timestampToCompleteDate() } binding.startDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") } binding.endDateView.setOnClickListener { TimePickerDialog.Builder() .setThemeColor(R.color.mainThemeColor.convertColor(ctx)) .setTitleStringId("请选择起始时间") .setWheelItemTextSize(16) .setCyclic(false) .setMinMillseconds(System.currentTimeMillis() - LocaleConstant.FIVE_YEARS) .setMaxMillseconds(System.currentTimeMillis()) .setType(type) .setCallBack { _: TimePickerDialog?, millSeconds: Long -> val textValue = if (type == Type.ALL) { millSeconds.timestampToTime() } else { millSeconds.timestampToCompleteDate() } binding.endDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") } binding.dialogCancelButton.text = negativeBtn binding.dialogCancelButton.setOnClickListener { listener.onCancelClick() this.dismiss() } binding.dialogConfirmButton.text = positiveBtn binding.dialogConfirmButton.setOnClickListener { //判断其实时间和结束时间 val startDate = binding.startDateView.text.toString() val endDate = binding.endDateView.text.toString() if (isEarlierThanStart(startDate, endDate)) { "结束时间不能早于开始时间".show(ctx) return@setOnClickListener } listener.onConfirmClick(startDate, endDate) this.dismiss() } } interface OnDialogButtonClickListener { fun onConfirmClick(startDate: String, endDate: String) fun onCancelClick() } /** * 判断时间是否早于当前时间 */ private fun isEarlierThanStart(start: String, end: String): Boolean { if (start.isBlank() || end.isBlank()) { return false } val dateFormat = if (type == Type.ALL) { SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) } else { SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) } try { return dateFormat.parse(start)?.time!! > dateFormat.parse(end)?.time!! } catch (e: ParseException) { e.printStackTrace(); } return false } }