BaseDialog.kt 6.58 KB
/*
 * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2022. All rights reserved.
 */

package com.wd.common.base

import android.app.Activity
import android.app.AlertDialog
import android.app.Dialog
import android.content.Context
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.LinearLayout
import com.wd.foundation.wdkit.animator.AnimatorUtil
import com.wd.fastcoding.base.R


/**
 *  BaseDialog
 *
 * @author liyubing
 * @version [V1.0.0, 2022/6/13]
 * @since V1.0.0
 */
class BaseDialog {
    private var dialog: AlertDialog? = null
    private var mLayoutView: View? = null
    private var mContext: Context? = null
    private var width = 0.0
    private var height = 0.4
    private var isCancelable = true
    private var dialogHeight = ViewGroup.LayoutParams.WRAP_CONTENT
    private var onSureClickListener: OnSureClickListener? = null
    private val onCancelClickListener: OnCancelClickListener? = null

    private var onDismissListener: OnDismissListener? = null

    /**
     * 任意控件点击事件接口
     */
    interface OnClickListener {
        fun onClick(view: View?, dialog: Dialog?)
    }

    fun setDismissListener(onDismissListener: OnDismissListener): BaseDialog {
        this.onDismissListener = onDismissListener
        return this
    }

    fun setDialogHeight(dialogHeight: Int): BaseDialog {
        this.dialogHeight = dialogHeight
        return this
    }

    fun isCancelable(isCancelable: Boolean): BaseDialog {
        this.isCancelable = isCancelable
        return this
    }

    interface OnAdapterChangeListener {
        fun onClick(position: Int, o: Any?, dialog: Dialog?)
    }

    /**
     * 任意控件点击事件
     */
    fun setOnClickListener(
        view: View,
        onClickListener: OnClickListener?
    ): BaseDialog? {
        view.setOnClickListener {
            onClickListener?.onClick(view, dialog)
        }
        return mDialog
    }

    /**
     * 弹窗消失接口
     */
    interface OnDismissListener {
        fun onDismiss()
    }

    /**
     * 确定控件点击事件接口
     */
    interface OnSureClickListener {
        fun onClick(dialog: Dialog?)
    }

    /**
     * 取消控件点击事件接口
     */
    interface OnCancelClickListener {
        fun onClick(dialog: Dialog?)
    }

    /**
     * 取消控件点击事件
     */
    fun setOnCancelClickListener(view: View): BaseDialog? {
        view.setOnClickListener { dialog!!.dismiss() }
        return mDialog
    }

    /**
     * 取消控件点击事件
     */
    fun setOnCancelClickListener(
        view: View,
        onCancelClickListener: OnCancelClickListener?
    ): BaseDialog? {
        view.setOnClickListener { onCancelClickListener?.onClick(dialog) }
        return mDialog
    }

    /**
     * 确定控件点击事件
     */
    fun setOnSureClickListener(
        view: View, onSureClickListener: OnSureClickListener?
    ): BaseDialog? {
        view.setOnClickListener {
            onSureClickListener?.onClick(dialog)
        }
        return mDialog
    }

    fun setWindow(width: Double, height: Double): BaseDialog {
        this.width = width
        this.height = height
        return this
    }

    fun setLayoutView(
        layoutView: View?
    ): BaseDialog? {
        mLayoutView = layoutView
        this.mContext = layoutView?.context
        return mDialog
    }

    /**
     * 弹窗位于中间
     *
     * @return
     */
    fun showCenter(): BaseDialog? {
        mContext?.apply {
            if (mLayoutView?.parent != null) {
                (mLayoutView?.parent as ViewGroup).removeAllViews()
            }
            dialog = AlertDialog.Builder(this, R.style.custom_dialog2).create()
            dialog?.setCancelable(isCancelable)
            dialog?.show()
            dialog?.setContentView(mLayoutView!!, ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dialogHeight))
            val dialogWindow = dialog?.window
            dialogWindow?.setGravity(Gravity.CENTER)
            val lp = dialogWindow?.attributes
            val d = mContext?.resources?.displayMetrics // 获取屏幕宽、高用

            if (width == 0.0) {
                lp?.width = LinearLayout.LayoutParams.WRAP_CONTENT
            } else {
                lp?.width = (d?.widthPixels?.times(width))?.toInt()
            }
            if (height == 0.0) {
                lp?.height = LinearLayout.LayoutParams.WRAP_CONTENT
            } else {
                lp?.height = (d?.heightPixels?.times(height))?.toInt()
            }
            dialog?.setOnDismissListener {
                onDismissListener?.onDismiss()
                dialog?.dismiss() }
            dialog?.setOnCancelListener { dialog?.dismiss() }
            dialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
            dialogWindow?.attributes = lp

        }
        return mDialog
    }

    /**
     * 弹窗位于底部
     *
     * @return
     */
    fun showBottom(): BaseDialog? {
        dialog = AlertDialog.Builder(mContext!!, R.style.custom_dialog2).create()
        dialog?.setCancelable(isCancelable)
        dialog?.show()
        dialog?.setContentView(
            mLayoutView!!,
            ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dialogHeight)
        )
        val dialogWindow = dialog?.window
        dialogWindow?.setGravity(Gravity.BOTTOM)
        val lp = dialogWindow?.attributes
        lp?.width = WindowManager.LayoutParams.MATCH_PARENT
        lp?.y = 0
        dialogWindow?.attributes = lp
        dialog?.setOnDismissListener {
            AnimatorUtil.startVerticalDown(mLayoutView, dialog)
        }
        dialog?.setOnCancelListener { AnimatorUtil.startVerticalDown(mLayoutView, dialog) }
        AnimatorUtil.startVerticalUp(mLayoutView)
        dialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
        dialog?.setOnCancelListener { onDismissListener?.onDismiss()}
        return mDialog
    }

    fun dismiss(): BaseDialog? {
        if (mDialog != null && dialog != null && dialog?.isShowing == true) {
            if (mContext is Activity) {
                if (!(mContext as Activity).isDestroyed && !(mContext as Activity).isFinishing) {
                    dialog?.dismiss()
                }
            }
        }
        return mDialog
    }

    fun getDialog():AlertDialog?{
        return dialog
    }

    companion object {
        private var mDialog: BaseDialog? = null
        val instance: BaseDialog?
            get() {
                mDialog = BaseDialog()
                return mDialog
            }


    }
}