Newer
Older
CasicSmartTube / app / src / main / java / com / casic / smarttube / view / GroupDeviceActivity.kt
package com.casic.smarttube.view

import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.casic.smarttube.R
import com.casic.smarttube.adapter.DeviceListAdapter
import com.casic.smarttube.databinding.ActivityGroupDeviceBinding
import com.casic.smarttube.extensions.initImmersionBar
import com.casic.smarttube.model.DeviceListModel
import com.casic.smarttube.utils.LocaleConstant
import com.casic.smarttube.vm.DeviceViewModel
import com.casic.smarttube.vm.ProjectGroupViewModel
import com.casic.smarttube.widgets.MultiSelectDialog
import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets
import com.pengxh.kt.lite.extensions.dp2px
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.extensions.show
import com.pengxh.kt.lite.utils.ActivityStackManager
import com.pengxh.kt.lite.utils.LiteKitConstant
import com.pengxh.kt.lite.utils.LoadState
import com.pengxh.kt.lite.utils.LoadingDialog
import com.pengxh.kt.lite.widget.EasyPopupWindow
import com.pengxh.kt.lite.widget.TitleBarView
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction
import com.qmuiteam.qmui.recyclerView.QMUISwipeAction

class GroupDeviceActivity : KotlinBaseActivity<ActivityGroupDeviceBinding>() {

    private lateinit var groupId: String
    private lateinit var groupViewModel: ProjectGroupViewModel
    private lateinit var deviceViewModel: DeviceViewModel
    private lateinit var deviceAdapter: DeviceListAdapter
    private val context = this
    private val easyPopupWindow by lazy { EasyPopupWindow(this) }
    private val marginOffsets by lazy { 6.dp2px(this) }
    private var dataRows: MutableList<DeviceListModel.DataModel> = ArrayList()
    private var page = 1
    private var isRefresh = false
    private var isLoadMore = false
    private var order = 0
    private var clickedPosition = 0
    private var isDeleteAll = false

    override fun initViewBinding(): ActivityGroupDeviceBinding {
        return ActivityGroupDeviceBinding.inflate(layoutInflater)
    }

    override fun setupTopBarLayout() {
        binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor)
        binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener {
            override fun onLeftClick() {
                finish()
            }

            override fun onRightClick() {
                easyPopupWindow.showAsDropDown(binding.titleView, binding.titleView.width, 0)
            }
        })
    }

    override fun initOnCreate(savedInstanceState: Bundle?) {
        ActivityStackManager.addActivity(this)
        groupId = intent.getStringExtra(LiteKitConstant.INTENT_PARAM_KEY)!!
        binding.titleView.setTitle(String.format(groupId + "项目设备列表"))

        groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java]
        groupViewModel.deviceListData.observe(this) {
            if (it.code == 200) {
                bindRecyclerView(it)
            }
        }
        getDeviceListByPage()

        deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java]
        deviceViewModel.deleteResultData.observe(this) {
            if (it.code == 200) {
                if (isDeleteAll) {
                    dataRows.clear()
                    deviceAdapter.notifyItemMoved(0, dataRows.size)
                    deviceAdapter.notifyItemRangeChanged(0, dataRows.size)
                } else {
                    dataRows.removeAt(clickedPosition)
                    deviceAdapter.notifyItemRemoved(clickedPosition)
                    deviceAdapter.notifyItemRangeChanged(
                        clickedPosition, dataRows.size - clickedPosition
                    )
                }
                if (dataRows.size == 0) {
                    binding.emptyView.visibility = View.VISIBLE
                    binding.recyclerView.visibility = View.GONE
                }
            }
        }

        val menuItems = ArrayList<EasyPopupWindow.MenuItem>().apply {
            add(
                EasyPopupWindow.MenuItem(
                    LocaleConstant.DEVICE_OPERATE_IMAGES[0], LocaleConstant.DEVICE_OPERATE_TITLES[0]
                )
            )
            add(
                EasyPopupWindow.MenuItem(
                    LocaleConstant.DEVICE_OPERATE_IMAGES[1], LocaleConstant.DEVICE_OPERATE_TITLES[1]
                )
            )
            add(
                EasyPopupWindow.MenuItem(
                    LocaleConstant.DEVICE_OPERATE_IMAGES[2], LocaleConstant.DEVICE_OPERATE_TITLES[2]
                )
            )
            add(
                EasyPopupWindow.MenuItem(
                    LocaleConstant.DEVICE_OPERATE_IMAGES[3], LocaleConstant.DEVICE_OPERATE_TITLES[3]
                )
            )
        }
        easyPopupWindow.set(menuItems, object : EasyPopupWindow.OnPopupWindowClickListener {
            override fun onPopupItemClicked(position: Int) {
                when (position) {
                    0 -> {
                        navigatePageTo<GroupDeviceMapActivity>(groupId)
                    }

                    1 -> {
                        order = if (order == 0) {
                            1
                        } else {
                            0
                        }
                        page = 1
                        getDeviceListByPage()
                    }

                    2 -> {
                        AlertControlDialog.Builder().setContext(context).setTitle("提示")
                            .setMessage("删除后将无法恢复,是否继续?")
                            .setNegativeButton("容我想想").setPositiveButton("已经想好")
                            .setOnDialogButtonClickListener(object :
                                AlertControlDialog.OnDialogButtonClickListener {
                                override fun onCancelClick() {

                                }

                                override fun onConfirmClick() {
                                    val ids = ArrayList<Long>()
                                    dataRows.forEach {
                                        if (!it.deviceId.isNullOrBlank()) {
                                            ids.add(it.deviceId.toLong())
                                        }
                                    }
                                    isDeleteAll = true
                                    deviceViewModel.deleteDeviceById(context, ids)
                                }
                            }).build().show()
                    }

                    3 -> {
                        MultiSelectDialog.Builder().setContext(this@GroupDeviceActivity)
                            .setTitle("选择设备").setDataSource(dataRows)
                            .setNegativeButton("取消").setPositiveButton("选好了")
                            .setOnDialogButtonClickListener(object :
                                MultiSelectDialog.OnDialogButtonClickListener {
                                override fun onConfirmClick(selectedModels: MutableList<DeviceListModel.DataModel>) {
                                    val ids = ArrayList<Long>()
                                    selectedModels.forEach {
                                        if (!it.deviceId.isNullOrBlank()) {
                                            ids.add(it.deviceId.toLong())
                                        }
                                    }
                                    isDeleteAll = true
                                    deviceViewModel.deleteDeviceById(context, ids)
                                }

                                override fun onCancelClick() {

                                }
                            }).build().show()
                    }
                }
            }
        })
    }

    private fun bindRecyclerView(result: DeviceListModel) {
        dataRows = result.data!!
        when {
            isRefresh -> {
                binding.refreshView.finishRefresh()
                isRefresh = false
                deviceAdapter.refresh(dataRows)
            }

            isLoadMore -> {
                binding.refreshView.finishLoadMore()
                isLoadMore = false
                if (dataRows.size == 0) {
                    "到底了,别拉了".show(this)
                }
                deviceAdapter.loadMore(dataRows)
            }

            else -> {
                if (dataRows.size == 0) {
                    binding.emptyView.visibility = View.VISIBLE
                    binding.recyclerView.visibility = View.GONE
                } else {
                    binding.emptyView.visibility = View.GONE
                    binding.recyclerView.visibility = View.VISIBLE
                    deviceAdapter = DeviceListAdapter(this, dataRows)
                    //绑定侧滑事件
                    swipeAction.attachToRecyclerView(binding.recyclerView)
                    val linearLayoutManager = object : LinearLayoutManager(this) {
                        override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams {
                            return RecyclerView.LayoutParams(
                                ViewGroup.LayoutParams.MATCH_PARENT,
                                ViewGroup.LayoutParams.WRAP_CONTENT
                            )
                        }
                    }
                    binding.recyclerView.layoutManager = linearLayoutManager
                    binding.recyclerView.addItemDecoration(
                        RecyclerViewItemOffsets(
                            marginOffsets, marginOffsets shr 1,
                            marginOffsets, marginOffsets shr 1
                        )
                    )
                    binding.recyclerView.adapter = deviceAdapter
                    deviceAdapter.setOnItemClickListener(object :
                        DeviceListAdapter.OnItemClickListener {
                        override fun onClicked(item: DeviceListModel.DataModel) {
                            if (item.devcode.isNullOrBlank()) {
                                "设备编号为空,无法查看设备详情".show(context)
                                return
                            }
                            navigatePageTo<DeviceDetailActivity>(arrayListOf(groupId, item.devcode))
                        }

                        override fun onHistoryClicked(item: DeviceListModel.DataModel) {
                            if (item.devcode.isNullOrBlank()) {
                                "设备编号为空,无法查看历史数据".show(context)
                                return
                            }
                            navigatePageTo<HistoryDataActivity>(arrayListOf(groupId, item.devcode))
                        }
                    })
                }
            }
        }
    }

    override fun observeRequestState() {
        groupViewModel.loadState.observe(this) {
            if (isRefresh || isLoadMore) {
                return@observe
            }

            when (it) {
                LoadState.Loading -> LoadingDialog.show(this, "数据加载中...")
                else -> LoadingDialog.dismiss()
            }
        }
    }

    override fun initEvent() {
        binding.refreshView.setOnRefreshListener {
            isRefresh = true
            //刷新之后页码重置
            page = 1
            getDeviceListByPage()
        }
        binding.refreshView.setOnLoadMoreListener {
            isLoadMore = true
            page++
            getDeviceListByPage()
        }
    }

    private fun getDeviceListByPage() {
        groupViewModel.getDeviceListByPage(this, groupId, order, page)
    }

    private val swipeAction =
        QMUIRVItemSwipeAction(true, object : QMUIRVItemSwipeAction.Callback() {

            //滑动拉出菜单删除
            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
                clickedPosition = viewHolder.bindingAdapterPosition
                //删除数据库里对应的数据
                val deviceId = dataRows[clickedPosition].deviceId
                if (deviceId.isNullOrBlank()) {
                    "管盯ID错误,不可删除,请检查数据源".show(context)
                    return
                }
                isDeleteAll = false
                deviceViewModel.deleteDeviceById(context, arrayListOf(deviceId.toLong()))
            }

            override fun getSwipeDirection(
                recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder
            ): Int {
                return QMUIRVItemSwipeAction.SWIPE_LEFT
            }

            //滑动拉出菜单,点击删除
            override fun onClickAction(
                swipeAction: QMUIRVItemSwipeAction?,
                selected: RecyclerView.ViewHolder?,
                action: QMUISwipeAction?
            ) {
                super.onClickAction(swipeAction, selected, action)
                deleteItem(selected!!.bindingAdapterPosition)
            }
        })

    private fun deleteItem(adapterPosition: Int) {
        AlertControlDialog.Builder().setContext(this).setTitle("提示")
            .setMessage("删除后将无法恢复,是否继续?").setNegativeButton("容我想想")
            .setPositiveButton("已经想好").setOnDialogButtonClickListener(object :
                AlertControlDialog.OnDialogButtonClickListener {
                override fun onCancelClick() {

                }

                override fun onConfirmClick() {
                    clickedPosition = adapterPosition
                    //删除数据库里对应的数据
                    val deviceId = dataRows[clickedPosition].deviceId
                    if (deviceId.isNullOrBlank()) {
                        "管盯ID错误,不可删除,请检查数据源".show(context)
                        return
                    }
                    isDeleteAll = false
                    deviceViewModel.deleteDeviceById(context, arrayListOf(deviceId.toLong()))
                }
            }).build().show()
    }
}