Newer
Older
CasicSmartTube / app / src / main / java / com / casic / smarttube / fragment / OverviewFragment.kt
package com.casic.smarttube.fragment

import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.ViewModelProvider
import com.amap.api.services.core.LatLonPoint
import com.amap.api.services.geocoder.GeocodeResult
import com.amap.api.services.geocoder.GeocodeSearch
import com.amap.api.services.geocoder.RegeocodeQuery
import com.amap.api.services.geocoder.RegeocodeResult
import com.casic.smarttube.R
import com.casic.smarttube.databinding.FragmentOverviewBinding
import com.casic.smarttube.model.ProjectGroupModel
import com.casic.smarttube.view.GroupDeviceActivity
import com.casic.smarttube.view.GroupDeviceMapActivity
import com.casic.smarttube.vm.ProjectGroupViewModel
import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
import com.pengxh.kt.lite.adapter.ViewHolder
import com.pengxh.kt.lite.base.KotlinBaseFragment
import com.pengxh.kt.lite.divider.RecyclerViewItemDivider
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.extensions.show
import com.pengxh.kt.lite.utils.LoadState
import com.pengxh.kt.lite.utils.LoadingDialog
import com.pengxh.kt.lite.widget.EmptyView
import com.pengxh.kt.lite.widget.TitleBarView
import com.pengxh.kt.lite.widget.dialog.AlertInputDialog

class OverviewFragment : KotlinBaseFragment<FragmentOverviewBinding>() {

    private val kTag = "OverviewFragment"
    private val geocoderSearch by lazy { GeocodeSearch(requireContext()) }
    private lateinit var groupViewModel: ProjectGroupViewModel
    private lateinit var groupListAdapter: NormalRecyclerAdapter<ProjectGroupModel.DataModel>
    private var clickedPosition = 0
    private var isRefresh = false

    override fun initViewBinding(
        inflater: LayoutInflater, container: ViewGroup?
    ): FragmentOverviewBinding {
        return FragmentOverviewBinding.inflate(inflater, container, false)
    }

    override fun setupTopBarLayout() {
        binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener {
            override fun onLeftClick() {

            }

            override fun onRightClick() {
                requireContext().navigatePageTo<GroupDeviceMapActivity>()
            }
        })
    }

    override fun initOnCreate(savedInstanceState: Bundle?) {
        groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java]
        groupViewModel.groupModel.observe(this) {
            if (it.code == 200) {
                bindRecyclerView(it)
            }
        }
        groupViewModel.changeGroupResult.observe(this) {
            if (it.code == 200) {
                groupListAdapter.notifyItemChanged(clickedPosition)
            }
        }
    }

    override fun onResume() {
        super.onResume()
        groupViewModel.getProGroupList()
    }

    private fun bindRecyclerView(it: ProjectGroupModel) {
        val dataRows = it.data
        when {
            isRefresh -> {
                binding.refreshView.finishRefresh()
                isRefresh = false
                groupListAdapter.refresh(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

                    groupListAdapter = object : NormalRecyclerAdapter<ProjectGroupModel.DataModel>(
                        R.layout.item_group_over_view_rv_l, it.data
                    ) {
                        override fun convertView(
                            viewHolder: ViewHolder, position: Int, item: ProjectGroupModel.DataModel
                        ) {
                            viewHolder.setText(R.id.groupNameView, item.groupId)
                                .setText(R.id.totalDeviceNumView, item.totalDevice)
                                .setText(R.id.inUseDeviceNumView, item.alive)
                                .setText(R.id.notUseDeviceNumView, item.unalive)
                                .setOnClickListener(R.id.editGroupNameView) {
                                    clickedPosition = position
                                    editGroupName(item)
                                }
                            if (item.latGaode.isBlank() || item.lngGaode.isBlank()) {
                                viewHolder.setText(
                                    R.id.groupLocationView,
                                    "经纬度异常,无法查看具体位置"
                                )
                            } else {
                                val point =
                                    LatLonPoint(item.latGaode.toDouble(), item.lngGaode.toDouble())
                                val queryParam = RegeocodeQuery(point, 200f, GeocodeSearch.AMAP)
                                geocoderSearch.getFromLocationAsyn(queryParam)
                                geocoderSearch.setOnGeocodeSearchListener(object :
                                    GeocodeSearch.OnGeocodeSearchListener {
                                    override fun onRegeocodeSearched(
                                        result: RegeocodeResult?,
                                        rCode: Int
                                    ) {
                                        if (rCode == 1000) {
                                            viewHolder.setText(
                                                R.id.groupLocationView,
                                                String.format("${result?.regeocodeAddress?.formatAddress}")
                                            )
                                        }
                                    }

                                    override fun onGeocodeSearched(
                                        result: GeocodeResult?,
                                        rCode: Int
                                    ) {

                                    }
                                })
                            }
                        }
                    }
                    binding.recyclerView.addItemDecoration(
                        RecyclerViewItemDivider(0f, 0f, Color.LTGRAY)
                    )
                    binding.recyclerView.adapter = groupListAdapter
                    groupListAdapter.setOnItemClickedListener(object :
                        NormalRecyclerAdapter.OnItemClickedListener<ProjectGroupModel.DataModel> {
                        override fun onItemClicked(
                            position: Int,
                            item: ProjectGroupModel.DataModel
                        ) {
                            requireContext().navigatePageTo<GroupDeviceActivity>(item.groupId)
                        }
                    })
                }
            }
        }
    }

    private fun editGroupName(item: ProjectGroupModel.DataModel) {
        AlertInputDialog.Builder()
            .setContext(requireContext())
            .setTitle("提示")
            .setHintMessage("请输入新的项目名")
            .setNegativeButton("取消")
            .setPositiveButton("确定")
            .setOnDialogButtonClickListener(object :
                AlertInputDialog.OnDialogButtonClickListener {
                override fun onCancelClick() {

                }

                override fun onConfirmClick(value: String) {
                    item.groupId = value
                    groupViewModel.changeGroupId(item.groupId, value)
                }
            }).build().show()
    }

    override fun observeRequestState() {
        groupViewModel.loadState.observe(this) {
            if (isRefresh) {
                return@observe
            }
            when (it) {
                LoadState.Loading -> LoadingDialog.show(requireActivity(), "数据加载中,请稍后...")

                LoadState.Success -> {
                    LoadingDialog.dismiss()
                }

                LoadState.Fail -> {
                    LoadingDialog.dismiss()
                    "数据加载失败,请重试".show(requireContext())
                }
            }
        }
    }

    override fun initEvent() {
        binding.refreshView.setOnRefreshListener {
            isRefresh = true
            groupViewModel.getProGroupList()
        }

        binding.emptyView.setOnClickListener(object : EmptyView.OnClickListener {
            override fun onReloadButtonClicked() {
                groupViewModel.getProGroupList()
            }
        })
    }
}