package com.casic.smarttube.view
import android.graphics.Color
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.extensions.combineImagePath
import com.casic.smarttube.extensions.toSignalImage
import com.casic.smarttube.model.DeviceDetailModel
import com.casic.smarttube.utils.LoadingDialogHub
import com.casic.smarttube.utils.RouteOnMap
import com.casic.smarttube.vm.DeviceViewModel
import com.gyf.immersionbar.ImmersionBar
import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter
import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.extensions.show
import com.pengxh.kt.lite.utils.Constant
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import com.pengxh.kt.lite.vm.LoadState
import kotlinx.android.synthetic.main.activity_device_detail.densityView
import kotlinx.android.synthetic.main.activity_device_detail.descriptionView
import kotlinx.android.synthetic.main.activity_device_detail.deviceBatteryView
import kotlinx.android.synthetic.main.activity_device_detail.deviceCodeView
import kotlinx.android.synthetic.main.activity_device_detail.deviceNameView
import kotlinx.android.synthetic.main.activity_device_detail.deviceStateView
import kotlinx.android.synthetic.main.activity_device_detail.imageGridView
import kotlinx.android.synthetic.main.activity_device_detail.lastDataView
import kotlinx.android.synthetic.main.activity_device_detail.leftBackView
import kotlinx.android.synthetic.main.activity_device_detail.locationView
import kotlinx.android.synthetic.main.activity_device_detail.projectGroupView
import kotlinx.android.synthetic.main.activity_device_detail.rightOptionView
import kotlinx.android.synthetic.main.activity_device_detail.signalImageView
import kotlinx.android.synthetic.main.activity_device_detail.titleView
class DeviceDetailActivity : KotlinBaseActivity() {
private val kTag = "DeviceDetailActivity"
private lateinit var deviceViewModel: DeviceViewModel
private lateinit var deviceModel: DeviceDetailModel.DataModel
private val geocoderSearch by lazy { GeocodeSearch(this) }
override fun initLayoutView(): Int = R.layout.activity_device_detail
override fun setupTopBarLayout() {
ImmersionBar.with(this).statusBarDarkFont(false).init()
ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this))
titleView.text = "设备详情"
leftBackView.setOnClickListener { finish() }
}
override fun initData() {
val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!!
deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java)
deviceViewModel.obtainDeviceDetail(params[0], params[1])
deviceViewModel.deviceDetailModel.observe(this) {
if (it.code == 200) {
val device = it.data
this.deviceModel = device
deviceCodeView.text = device.devcode
deviceNameView.text = device.deviceName
projectGroupView.text = String.format("项目${device.groupId}")
if (device.latGaode.isBlank() || device.lngGaode.isBlank()) {
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) {
locationView.text = result?.regeocodeAddress?.formatAddress
}
}
override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) {
}
})
}
descriptionView.text = device.descn
if (device.photos.toString().isBlank()) {
imageGridView.visibility = View.GONE
} else {
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 = ReadOnlyImageAdapter(this)
imageAdapter.setImageList(urls)
imageGridView.adapter = imageAdapter
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"
densityView.text = "$level(相当于$ppm)"
lastDataView.text = device.uptime
if (device.onlineState == "0") {
deviceStateView.text = "离线"
deviceStateView.setTextColor(Color.RED)
} else {
deviceStateView.text = "在线"
deviceStateView.setTextColor(Color.GREEN)
}
signalImageView.setBackgroundResource(device.rsrp.toSignalImage())
deviceBatteryView.text = if (device.cell.isNullOrBlank()) {
"0%"
} else {
device.cell + "%"
}
}
}
}
override fun observeRequestState() {
deviceViewModel.loadState.observe(this) {
when (it) {
LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...")
else -> LoadingDialogHub.dismiss()
}
}
}
override fun initEvent() {
rightOptionView.setOnClickListener {
val lat = deviceModel.latGaode.toString()
val lng = deviceModel.lngGaode.toString()
if (lat.isBlank() || lng.isBlank()) {
"经纬度异常,无法开启导航".show(this)
return@setOnClickListener
}
RouteOnMap.startNavigation(this, "", LatLng(lat.toDouble(), lng.toDouble()))
}
}
}