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

import android.os.Bundle
import androidx.lifecycle.ViewModelProvider
import com.amap.api.maps.AMap
import com.amap.api.maps.AMapOptions
import com.amap.api.maps.CameraUpdateFactory
import com.amap.api.maps.model.BitmapDescriptorFactory
import com.amap.api.maps.model.CameraPosition
import com.amap.api.maps.model.LatLng
import com.amap.api.maps.model.MarkerOptions
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.ActivityMapDeviceBriefBinding
import com.casic.smarttube.extensions.initImmersionBar
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.base.KotlinBaseActivity
import com.pengxh.kt.lite.utils.LiteKitConstant
import com.pengxh.kt.lite.utils.LoadState
import com.pengxh.kt.lite.widget.TitleBarView

class MapDeviceBriefActivity : KotlinBaseActivity<ActivityMapDeviceBriefBinding>() {

    private val kTag = "MapDeviceBriefActivity"
    private lateinit var deviceViewModel: DeviceViewModel
    private lateinit var aMap: AMap
    private lateinit var params: ArrayList<String>
    private val geocoderSearch by lazy { GeocodeSearch(this) }


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

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

            override fun onRightClick() {

            }
        })
    }

    override fun initOnCreate(savedInstanceState: Bundle?) {
        aMap = binding.mapView.map
        aMap.mapType = AMap.MAP_TYPE_NORMAL
        val uiSettings = aMap.uiSettings
        uiSettings.isCompassEnabled = true
        uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
        uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度
        uiSettings.isRotateGesturesEnabled = false//不允许地图旋转

        this.params = intent.getStringArrayListExtra(LiteKitConstant.INTENT_PARAM_KEY)!!

        deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java]
    }

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

    override fun initEvent() {
        deviceViewModel.obtainDeviceDetail(params[0], params[1])
        deviceViewModel.deviceDetailModel.observe(this) {
            if (it.code == 200) {
                val device = it.data

                binding.deviceCodeView.text = String.format("设备编号: ${device.devcode}")
                binding.deviceModelView.text = String.format("设备模型: ${params[2]}")

                //获取设备最新浓度信息
                deviceViewModel.obtainTubeLastData(device.groupId, device.devcode)
                deviceViewModel.lastDataModel.observe(this) { v ->
                    if (v.code == 200) {
                        binding.deviceValueView.text = String.format("最新浓度: ${v.data.strength}")
                        binding.updateTimeView.text = String.format("更新时间: ${v.data.uptime}")
                    } else {
                        binding.deviceValueView.text = String.format("最新浓度: 未知")
                        binding.updateTimeView.text = String.format("更新时间: 未知")
                    }
                }
                if (device.latGaode.isBlank() || device.lngGaode.isBlank()) {
                    binding.locationView.text = "经纬度异常,无法查看具体位置"
                } else {
                    val queryParam = RegeocodeQuery(
                        LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()),
                        200f,
                        GeocodeSearch.AMAP
                    )
                    val latLng = LatLng(device.latGaode.toDouble(), device.lngGaode.toDouble())
                    geocoderSearch.getFromLocationAsyn(queryParam)
                    geocoderSearch.setOnGeocodeSearchListener(object :
                        GeocodeSearch.OnGeocodeSearchListener {
                        override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) {
                            if (rCode == 1000) {
                                binding.locationView.text =
                                    String.format("详细位置: ${result?.regeocodeAddress?.formatAddress}")
                            }
                        }

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

                        }
                    })

                    val cameraPosition = CameraPosition(latLng, 18f, 0f, 0f)
                    val newCameraPosition = CameraUpdateFactory.newCameraPosition(cameraPosition)
                    aMap.animateCamera(newCameraPosition, 1500, object : AMap.CancelableCallback {
                        override fun onFinish() {
                            //添加Marker
                            val markerOptions = MarkerOptions().position(latLng)
                                .icon(BitmapDescriptorFactory.fromResource(R.mipmap.well_location))
                                .draggable(false)
                            aMap.addMarker(markerOptions)
                        }

                        override fun onCancel() {

                        }
                    })
                    aMap.setOnMarkerClickListener {
                        RouteOnMap.startNavigation(
                            this@MapDeviceBriefActivity, "", latLng
                        )
                        true
                    }
                }
            }
        }
    }

    /**地图相关*********/
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding.mapView.onCreate(savedInstanceState)
    }

    override fun onResume() {
        super.onResume()
        binding.mapView.onResume()
    }

    override fun onPause() {
        super.onPause()
        binding.mapView.onPause()
    }

    override fun onDestroy() {
        binding.mapView.onDestroy()
        super.onDestroy()
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        binding.mapView.onSaveInstanceState(outState)
    }
}