package com.xw.yunwei.ui.work.site
|
|
import com.xw.common.utils.LogUtils
|
import android.view.Gravity
|
import android.view.KeyEvent
|
import android.view.View
|
import android.view.ViewGroup
|
import android.view.WindowManager
|
import android.view.animation.DecelerateInterpolator
|
import android.widget.LinearLayout
|
import androidx.core.view.isVisible
|
import androidx.databinding.DataBindingUtil
|
import androidx.lifecycle.lifecycleScope
|
import androidx.recyclerview.widget.LinearLayoutManager
|
import com.afollestad.materialdialogs.MaterialDialog
|
import com.afollestad.materialdialogs.customview.customView
|
import com.afollestad.materialdialogs.customview.getCustomView
|
import com.amap.api.maps.model.LatLng
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
import com.xw.common.CommonDialog
|
import com.xw.common.R
|
import com.xw.common.base.BaseActivity
|
import com.xw.common.base.OnItemClickListener
|
import com.xw.common.base.OneItemElementClickListener
|
import com.xw.common.utils.BindUtils
|
import com.xw.common.utils.BindUtils.getUrl
|
import com.xw.common.utils.GpsHelper.Companion.navigate
|
import com.xw.common.utils.ToastUtilCommon
|
import com.xw.common.viewAdapter.ImageDefault
|
import com.xw.common.viewAdapter.ViewAdapter
|
import com.xw.common.viewAdapter.ViewAdapter.Companion.showAnim
|
import com.xw.yunwei.BR
|
import com.xw.yunwei.databinding.ActivitySiteNavBinding
|
import com.xw.yunwei.databinding.DialogSiteFilterBinding
|
import com.xw.yunwei.model.SiteModel
|
import com.xw.yunwei.ui.work.AMapFragment
|
import kotlinx.coroutines.launch
|
import org.json.JSONArray
|
|
class SiteNavActivity : BaseActivity<ActivitySiteNavBinding, SiteNavVM>(),
|
OneItemElementClickListener<SiteModel> {
|
override fun getBindingVariable() = BR.viewModel
|
|
val adapter by lazy {
|
SiteAdapter(this@SiteNavActivity, this).apply {
|
setHasStableIds(true)
|
}
|
}
|
private var filterDialog: MaterialDialog? = null
|
val mapFrag: AMapFragment by lazy { AMapFragment() }
|
|
private val bottomSheetBehavior: BottomSheetBehavior<LinearLayout> by lazy {
|
BottomSheetBehavior.from(
|
binding.bottomSheet
|
)
|
}
|
|
override fun init() {
|
super.init()
|
showDialog("定位中...")
|
val transaction = supportFragmentManager.beginTransaction()
|
transaction.add(com.xw.yunwei.R.id.map_container, mapFrag)
|
transaction.commit()
|
initAdapter()
|
setBehavior()
|
// viewModel.query()
|
}
|
|
override fun setObservable() {
|
super.setObservable()
|
viewModel.dataList.observe(this) {
|
// if (it.isEmpty()) ToastUtilCommon.showWarn("未找到对应点位信息")
|
adapter.setList(it)
|
if (it.isEmpty() && !adapter.hasEmptyView()) {
|
adapter.setEmptyView(
|
BindUtils.getEmptyView(
|
this@SiteNavActivity,
|
"未找到对应点位信息"
|
)
|
)
|
}
|
mapFrag.clearMarks()
|
it.forEach {
|
val resId =
|
if (it.operationStatus !in arrayOf(3, 4)) com.xw.yunwei.R.mipmap.ic_map_site_g
|
else com.xw.yunwei.R.mipmap.ic_map_site_r
|
mapFrag.drawCustomMarker(
|
LatLng(it.pointLat ?: 0.0, it.pointLon ?: 0.0),
|
resId,
|
"${it.id}",
|
it.pointName
|
)
|
}
|
}
|
viewModel.siteItem.observe(this) { setPointInfo() }
|
viewModel.fences.observe(this) {
|
val areas = mutableListOf<List<LatLng>>()
|
it.forEach {
|
val area = mutableListOf<LatLng>()
|
it.points?.forEach {
|
area.add(LatLng(it.lat ?: 0.0, it.lng ?: 0.0))
|
}
|
if (area.isNotEmpty()) {
|
areas.add(area)
|
}
|
}
|
if(areas.isNotEmpty()){
|
mapFrag.drawPolygon(areas)
|
}
|
}
|
}
|
|
override fun setListener() {
|
super.setListener()
|
binding.filter.setOnClickListener { showFilterDialog() }
|
binding.back1.setOnClickListener { viewModel.siteItem.value = null }
|
binding.searchEt.setOnKeyListener { _, keyCode, event ->
|
if (keyCode == KeyEvent.KEYCODE_ENTER && event.action == KeyEvent.ACTION_UP) {
|
// if (viewModel.search.value.isNullOrEmpty()) {
|
// ToastUtilCommon.show("请输入搜索内容")
|
// } else {
|
viewModel.query()
|
// }
|
}
|
false
|
}
|
binding.nav.setOnClickListener {
|
viewModel.siteItem.value?.let {
|
if ((it.pointLat ?: 0.0) != 0.0 && (it.pointLon ?: 0.0) != 0.0) {
|
navigate(end = LatLng(it.pointLat!!, it.pointLon!!), context = this)
|
}
|
}
|
}
|
binding.arrow.setOnClickListener { toggleBottomSheetState() }
|
binding.location.setOnClickListener { mapFrag.moveToLocation() }
|
mapFrag.locationChangeCallback = { location ->
|
dismissDialog()
|
if (location == null) {
|
CommonDialog.showTipsDialog(
|
this@SiteNavActivity,
|
"您未开启gps权限,无法获取当前定位,请打开后重新操作",
|
null)
|
} else {
|
if (viewModel.fences.value.isNullOrEmpty()) {
|
viewModel.cityCode = location.adCode.substring(0, 4) + "00"
|
viewModel.getFenceByCode()
|
viewModel.query()
|
}
|
}
|
}
|
mapFrag.markerClickCallback = { id ->
|
adapter.data.find { "${it.id}" == id }?.let {
|
adapter.remove(it)
|
adapter.addData(0, it)
|
adapter.selectItem = it
|
}
|
}
|
}
|
|
private fun setBehavior() {
|
bottomSheetBehavior.apply {
|
// 默认显示半展开状态(显示列表)
|
state = BottomSheetBehavior.STATE_HALF_EXPANDED
|
|
isHideable = false
|
skipCollapsed = false // 允许进入折叠状态
|
halfExpandedRatio = 0.58f
|
|
// 展开时距离顶部距离(留出状态栏和搜索区域)
|
// expandedOffset = resources.getDimensionPixelSize(R.dimen.dp_50)
|
expandedOffset = 0 // 顶部有定位图标占位 暂不需要设置
|
|
addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
|
override fun onStateChanged(bottomSheet: View, newState: Int) {
|
if (binding.siteRv.isVisible) {
|
when (newState) {
|
BottomSheetBehavior.STATE_EXPANDED -> {
|
// 完全展开
|
binding.location.visibility = View.INVISIBLE
|
arrow(0f)
|
}
|
|
BottomSheetBehavior.STATE_HALF_EXPANDED -> {
|
// 半展开 - 显示列表
|
if (!binding.arrow.isVisible) {
|
showAnim(binding.arrow, true)
|
}
|
if (binding.title1.isVisible) {
|
showAnim(binding.title1, false)
|
}
|
binding.location.visibility = View.VISIBLE
|
arrow(0f)
|
}
|
|
BottomSheetBehavior.STATE_COLLAPSED -> {
|
// 折叠 - 只显示指示器
|
if (!binding.arrow.isVisible) {
|
showAnim(binding.arrow, true)
|
}
|
if (binding.title1.isVisible) {
|
showAnim(binding.title1, false)
|
}
|
binding.location.visibility = View.VISIBLE
|
arrow(180f)
|
}
|
|
else -> {}
|
}
|
}
|
}
|
|
override fun onSlide(bottomSheet: View, slideOffset: Float) {
|
// 0 ~ 0.5: 从折叠到半展开
|
// 0.5 ~ 1: 从半展开到完全展开
|
// if (binding.siteRv.isVisible) {
|
// LogUtils.e(TAG, "onSlide: slideOffset = $slideOffset")
|
// if (slideOffset < 0.5f) { // 有点偏差
|
// binding.arrow.rotation = 360f * (0.5f - slideOffset)
|
// }
|
// }
|
}
|
})
|
}
|
}
|
|
private fun toggleBottomSheetState() {
|
when (bottomSheetBehavior.state) {
|
BottomSheetBehavior.STATE_EXPANDED -> bottomSheetBehavior.state =
|
BottomSheetBehavior.STATE_HALF_EXPANDED
|
|
BottomSheetBehavior.STATE_HALF_EXPANDED -> bottomSheetBehavior.state =
|
BottomSheetBehavior.STATE_COLLAPSED
|
|
BottomSheetBehavior.STATE_COLLAPSED -> bottomSheetBehavior.state =
|
BottomSheetBehavior.STATE_HALF_EXPANDED
|
|
else -> bottomSheetBehavior.state = BottomSheetBehavior.STATE_HALF_EXPANDED
|
}
|
}
|
|
private fun arrow(value: Float) {
|
binding.arrow.animate()
|
.rotation(value)
|
.setDuration(300)
|
.setInterpolator(DecelerateInterpolator())
|
.start()
|
}
|
|
|
private fun initAdapter() {
|
binding.siteRv.adapter = adapter
|
binding.siteRv.layoutManager = LinearLayoutManager(this)
|
}
|
|
private fun showFilterDialog() {
|
if (filterDialog == null) {
|
filterDialog = MaterialDialog(this).apply {
|
customView(
|
com.xw.yunwei.R.layout.dialog_site_filter,
|
noVerticalPadding = true,
|
horizontalPadding = false
|
)
|
cancelable(true)
|
cornerRadius(12f)
|
|
val bind: DialogSiteFilterBinding? = DataBindingUtil.bind(getCustomView())
|
|
with(bind!!) {
|
bind.stllStatus.remove()
|
bind.stllStatus.setData(
|
viewModel.filterStatus,
|
this@SiteNavActivity,
|
arrayListOf("0"),
|
this@SiteNavActivity.resources.getColor(R.color.blue_5),
|
"shape_blue1_bg_4"
|
)
|
bind.stllStatus.setListener {
|
val index = it.tag as Int // 当前点击的下标
|
// if (bind.stllStatus.selectIndexList.contains(index)) {
|
// viewModel.selectStatus.remove(viewModel.filterStatus[index])
|
// } else {
|
// viewModel.selectStatus.add(viewModel.filterStatus[index])
|
// }
|
// bind.stllStatus.onTvClick(index)
|
|
for (index in bind.stllStatus.selectIndexList) { // 先取消选中状态
|
bind.stllStatus.onTvClick(index)
|
viewModel.selectStatus.remove(viewModel.filterStatus[index])
|
}
|
bind.stllStatus.onTvClick(index)
|
viewModel.selectStatus.add(viewModel.filterStatus[index])
|
}
|
|
bind.close.setOnClickListener { dismiss() }
|
bind.btnLeft.setOnClickListener {
|
val odlIndex = mutableListOf<Int>()
|
for (index in bind.stllStatus.selectIndexList) { // 先取消选中状态
|
odlIndex.add(index)
|
}
|
odlIndex.forEach { bind.stllStatus.onTvClick(it) }
|
viewModel.selectStatus.clear()
|
bind.stllStatus.onTvClick(0)
|
viewModel.selectStatus.add(viewModel.filterStatus[0])
|
// viewModel.query()
|
// dismiss()
|
}
|
bind.btnRight.setOnClickListener {
|
viewModel.query()
|
dismiss()
|
}
|
}
|
}
|
}
|
|
filterDialog?.show()
|
// 关键:让软键盘把 BottomSheet 顶上去
|
filterDialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
|
filterDialog?.window?.setLayout(
|
ViewGroup.LayoutParams.MATCH_PARENT,
|
ViewGroup.LayoutParams.WRAP_CONTENT
|
)
|
filterDialog?.window?.setGravity(Gravity.BOTTOM)
|
filterDialog?.window?.setWindowAnimations(R.style.AnimUp)
|
|
|
}
|
|
override fun onItemClick(item: SiteModel) {
|
viewModel.siteItem.value = item
|
}
|
|
override fun oneItemElementClick(item: SiteModel) {
|
item.let {
|
if ((it.pointLat ?: 0.0) != 0.0 && (it.pointLon ?: 0.0) != 0.0) {
|
navigate(end = LatLng(it.pointLat!!, it.pointLon!!), context = this)
|
}
|
}
|
}
|
|
private fun setPointInfo() {
|
viewModel.siteItem.value?.let { item ->
|
binding.name.text = item.pointName
|
binding.address.text = item.pointAddress
|
binding.remark.text = item.remarks
|
binding.remark.isVisible = !item.remarks.isNullOrEmpty()
|
var url = ""
|
try {
|
url = JSONArray(item.pointPictures).get(0).toString().getUrl()
|
} catch (e: Exception) {
|
}
|
ViewAdapter.loadImage(
|
binding.icon,
|
ImageDefault(url, com.xw.yunwei.R.mipmap.img_site_bg)
|
)
|
|
// 接口未返回
|
// binding.stllTag.remove()
|
// binding.stllTag.setData(listOf("上车点", "下车点"), this)
|
binding.stllTag1.remove()
|
val list = mutableListOf<String>()
|
item.parkingTimeLimit?.let { list.add("限停时长:${item.parkingTimeLimit}分钟") }
|
if (item.pointType in arrayOf(1, 2)) {
|
list.add(if (item.pointType == 1) "运营点位" else "测试点位")
|
}
|
if (list.isNotEmpty()) {
|
binding.stllTag1.setData(list, this)
|
}
|
if (item.pointLat != null && item.pointLat != 0.0 && item.pointLon != null && item.pointLon != 0.0) {
|
mapFrag.moveTo(item.pointLat, item.pointLon)
|
mapFrag.findMarkerById("${item.id ?: ""}")?.let {
|
mapFrag.clickMarker(it)
|
}
|
}
|
}
|
}
|
|
override fun onBackPressedHandel() {
|
if (viewModel.siteItem.value == null) {
|
super.onBackPressedHandel()
|
} else {
|
viewModel.siteItem.value = null
|
}
|
}
|
}
|