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

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.model.ProjectGroupModel.DataModel
import com.casic.smarttube.view.GroupDeviceActivity
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.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.LoadState
import com.pengxh.kt.lite.utils.LoadingDialog
import com.pengxh.kt.lite.widget.EmptyView
import com.pengxh.kt.lite.widget.dialog.AlertInputDialog

class OverviewFragment : KotlinBaseFragment<FragmentOverviewBinding>() {

    private val kTag = "OverviewFragment"
    private val geocoderSearch by lazy { GeocodeSearch(requireContext()) }
    private val marginOffsets by lazy { 6.dp2px(requireContext()) }
    private lateinit var groupViewModel: ProjectGroupViewModel
    private lateinit var groupListAdapter: NormalRecyclerAdapter<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() {

    }

    override fun initOnCreate(savedInstanceState: Bundle?) {
        binding.recyclerView.addItemDecoration(
            RecyclerViewItemOffsets(
                marginOffsets, marginOffsets shr 1, marginOffsets, marginOffsets shr 1
            )
        )

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

        groupViewModel.changeGroupResultData.observe(this) {
            if (it.code == 200) {
                groupListAdapter.notifyItemChanged(clickedPosition)
            }
        }
    }

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

    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<DataModel>(
                        R.layout.item_group_over_view_rv_l, it.data
                    ) {
                        override fun convertView(
                            viewHolder: ViewHolder, position: Int, item: 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.groupNameView) {
                                    clickedPosition = position
                                    editGroupName(item)
                                }
                            if (item.latGaode.isBlank() || item.lngGaode.isBlank()) {
                                viewHolder.setText(
                                    R.id.groupLocationView, "经纬度异常,无法查看具体位置"
                                )
                            } else {
                                searchLocation(item, viewHolder)
                            }
                        }
                    }
                    binding.recyclerView.adapter = groupListAdapter
                    groupListAdapter.setOnItemClickedListener(object :
                        NormalRecyclerAdapter.OnItemClickedListener<DataModel> {
                        override fun onItemClicked(position: Int, item: DataModel) {
                            requireContext().navigatePageTo<GroupDeviceActivity>(item.groupId)
                        }
                    })
                }
            }
        }
    }

    private fun searchLocation(item: DataModel, viewHolder: ViewHolder) {
        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) {

            }
        })
    }

    private fun editGroupName(item: 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(requireContext(), 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(requireContext())
        }

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