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.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.deviceCodeView import kotlinx.android.synthetic.main.activity_map_device_brief.deviceModelView import kotlinx.android.synthetic.main.activity_map_device_brief.deviceValueView import kotlinx.android.synthetic.main.activity_map_device_brief.locationView import kotlinx.android.synthetic.main.activity_map_device_brief.mapView import kotlinx.android.synthetic.main.activity_map_device_brief.updateTimeView import kotlinx.android.synthetic.main.include_base_title.leftBackView import kotlinx.android.synthetic.main.include_base_title.titleView class MapDeviceBriefActivity : KotlinBaseActivity() { 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 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//不允许地图旋转 this.params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! 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 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 } } } } } /**地图相关*********/ 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) } }