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.*
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.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.extensions.convertColor
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_map_device_brief.*
import kotlinx.android.synthetic.main.include_base_title.*

class MapDeviceBriefActivity : KotlinBaseActivity() {

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


    override fun initLayoutView(): Int = R.layout.activity_map_device_brief

    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() {
        aMap = 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//不允许地图旋转

        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

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

                //获取设备最新浓度信息
                deviceViewModel.obtainTubeLastData(device.groupId, device.devcode)
                deviceViewModel.lastDataModel.observe(this, { v ->
                    if (v.code == 200) {
                        deviceValueView.text = String.format("最新浓度: ${v.data.strength}")
                        updateTimeView.text = String.format("更新时间: ${v.data.uptime}")
                    } else {
                        deviceValueView.text = String.format("最新浓度: 未知")
                        updateTimeView.text = String.format("更新时间: 未知")
                    }
                })
                if (device.latGaode.isBlank() || device.lngGaode.isBlank()) {
                    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) {
                                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
                    }
                }
            }
        })

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

    override fun initEvent() {

    }

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

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

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

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

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