package com.xw.yunwei.ui.task
|
|
import android.graphics.Rect
|
import android.os.Bundle
|
import android.view.Gravity
|
import android.view.KeyEvent
|
import android.view.LayoutInflater
|
import android.view.ViewGroup
|
import android.view.WindowManager
|
import androidx.core.os.bundleOf
|
import androidx.core.view.isVisible
|
import androidx.databinding.DataBindingUtil
|
import androidx.fragment.app.Fragment
|
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.withResumed
|
import androidx.viewpager2.adapter.FragmentStateAdapter
|
import com.afollestad.materialdialogs.MaterialDialog
|
import com.afollestad.materialdialogs.customview.customView
|
import com.afollestad.materialdialogs.customview.getCustomView
|
import com.amap.api.location.AMapLocation
|
import com.google.android.material.tabs.TabLayoutMediator
|
import com.xw.common.CommonDialog
|
import com.xw.common.R
|
import com.xw.common.TimeDialog
|
import com.xw.common.TimeDialog.Companion.getTime
|
import com.xw.common.base.BaseFragment
|
import com.xw.common.utils.GpsHelper
|
import com.xw.common.utils.LogUtils
|
import com.xw.common.utils.ToastUtilCommon
|
import com.xw.common.utils.ToolUtil
|
import com.xw.yunwei.BR
|
import com.xw.yunwei.databinding.DialogDataFilterBinding
|
import com.xw.yunwei.databinding.FragmentTaskBinding
|
import com.xw.yunwei.databinding.ItemArrow2TextBinding
|
import com.xw.yunwei.model.FilterData
|
import com.xw.yunwei.model.LocationData
|
import com.xw.yunwei.model.SwitchTabMain
|
import com.xw.yunwei.model.SwitchTabTask
|
import com.xw.yunwei.ui.task.list.TaskListFragment
|
import com.xw.yunwei.ui.work.notice.NoticeActivity
|
import kotlinx.coroutines.launch
|
import org.greenrobot.eventbus.EventBus
|
import org.greenrobot.eventbus.Subscribe
|
import org.greenrobot.eventbus.ThreadMode
|
|
/**
|
*
|
* 任务中心
|
*/
|
class TaskFragment : BaseFragment<FragmentTaskBinding, TaskVM>(), GpsHelper.OnMapLocation {
|
override fun getBindingVariable(): Int = BR.viewModel
|
|
private val tabTitles = arrayOf("全部", "待到达", "待处理", "已处理")
|
private var filterDialog: MaterialDialog? = null
|
val dialogTime: TimeDialog by lazy { TimeDialog(requireActivity()) }
|
|
var gpsHelper: GpsHelper? = null
|
val filterData: FilterData
|
get() {
|
// 构建筛选数据
|
return FilterData(
|
distributeType = viewModel.getDistributeType(),
|
startTime = viewModel.startTime,
|
endTime = viewModel.endTime,
|
taskUrgencyLevel = viewModel.getUrgencyLevel(),
|
taskCategory = viewModel.getTaskCategory(),
|
sortType = viewModel.getSortType(),
|
sortRule = viewModel.taskSort,
|
plateNumber = viewModel.plateNumber.value
|
)
|
}
|
|
val locationData: LocationData
|
get() {
|
return LocationData(
|
lat = viewModel.location?.latitude,
|
lng = viewModel.location?.longitude
|
)
|
}
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
super.onCreate(savedInstanceState)
|
gpsHelper = GpsHelper(
|
requireActivity(),
|
this,
|
isOnceLocation = true,
|
isAutomatic = false,
|
savedInstanceState = savedInstanceState
|
)
|
lifecycle.addObserver(gpsHelper!!)
|
}
|
|
override fun init() {
|
super.init()
|
EventBus.getDefault().register(this)
|
binding.viewPager.adapter = PagerAdapter(this)
|
TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position ->
|
tab.text = tabTitles[position]
|
}.attach()
|
}
|
|
override fun setListener() {
|
super.setListener()
|
|
binding.llFilter.setOnClickListener {
|
showFilterDialog()
|
}
|
|
binding.searchEt.setOnKeyListener { _, keyCode, event ->
|
if (keyCode == KeyEvent.KEYCODE_ENTER && event.action == KeyEvent.ACTION_UP) {
|
if (viewModel.plateNumber.value.isNullOrEmpty()) {
|
ToastUtilCommon.show("请输入车牌号")
|
} else {
|
EventBus.getDefault().post(filterData)
|
// requireActivity().supportFragmentManager.setFragmentResult(
|
// REQUEST_KEY_FILTER,
|
// bundleOf(KEY_FILTER_DATA to filterData)
|
// )
|
}
|
ToolUtil.closeKeybord(binding.searchEt, requireActivity())
|
}
|
false
|
}
|
binding.root.viewTreeObserver.addOnGlobalLayoutListener {
|
val rect = Rect()
|
binding.root.getWindowVisibleDisplayFrame(rect)
|
val screenHeight = binding.root.rootView.height
|
val keypadHeight = screenHeight - rect.bottom
|
// 当键盘高度小于屏幕高度的 15% 时,认为键盘已关闭
|
if (keypadHeight < screenHeight * 0.15) {
|
binding.searchEt.clearFocus()
|
}
|
}
|
|
binding.notice.setOnClickListener { startActivity(NoticeActivity::class.java) }
|
}
|
|
override fun setObservable() {
|
super.setObservable()
|
TaskVM.needRefresh.observe(this) {
|
if (it) {
|
TaskVM.needRefresh.value = false
|
viewModel.getUnreadCount {
|
binding.count.isVisible = it.isNotEmpty() && (it.toInt() > 0)
|
}
|
}
|
}
|
}
|
|
private fun showFilterDialog() {
|
if (filterDialog == null) {
|
filterDialog = MaterialDialog(requireActivity()).apply {
|
customView(
|
com.xw.yunwei.R.layout.dialog_data_filter,
|
noVerticalPadding = true,
|
horizontalPadding = false
|
)
|
cancelable(true)
|
cornerRadius(12f)
|
|
val bind: DialogDataFilterBinding? = DataBindingUtil.bind(getCustomView())
|
|
with(bind!!) {
|
bind.stllTaskTime.remove()
|
bind.stllTaskLevel.remove()
|
bind.stllTaskType.remove()
|
|
bind.stllTaskTime.setData(
|
viewModel.filterTaskTime,
|
requireActivity(),
|
arrayListOf("2"),
|
requireActivity().resources.getColor(R.color.blue_5),
|
"shape_blue1_bg_4"
|
)
|
bind.stllTaskLevel.setData(
|
viewModel.filterTaskLevel,
|
requireActivity(),
|
arrayListOf("0"),
|
requireActivity().resources.getColor(R.color.blue_5),
|
"shape_blue1_bg_4"
|
)
|
bind.stllTaskType.setData(
|
viewModel.filterTaskType,
|
requireActivity(),
|
arrayListOf("0"),
|
requireActivity().resources.getColor(R.color.blue_5),
|
"shape_blue1_bg_4"
|
)
|
|
bind.stllTaskTime.setListener {
|
for (index in bind.stllTaskTime.selectIndexList) { // 先取消选中状态
|
bind.stllTaskTime.onTvClick(index)
|
}
|
val index = it.tag as Int // 当前点击的下标
|
bind.stllTaskTime.onTvClick(index)
|
viewModel.selectTaskTime = viewModel.filterTaskTime[index]
|
|
viewModel.startTime = ""
|
viewModel.endTime = ""
|
bind.tvStartTime.text = viewModel.startTime
|
bind.tvEndTime.text = viewModel.endTime
|
}
|
bind.stllTaskLevel.setListener {
|
for (index in bind.stllTaskLevel.selectIndexList) { // 先取消选中状态
|
bind.stllTaskLevel.onTvClick(index)
|
}
|
val index = it.tag as Int // 当前点击的下标
|
bind.stllTaskLevel.onTvClick(index)
|
viewModel.selectTaskLevel = viewModel.filterTaskLevel[index]
|
}
|
bind.stllTaskType.setListener {
|
for (index in bind.stllTaskType.selectIndexList) { // 先取消选中状态
|
bind.stllTaskType.onTvClick(index)
|
}
|
val index = it.tag as Int // 当前点击的下标
|
bind.stllTaskType.onTvClick(index)
|
viewModel.selectTaskType = viewModel.filterTaskType[index]
|
}
|
val onCheck: (String) -> Unit = { name ->
|
if (name == viewModel.selectTaskSort) {
|
viewModel.taskSort = if (viewModel.taskSort == 1) 2 else 1
|
} else {
|
viewModel.selectTaskSort = name
|
viewModel.taskSort = 1
|
}
|
viewModel.sortViews.forEach {
|
if (it.name.text == viewModel.selectTaskSort) {
|
it.layout.isSelected = true
|
it.name.isSelected = true
|
it.arrowUp.isSelected = viewModel.taskSort == 2
|
it.arrowDown.isSelected = viewModel.taskSort == 1
|
} else {
|
it.layout.isSelected = false
|
it.name.isSelected = false
|
it.arrowUp.isSelected = false
|
it.arrowDown.isSelected = false
|
}
|
}
|
}
|
val defaultSelectFirst: () -> Unit = {
|
viewModel.sortViews.forEachIndexed { index, itemBind ->
|
itemBind.layout.isSelected = index == 0
|
itemBind.name.isSelected = index == 0
|
itemBind.arrowUp.isSelected = index == 0 && viewModel.taskSort == 2
|
itemBind.arrowDown.isSelected = index == 0 && viewModel.taskSort == 1
|
}
|
}
|
|
bind.tagLayout.removeAllViews()
|
viewModel.sortViews.clear()
|
viewModel.filterTaskSort.forEachIndexed { index, name ->
|
val itemBind: ItemArrow2TextBinding = DataBindingUtil.inflate(
|
LayoutInflater.from(activity),
|
com.xw.yunwei.R.layout.item_arrow2_text,
|
null,
|
false
|
)
|
itemBind.name.text = name
|
viewModel.sortViews.add(itemBind)
|
itemBind.root.setOnClickListener { onCheck(name) }
|
bind.tagLayout.addView(itemBind.root)
|
}
|
defaultSelectFirst()
|
|
bind.tvStartTime.setOnClickListener {
|
val showTime = getTime(viewModel.startTime)
|
val minTime = getTime("2020-01-01")
|
dialogTime.show("选择日期", showTime, minTime) {
|
val odlIndex = mutableListOf<Int>()
|
for (index in bind.stllTaskTime.selectIndexList) { // 先取消选中状态
|
odlIndex.add(index)
|
}
|
odlIndex.forEach { bind.stllTaskTime.onTvClick(it) }
|
viewModel.selectTaskTime = ""
|
|
val selectTime = getTime(it)
|
if (viewModel.endTime.isNotEmpty()) {
|
if (selectTime.replace("-", "") >
|
viewModel.endTime.replace("-", "")
|
) {
|
ToastUtilCommon.showWarn("开始时间不能大于结束时间")
|
return@show
|
}
|
}
|
viewModel.startTime = selectTime
|
bind.tvStartTime.text = viewModel.startTime
|
}
|
}
|
bind.tvEndTime.setOnClickListener {
|
val showTime = getTime(viewModel.endTime)
|
val minTime = getTime("2020-01-01")
|
dialogTime.show("选择日期", showTime, minTime) {
|
val odlIndex = mutableListOf<Int>()
|
for (index in bind.stllTaskTime.selectIndexList) { // 先取消选中状态
|
odlIndex.add(index)
|
}
|
odlIndex.forEach { bind.stllTaskTime.onTvClick(it) }
|
viewModel.selectTaskTime = ""
|
|
val selectTime = getTime(it)
|
if (viewModel.startTime.isNotEmpty()) {
|
if (selectTime.replace("-", "") <
|
viewModel.startTime.replace("-", "")
|
) {
|
ToastUtilCommon.showWarn("开始时间不能大于结束时间")
|
return@show
|
}
|
}
|
viewModel.endTime = getTime(it)
|
bind.tvEndTime.text = viewModel.endTime
|
}
|
}
|
|
bind.cancel.setOnClickListener { dismiss() }
|
bind.btnLeft.setOnClickListener {
|
val odlIndex = mutableListOf<Int>()
|
for (index in bind.stllTaskTime.selectIndexList) { // 先取消选中状态
|
odlIndex.add(index)
|
}
|
odlIndex.forEach { bind.stllTaskTime.onTvClick(it) }
|
viewModel.selectTaskTime = viewModel.filterTaskTime[2]
|
bind.stllTaskTime.onTvClick(2)
|
|
odlIndex.clear()
|
for (index in bind.stllTaskLevel.selectIndexList) { // 先取消选中状态
|
odlIndex.add(index)
|
}
|
odlIndex.forEach { bind.stllTaskLevel.onTvClick(it) }
|
viewModel.selectTaskLevel = viewModel.filterTaskLevel[0]
|
bind.stllTaskLevel.onTvClick(0)
|
|
odlIndex.clear()
|
for (index in bind.stllTaskType.selectIndexList) { // 先取消选中状态
|
odlIndex.add(index)
|
}
|
odlIndex.forEach { bind.stllTaskType.onTvClick(it) }
|
viewModel.selectTaskType = viewModel.filterTaskType[0]
|
bind.stllTaskType.onTvClick(0)
|
|
viewModel.startTime = ""
|
bind.tvStartTime.text = viewModel.startTime
|
viewModel.endTime = ""
|
bind.tvEndTime.text = viewModel.endTime
|
|
viewModel.selectTaskSort = viewModel.filterTaskSort[0]
|
defaultSelectFirst()
|
}
|
bind.btnRight.setOnClickListener {
|
if (viewModel.selectTaskTime.isEmpty() && (viewModel.startTime.isEmpty() || viewModel.endTime.isEmpty())) {
|
ToastUtilCommon.showWarn("请正确选择时间")
|
return@setOnClickListener
|
}
|
EventBus.getDefault().post(filterData)
|
// requireActivity().supportFragmentManager.setFragmentResult(
|
// REQUEST_KEY_FILTER,
|
// bundleOf(KEY_FILTER_DATA to filterData)
|
// )
|
filterDialog?.dismiss()
|
}
|
bind.sure.setOnClickListener {
|
EventBus.getDefault().post(filterData)
|
// requireActivity().supportFragmentManager.setFragmentResult(
|
// REQUEST_KEY_FILTER,
|
// bundleOf(KEY_FILTER_DATA to filterData)
|
// )
|
filterDialog?.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 location(pLocation: AMapLocation?) {
|
if (pLocation == null) {
|
CommonDialog.showTipsDialog(
|
requireActivity(),
|
"您未开启gps权限,无法获取当前定位,请打开后重新操作",
|
null)
|
} else {
|
viewModel.location = pLocation
|
EventBus.getDefault().post(locationData)
|
// requireActivity().supportFragmentManager.setFragmentResult(
|
// REQUEST_KEY_LOCATION,
|
// bundleOf(KEY_LOCATION_DATA to locationData)
|
// )
|
}
|
}
|
|
override fun onDestroy() {
|
super.onDestroy()
|
EventBus.getDefault().unregister(this)
|
}
|
|
@Suppress("unused")
|
@Subscribe(threadMode = ThreadMode.MAIN)
|
fun onMessageEvent(event: SwitchTabTask) {
|
lifecycleScope.launch {
|
lifecycle.withResumed {
|
binding.tabLayout.getTabAt(event.index)?.select()
|
}
|
}
|
}
|
|
inner class PagerAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {
|
override fun getItemCount(): Int = tabTitles.size
|
|
override fun createFragment(position: Int): TaskListFragment {
|
return when (position) {
|
0 -> viewModel.allTaskFragment
|
1 -> viewModel.togoTaskFragment
|
2 -> viewModel.todoTaskFragment
|
3 -> viewModel.finishTaskFragment
|
else -> error("Wrong position $position")
|
}
|
}
|
}
|
|
companion object {
|
const val REQUEST_KEY_FILTER = "filter_request"
|
const val KEY_FILTER_DATA = "filter_data"
|
const val REQUEST_KEY_LOCATION = "location_request"
|
const val KEY_LOCATION_DATA = "location_data"
|
}
|
}
|