Newer
Older
CasicSmartTube / app / src / main / java / com / casic / smarttube / widgets / DateSelectDialog.kt
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
    }
}