Newer
Older
Endoscope / app / src / main / java / com / casic / endoscope / widgets / BluetoothDeviceDialog.kt
package com.casic.endoscope.widgets

import android.annotation.SuppressLint
import android.app.Dialog
import android.content.Context
import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.AbsListView
import android.widget.AdapterView
import android.widget.BaseAdapter
import android.widget.TextView
import com.casic.endoscope.R
import com.casic.endoscope.databinding.DialogBluetoothDeviceBinding
import com.clj.fastble.data.BleDevice
import com.pengxh.kt.lite.extensions.binding
import com.pengxh.kt.lite.extensions.dp2px
import com.pengxh.kt.lite.extensions.initDialogLayoutParams

class BluetoothDeviceDialog private constructor(builder: Builder) : Dialog(
    builder.context, R.style.UserDefinedDialogStyle
) {
    private val kTag = "AddCameraPointDialog"
    private val ctx = builder.context
    private var beans = builder.beans
    private val negativeBtn = builder.negativeBtn
    private val listener = builder.listener

    class Builder {
        lateinit var context: Context
        lateinit var beans: ArrayList<BleDevice>
        lateinit var negativeBtn: String
        lateinit var listener: OnDialogButtonClickListener

        fun setContext(context: Context): Builder {
            this.context = context
            return this
        }

        fun setDeviceArray(beans: ArrayList<BleDevice>): Builder {
            this.beans = beans
            return this
        }

        fun setNegativeButton(name: String): Builder {
            this.negativeBtn = name
            return this
        }

        fun setOnDialogButtonClickListener(listener: OnDialogButtonClickListener): Builder {
            this.listener = listener
            return this
        }

        fun build(): BluetoothDeviceDialog {
            return BluetoothDeviceDialog(this)
        }
    }

    private val binding: DialogBluetoothDeviceBinding by binding()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        this.initDialogLayoutParams(0.3f)
        setContentView(R.layout.dialog_bluetooth_device)
        setCanceledOnTouchOutside(false)
        initView()
    }

    private fun initView() {
        binding.cancelButton.text = negativeBtn
        binding.cancelButton.setOnClickListener {
            dismiss()
            listener.onCancelClick()
        }

        binding.listView.adapter = ItemListAdapter(ctx)
        binding.listView.onItemClickListener =
            AdapterView.OnItemClickListener { _, _, position, _ ->
                dismiss()
                listener.onItemClick(position)
            }
    }

    inner class ItemListAdapter(context: Context) : BaseAdapter() {

        private val inflater: LayoutInflater = LayoutInflater.from(context)

        override fun getCount(): Int = beans.size

        override fun getItem(position: Int): Any = beans[position]

        override fun getItemId(position: Int): Long = position.toLong()

        @SuppressLint("MissingPermission")
        override fun getView(position: Int, convertView: View?, viewGroup: ViewGroup?): View {
            val view: View
            val holder: ItemViewHolder
            if (convertView == null) {
                holder = ItemViewHolder()
                view = inflater.inflate(R.layout.item_action_sheet, null)
                holder.itemView = view.findViewById(R.id.sheetItemView)
                view.tag = holder
            } else {
                view = convertView
                holder = view.tag as ItemViewHolder
            }
            holder.itemView.setBackgroundResource(R.drawable.sheet_item_middle_selector)
            holder.itemView.text = beans[position].name
            holder.itemView.textSize = 16f
            holder.itemView.setTextColor(Color.BLUE)
            //需要动态设置item的高度
            val param = AbsListView.LayoutParams(
                WindowManager.LayoutParams.MATCH_PARENT, 55.dp2px(ctx)
            )
            view.layoutParams = param
            return view
        }

    }

    internal class ItemViewHolder {
        lateinit var itemView: TextView
    }

    interface OnDialogButtonClickListener {
        fun onItemClick(position: Int)

        fun onCancelClick()
    }
}