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

import android.graphics.Color
import android.os.Bundle
import android.view.View
import androidx.lifecycle.ViewModelProvider
import com.amap.api.maps.model.LatLng
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.ActivityDeviceDetailBinding
import com.casic.smarttube.extensions.combineImagePath
import com.casic.smarttube.extensions.initImmersionBar
import com.casic.smarttube.extensions.toSignalImage
import com.casic.smarttube.model.DeviceDetailModel
import com.casic.smarttube.utils.RouteOnMap
import com.casic.smarttube.vm.DeviceViewModel
import com.pengxh.kt.lite.adapter.GridViewImageAdapter
import com.pengxh.kt.lite.base.KotlinBaseActivity
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.TitleBarView

class DeviceDetailActivity : KotlinBaseActivity<ActivityDeviceDetailBinding>() {

    private val kTag = "DeviceDetailActivity"
    private val context = this
    private lateinit var deviceViewModel: DeviceViewModel
    private lateinit var deviceModel: DeviceDetailModel.DataModel
    private val geocoderSearch by lazy { GeocodeSearch(this) }

    override fun initViewBinding(): ActivityDeviceDetailBinding {
        return ActivityDeviceDetailBinding.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() {
                val lat = deviceModel.latGaode.toString()
                val lng = deviceModel.lngGaode.toString()
                if (lat.isBlank() || lng.isBlank()) {
                    "经纬度异常,无法开启导航".show(context)
                    return
                }
                RouteOnMap.startNavigation(context, "", LatLng(lat.toDouble(), lng.toDouble()))
            }
        })
    }

    override fun initOnCreate(savedInstanceState: Bundle?) {
        ActivityStackManager.addActivity(this)
        val params = intent.getStringArrayListExtra(LiteKitConstant.INTENT_PARAM_KEY)!!
        deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java]
        deviceViewModel.deviceDetailData.observe(this) {
            if (it.code == 200) {
                val device = it.data
                this.deviceModel = device
                binding.deviceCodeView.text = device.devcode
                binding.deviceNameView.text = device.deviceName
                binding.projectGroupView.text = String.format("项目${device.groupId}")
                if (device.latGaode.isBlank() || device.lngGaode.isBlank()) {
                    binding.locationView.text = "经纬度异常,无法查看具体位置"
                } else {
                    val queryParam = RegeocodeQuery(
                        LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()),
                        200f,
                        GeocodeSearch.AMAP
                    )
                    geocoderSearch.getFromLocationAsyn(queryParam)
                    geocoderSearch.setOnGeocodeSearchListener(object :
                        GeocodeSearch.OnGeocodeSearchListener {
                        override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) {
                            if (rCode == 1000) {
                                binding.locationView.text = result?.regeocodeAddress?.formatAddress
                            }
                        }

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

                        }
                    })
                }
                binding.descriptionView.text = device.descn

                if (device.photos.toString().isBlank()) {
                    binding.imageGridView.visibility = View.GONE
                } else {
                    binding.imageGridView.visibility = View.VISIBLE
                    //处理图片地址
                    val urls: ArrayList<String> = ArrayList()
                    val imageArray = device.photos.toString().split(",")
                    imageArray.forEach { path ->
                        if (path.isNotBlank()) {
                            urls.add(path.combineImagePath())
                        }
                    }
                    val imageAdapter = GridViewImageAdapter(this, urls)
                    binding.imageGridView.adapter = imageAdapter
                    binding.imageGridView.setOnItemClickListener { _, _, position, _ ->
                        if (urls[position].isEmpty()) {
                            "图片加载失败,无法查看大图".show(this)
                        } else {
                            navigatePageTo<BigImageActivity>(position, urls)
                        }
                    }
                }

                val value = device.stregnth.toDouble().toInt()
                val level = "$value%"
                val ppm = "${value * 500}ppm"
                binding.densityView.text = "$level(相当于$ppm)"

                binding.lastDataView.text = device.uptime
                if (device.onlineState == "0") {
                    binding.deviceStateView.text = "离线"
                    binding.deviceStateView.setTextColor(Color.RED)
                } else {
                    binding.deviceStateView.text = "在线"
                    binding.deviceStateView.setTextColor(Color.GREEN)
                }
                binding.signalImageView.setBackgroundResource(device.rsrp.toSignalImage())
                binding.deviceBatteryView.text = if (device.cell.isNullOrBlank()) {
                    "0%"
                } else {
                    device.cell + "%"
                }
            }
        }
        deviceViewModel.getDeviceDetail(this, params[0], params[1])
    }

    override fun observeRequestState() {
        deviceViewModel.loadState.observe(this) {
            when (it) {
                LoadState.Loading -> LoadingDialog.show(this, "数据加载中...")
                else -> LoadingDialog.dismiss()
            }
        }
    }

    override fun initEvent() {

    }
}