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) } }