diff --git a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt index cc9cc0739c..e2dbba7242 100644 --- a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt +++ b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt @@ -1,21 +1,185 @@ package com.mogo.och.bus.passenger.presenter import androidx.lifecycle.LifecycleOwner +import com.elegant.utils.UiThreadHandler +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager +import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.util.GsonUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.bus.passenger.bean.LoopInfo +import com.mogo.och.bus.passenger.bean.response.LineInfoListResponse +import com.mogo.och.bus.passenger.bean.response.LineInfoResponse +import com.mogo.och.bus.passenger.bean.response.SiteInfoResponse import com.mogo.och.bus.passenger.model.CharterPassengerModel import com.mogo.och.bus.passenger.model.IOrderStatusChangeListener import com.mogo.och.bus.passenger.model.OrderStatusEnum +import com.mogo.och.bus.passenger.net.BusPassengerModelLoopManager +import com.mogo.och.bus.passenger.net.BusPassengerServiceManager import com.mogo.och.bus.passenger.ui.M1OrderFragment +import com.mogo.och.common.module.bean.dpmsg.ChangeDestMsg +import com.mogo.och.common.module.bean.dpmsg.DPMsgType +import com.mogo.och.common.module.biz.constant.OchCommonConst +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback +import com.mogo.och.common.module.manager.OCHPlanningStopSideStatusManager +import com.mogo.och.common.module.utils.RxUtils +import io.reactivex.disposables.Disposable class BusPassengerFunctionOrderPresenter(view: M1OrderFragment?) : BusBasePassengerFunctionDevicePresenter(view), IOrderStatusChangeListener { companion object{ + + const val TAGLINELOOP = "LineSiteViewLineLoop" const val TAG = "BusPassengerFunctionOrderPresenter" } + // 成功提交给后台得线路 + private var checkLine: LineInfoResponse.LineInfo? = null + + // 成功提交给后台得终点站点 + private var checkSite: SiteInfoResponse.SiteInfo? = null + + // 下一个站点 + private var currentSite: SiteInfoResponse.SiteInfo? = null + + // 向司机端端提交的临时线路 + private var tempCheckLine: LineInfoResponse.LineInfo? = null + + // 向司机端临时提交的终点站点 + private var tempCheckSite: SiteInfoResponse.SiteInfo? = null + + private var tempCheckLineIsSubmit = false + private var isChangeIngLineAndSite = false + + + + private var subscribeSelectLine: Disposable? = null + private var subscribeSelectSite: Disposable? = null + override fun onCreate(owner: LifecycleOwner) { super.onCreate(owner) CharterPassengerModel.setStatusChangeListener(TAG,this) + CallerTelematicListenerManager.addListener(TAG, msgReceived) + + val hasSetLineAndSite = CharterPassengerModel.hasSetLineAndSite() + if (hasSetLineAndSite != null) {// 已经设置了线路和站点 + checkLine = hasSetLineAndSite.first + checkSite = hasSetLineAndSite.second + resetData() + } else { + queryLineList() + mView?.setEnableLineStatus(true) + mView?.setEnableSiteStatus(false) + mView?.onlyChangeSite(false) + mView?.setSiteAdapterEnable(false) + mView?.setSwitchEnable(false) + isChangeIngLineAndSite = false + } + } + + fun lineReset(){ + resetData() + tempCheckLine = null + } + fun siteReset(){ + resetData() + tempCheckLine = null + tempCheckSite = null + } + + /** + * 重置数据 + */ + fun resetData() { + if(checkLine==null){// 没有提交线路 + queryLineList() + mView?.setEnableLineStatus(true) + mView?.setEnableSiteStatus(false) + mView?.onlyChangeSite(false) + mView?.setSiteAdapterEnable(false) + }else{ + checkLine?.let { + mView?.setEnableLineStatus(false) + mView?.setEnableSiteStatus(false) + mView?.onlyChangeSite(false) + mView?.setSiteAdapterEnable(true) + isChangeIngLineAndSite = true + mView?.lineAdapterSubmit(it) + checkLine?.let { + querySitesByLineId(it.lineId.toString(),false) + } + } + } + } + + private fun querySitesByLineId(lineId: String,isSelect:Boolean) { + BusPassengerServiceManager.queryLineSiteList( + context, + lineId, + object : OchCommonServiceCallback { + override fun onSuccess(data: SiteInfoResponse?) { + if (data?.data == null) return + mView?.siteAdapterSetData(data.data) + if (data.data.isNotEmpty()) { + // 计算当前站点是那个 + val calculateCurrentSite = + CharterPassengerModel.calculateCurrentSite(data.data) + val first = calculateCurrentSite.first// 可用站点 + if(first<0){ + // 所有站点不可用 + currentSite = data.data[data.data.size-1] + currentSite!!.isNear = calculateCurrentSite.second + mView?.siteAdapterEnableIndex(data.data.size-1) + }else{ + // + val index = if(first==0) { + 0 + }else if (first <= data.data.size-1) { + first-1 + } else { + data.data.size - 1 + } + currentSite = data.data[index] + currentSite!!.isNear = calculateCurrentSite.second + mView?.siteAdapterEnableIndex(index) + } + if(isSelect){ + data.data.last().isCheck = true + tempCheckSite = data.data.last() + }else{ + data.data.forEach { + if (it.siteId == checkSite?.siteId) { + it.isCheck = true + } + } + } + } + } + + override fun onFail(code: Int, msg: String?) { + ToastUtils.showShort("查询站点失败") + } + }) + } + + private fun queryLineList() { + BusPassengerServiceManager.queryLineList(context, object : + OchCommonServiceCallback { + override fun onSuccess(data: LineInfoListResponse?) { + if (data?.data == null) return + mView?.lineAdapterSetData(data.data) + } + + override fun onFail(code: Int, msg: String) { + ToastUtils.showShort("查询线路失败") + } + }) } override fun onResume(owner: LifecycleOwner) { @@ -25,10 +189,264 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderFragment?) : override fun onDestroy(owner: LifecycleOwner) { super.onDestroy(owner) + CallerLogger.d(SceneConstant.M_BUS_P + TAG, "onDestroy") + RxUtils.disposeSubscribe(subscribeSelectLine) + RxUtils.disposeSubscribe(subscribeSelectSite) + BusPassengerModelLoopManager.removeLoopFunction(TAGLINELOOP) CharterPassengerModel.setStatusChangeListener(TAG,null) + CallerTelematicListenerManager.removeListener(TAG) } + + /** + * 接收司机屏反馈信息 + */ + val msgReceived = object : IReceivedMsgListener { + override fun onReceivedMsg(type: Int, byteArray: ByteArray) { + UiThreadHandler.post { + if (type == OchCommonConst.BUSINESS_STRING) { + val msg = GsonUtils.fromJson( + String(byteArray), + ChangeDestMsg::class.java + ) as ChangeDestMsg + if (msg.type == DPMsgType.TYPE_CHANGE_DEST.type) { + if (msg.destSiteId == 0) { + if (msg.isConfirmed) { + ToastUtils.showShort("线路确定") + mView?.setEnableLineStatus(false) + mView?.setEnableSiteStatus(true) + mView?.onlyChangeSite(false) + mView?.setSiteAdapterEnable(true) + mView?.setSwitchEnable(false) + tempCheckLineIsSubmit = true + tempCheckLine?.let { + mView?.lineAdapterSubmit(it) + } + } else { + tempCheckLineIsSubmit = false + ToastUtils.showShort("司机端拒绝请重新选择") + } + RxUtils.disposeSubscribe(subscribeSelectLine) + mView?.endAni() + CallerLogger.d(SceneConstant.M_BUS_P + TAG, "endAni1111") + } else { + if (msg.isConfirmed) { + ToastUtils.showShort("站点确定") + mView?.setEnableLineStatus(false) + mView?.setEnableSiteStatus(true) + mView?.onlyChangeSite(false) + mView?.setSiteAdapterEnable(true) + mView?.setSwitchEnable(true) + checkLine = tempCheckLine + checkSite = tempCheckSite + tempCheckLine = null + tempCheckSite = null + tempCheckLineIsSubmit = false + checkLine?.let { + mView?.lineAdapterSubmit(it) + } + mView?.go2StartCar() + CharterPassengerModel.queryOrder() + CharterPassengerModel.cleanbroadcastListInfo() + } else { + tempCheckLineIsSubmit = true + ToastUtils.showShort("司机端拒绝请重新选择") + } + RxUtils.disposeSubscribe(subscribeSelectSite) + } + BusPassengerModelLoopManager.removeLoopFunction(TAGLINELOOP) + } + } + } + } + } + + fun lineSubmit(){ + if (tempCheckLine == null) { + ToastUtils.showLong("请选择线路") + return + } + if (!CallerTelematicManager.getClientConnStatus()) { + ToastUtils.showLong("乘客屏无法连接司机屏请联系安全员") + return + } + tempCheckLine?.let { + val msg = ChangeDestMsg( + it.lineId!!.toInt(), + it.name!!, + 0, + "", + 0, + "", + false + ) + CallerTelematicManager.sendMsgToServer( + OchCommonConst.BUSINESS_STRING, + GsonUtils.toJson(msg).toByteArray() + ) + mView?.startAni() + // 启动查看和司机端链接 + BusPassengerModelLoopManager.setLoopFunction( + TAGLINELOOP, + LoopInfo(3, ::checkServerStatus) + ) + RxUtils.disposeSubscribe(subscribeSelectLine) + subscribeSelectLine= RxUtils.createSubscribe(120_000){ + ToastUtils.showShort("请联系安全员确认") + mView?.endAni() + CallerLogger.d(SceneConstant.M_BUS_P + TAG, "endAni3333") + } + } + } + + fun siteSubmit(){ + if (!tempCheckLineIsSubmit) { + ToastUtils.showLong("请选择站点") + return + } + if (!CallerTelematicManager.getClientConnStatus()) { + ToastUtils.showLong("乘客屏无法连接司机屏请联系安全员") + return + } + tempCheckSite?.let { lineInfo -> + tempCheckSite?.let { siteInfo -> + val msg = ChangeDestMsg( + lineInfo.lineId!!.toInt(), + lineInfo.lineName!!, + currentSite!!.siteId!!.toInt(), + currentSite!!.siteName!!, + siteInfo.siteId!!.toInt(), + siteInfo.siteName!!, + false + ) + CallerTelematicManager.sendMsgToServer( + OchCommonConst.BUSINESS_STRING, + GsonUtils.toJson(msg).toByteArray() + ) + } + mView?.startAni() + // 启动查看和司机端链接 + BusPassengerModelLoopManager.setLoopFunction( + TAGLINELOOP, + LoopInfo(3, ::checkServerStatus) + ) + RxUtils.disposeSubscribe(subscribeSelectSite) + subscribeSelectSite = RxUtils.createSubscribe(120_000){ + ToastUtils.showShort("请联系安全员确认") + mView?.endAni() + CallerLogger.d(SceneConstant.M_BUS_P + TAG, "endAni444") + } + } + } + + fun onlySiteSubmit(){ + tempCheckSite?.let { siteInfo -> + val msg = ChangeDestMsg( + siteInfo.lineId!!.toInt(), + siteInfo.lineName!!, + currentSite!!.siteId!!.toInt(), + currentSite!!.siteName!!, + siteInfo.siteId!!.toInt(), + siteInfo.siteName!!, + false + ) + CallerTelematicManager.sendMsgToServer( + OchCommonConst.BUSINESS_STRING, + GsonUtils.toJson(msg).toByteArray() + ) + } + mView?.startAni() + // 启动查看和司机端链接 + BusPassengerModelLoopManager.setLoopFunction( + TAGLINELOOP, + LoopInfo(3, ::checkServerStatus) + ) + RxUtils.disposeSubscribe(subscribeSelectSite) + subscribeSelectSite = RxUtils.createSubscribe(120_000){ + ToastUtils.showShort("请联系安全员确认") + mView?.endAni() + CallerLogger.d(SceneConstant.M_BUS_P + TAG, "endAni555") + + } + } + private fun checkServerStatus() { + if (!CallerTelematicManager.getClientConnStatus()) { + ToastUtils.showShort("断开和司机端连接、请联系安全员") + BusPassengerModelLoopManager.removeLoopFunction(TAGLINELOOP) + mView?.endAni() + CallerLogger.d(SceneConstant.M_BUS_P + TAG, "endAni666") + } + } + override fun onStatusChange(currentStatus: OrderStatusEnum) { mView?.setViewByOrderStatus(currentStatus) } + fun switchLine() { + val gnssSpeed = + CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().gnssSpeed + if (gnssSpeed < 0.5) { + // TODO: 自驾中 需要 靠边停车中、到站 + // TODO: 没有自驾中 需要 靠边停车中、到站 + when (CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state) { + IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> {// 不可自动驾驶 + // 可以切换路径 + isChangeIngLineAndSite = false + mView?.onlyChangeSite(false) + // 可以切换路径 + mView?.setEnableLineStatus(true) + mView?.setSiteAdapterEnable(false) + queryLineList() + } + IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE -> {// + isChangeIngLineAndSite = false + mView?.onlyChangeSite(false) + // 可以切换路径 + mView?.setEnableLineStatus(true) + mView?.setSiteAdapterEnable(false) + queryLineList() + } + IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> { + // 自动驾驶中 + when (OCHPlanningStopSideStatusManager.stopSiteStatus) { + OCHPlanningStopSideStatusManager.Status.EndingSuccess -> { + isChangeIngLineAndSite = false + mView?.onlyChangeSite(false) + // 可以切换路径 + mView?.setEnableLineStatus(true) + mView?.setSiteAdapterEnable(false) + queryLineList() + } + else ->{ + ToastUtils.showShort("自动驾驶中无法切换线路") + } + } + } + IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING -> { + ToastUtils.showShort("因车辆正在平行驾驶中无法切换线路") + } + else -> {} + } + } else { + ToastUtils.showShort("请停车后再修改目的地~") + } + } + + fun checkLineClick(lineInfo: LineInfoResponse.LineInfo) { + tempCheckLine = lineInfo + querySitesByLineId(lineInfo.lineId.toString(),true) + } + + fun checkSiteClick(siteInfo: SiteInfoResponse.SiteInfo) { + tempCheckSite = siteInfo + if(isChangeIngLineAndSite) { + checkSite?.let { + if (it.siteId == siteInfo.siteId) { + mView?.onlyChangeSite(false) + } else { + mView?.onlyChangeSite(true) + } + } + } + } + } \ No newline at end of file diff --git a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/M1OrderFragment.kt b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/M1OrderFragment.kt index 35e1459f48..2483279c9a 100644 --- a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/M1OrderFragment.kt +++ b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/M1OrderFragment.kt @@ -1,12 +1,27 @@ package com.mogo.och.bus.passenger.ui +import android.animation.ObjectAnimator import android.os.Bundle import android.view.View +import android.view.animation.LinearInterpolator +import androidx.recyclerview.widget.LinearLayoutManager +import com.elegant.utils.UiThreadHandler import com.mogo.commons.mvp.MvpFragment +import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.och.bus.passenger.R +import com.mogo.och.bus.passenger.bean.response.LineInfoResponse +import com.mogo.och.bus.passenger.bean.response.SiteInfoResponse import com.mogo.och.bus.passenger.model.OrderStatusEnum import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionOrderPresenter +import com.mogo.och.bus.passenger.ui.adapter.OrderLineItemAdapter +import com.mogo.och.bus.passenger.ui.adapter.OrderSiteItemAdapter +import com.mogo.och.bus.passenger.view.BottomDecoration import kotlinx.android.synthetic.main.m1_order_fragment.* +import me.jessyan.autosize.utils.AutoSizeUtils /** * @author: yangyakun @@ -15,7 +30,24 @@ import kotlinx.android.synthetic.main.m1_order_fragment.* class M1OrderFragment : MvpFragment() { - private var changeCheck: M1ContainFragment.ChangeCheck?=null + private var changeCheck: M1ContainFragment.ChangeCheck? = null + + + private lateinit var lineAdapter: OrderLineItemAdapter + private lateinit var siteAdapter: OrderSiteItemAdapter + + val lineList = mutableListOf() + val siteList = mutableListOf() + + + + private val loadingAni = + ObjectAnimator.ofFloat(iv_loading_wait_driver, "rotation", 0f, 90f, 180f, 270f, 360f) + .apply { + repeatCount = -1 + interpolator = LinearInterpolator() + duration = 1000 + } override fun getLayoutId(): Int { return R.layout.m1_order_fragment @@ -26,10 +58,136 @@ class M1OrderFragment : } override fun initViews() { - lsv_line_site.setchangeCheck(this.changeCheck) + CallerLogger.d(SceneConstant.M_BUS_P + TAG, "initViews") + lineAdapter = OrderLineItemAdapter(requireContext(), lineList) + siteAdapter = OrderSiteItemAdapter(requireContext(), siteList) + loadingAni.target = iv_loading_wait_driver + rlv_line_list.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + rlv_line_list.addItemDecoration( + BottomDecoration( + AutoSizeUtils.dp2px(context, 60f) + ) + ) + rlv_line_list.adapter = lineAdapter + + rv_site_list.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + rv_site_list.addItemDecoration( + BottomDecoration( + AutoSizeUtils.dp2px(context, 60f) + ) + ) + rv_site_list.adapter = siteAdapter + + initListener() + } - fun setViewByOrderStatus(currentStatus: OrderStatusEnum){ + private fun initListener() { + lineAdapter.checkChangeListener = object : OrderLineItemAdapter.CheckListener { + override fun onCheckListener(lineInfo: LineInfoResponse.LineInfo) { + mPresenter?.checkLineClick(lineInfo) + siteAdapter.clearCheck() + } + } + siteAdapter.checkChangeListener = object : OrderSiteItemAdapter.CheckListener { + override fun onCheckListener(siteInfo: SiteInfoResponse.SiteInfo) { + // 设置临时选中的 + mPresenter?.checkSiteClick(siteInfo) + } + + } + tv_line_cancle.onClick { + mPresenter?.lineReset() + } + tv_site_cancle.onClick { + mPresenter?.siteReset() + } + tv_line_submit.onClick { + mPresenter?.lineSubmit() + } + tv_site_submit.onClick { + mPresenter?.siteSubmit() + } + tv_site_only_submit.onClick { + // 线路不换只换站点 + if (!CallerTelematicManager.getClientConnStatus()) { + ToastUtils.showLong("乘客屏无法连接司机屏请联系安全员") + return@onClick + } + mPresenter?.onlySiteSubmit() + } + tv_loading_wait_driver_title.onClick { + endAni() + } + + tv_switch_line.onClick { + mPresenter?.switchLine() + } + } + + + /** + * 设置是否可用进行选择线路 + */ + fun setEnableLineStatus(enable: Boolean) { + if (enable) { + g_line_submit_group.visibility = View.VISIBLE + lineAdapter.setEnable(true) + } else { + g_line_submit_group.visibility = View.GONE + lineAdapter.setEnable(false) + } + } + + /** + * 设置是否可用选择站点 + */ + fun setEnableSiteStatus(cancleAndSubmit: Boolean) { + if (cancleAndSubmit) { + g_side_cancle_submit_group.visibility = View.VISIBLE + } else { + g_side_cancle_submit_group.visibility = View.GONE + } + } + + fun onlyChangeSite(submit: Boolean) { + if (submit) { + g_side_submit_group.visibility = View.VISIBLE + } else { + g_side_submit_group.visibility = View.GONE + } + } + + fun setSiteAdapterEnable(enable: Boolean) { + if (enable) { + siteAdapter.setEnable(true) + } else { + siteAdapter.setEnable(false) + } + } + + fun setSwitchEnable(enable: Boolean) { + tv_switch_line.isEnabled = enable + } + + fun startAni() { + g_lines_sites_data.visibility = View.GONE + g_loading_group.visibility = View.VISIBLE + if (!loadingAni.isRunning) { + loadingAni.start() + } + } + + fun endAni() { + UiThreadHandler.post { + g_lines_sites_data.visibility = View.VISIBLE + g_loading_group.visibility = View.GONE + } + } + + fun setViewByOrderStatus(currentStatus: OrderStatusEnum) { when (currentStatus) { OrderStatusEnum.NoOrderUnuse -> { // 无订单页面 @@ -52,13 +210,40 @@ class M1OrderFragment : } } + + fun go2StartCar() { + changeCheck?.changeChange() + } + override fun createPresenter(): BusPassengerFunctionOrderPresenter { + CallerLogger.d(SceneConstant.M_BUS_P + TAG, "createPresenter") return BusPassengerFunctionOrderPresenter(this) } + override fun onDestroyView() { + super.onDestroyView() + loadingAni.cancel() + CallerLogger.d(SceneConstant.M_BUS_P + TAG, "onDestroyView") + } + + fun lineAdapterSubmit(lineInfo: LineInfoResponse.LineInfo) { + lineAdapter.submitLine(lineInfo) + } + + fun lineAdapterSetData(lineInfo: List) { + lineAdapter.setDataList(lineInfo) + } + + fun siteAdapterSetData(siteInfo: List) { + siteAdapter.setDataList(siteInfo) + } + fun siteAdapterEnableIndex(index: Int) { + siteAdapter.setEnableIndex(index) + } companion object { const val TAG = "BusPassengerFunctionOrderFragment" + @JvmStatic fun newInstance(changeCheck: M1ContainFragment.ChangeCheck): M1OrderFragment { val args = Bundle() diff --git a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/view/LineSiteView.kt b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/view/LineSiteView.kt deleted file mode 100644 index 3ebe752a6b..0000000000 --- a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/view/LineSiteView.kt +++ /dev/null @@ -1,572 +0,0 @@ -package com.mogo.och.bus.passenger.ui.view - -import android.animation.ObjectAnimator -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.View -import android.view.animation.LinearInterpolator -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.recyclerview.widget.LinearLayoutManager -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener -import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager -import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager -import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager -import com.mogo.eagle.core.utilcode.kotlin.onClick -import com.mogo.eagle.core.utilcode.util.GsonUtils -import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.mogo.eagle.core.utilcode.util.UiThreadHandler -import com.mogo.och.bus.passenger.R -import com.mogo.och.bus.passenger.bean.LoopInfo -import com.mogo.och.bus.passenger.bean.response.LineInfoListResponse -import com.mogo.och.bus.passenger.bean.response.LineInfoResponse -import com.mogo.och.bus.passenger.bean.response.SiteInfoResponse -import com.mogo.och.bus.passenger.model.CharterPassengerModel -import com.mogo.och.bus.passenger.net.BusPassengerModelLoopManager -import com.mogo.och.bus.passenger.net.BusPassengerServiceManager -import com.mogo.och.bus.passenger.ui.M1ContainFragment -import com.mogo.och.bus.passenger.ui.adapter.OrderLineItemAdapter -import com.mogo.och.bus.passenger.ui.adapter.OrderSiteItemAdapter -import com.mogo.och.common.module.utils.RxUtils -import com.mogo.och.bus.passenger.view.BottomDecoration -import com.mogo.och.common.module.bean.dpmsg.DPMsgType -import com.mogo.och.common.module.biz.constant.OchCommonConst -import com.mogo.och.common.module.biz.network.OchCommonServiceCallback -import com.mogo.och.common.module.manager.OCHPlanningStopSideStatusManager -import com.mogo.och.common.module.bean.dpmsg.ChangeDestMsg -import io.reactivex.disposables.Disposable -import kotlinx.android.synthetic.main.m1_order_lineside.view.* -import me.jessyan.autosize.utils.AutoSizeUtils - -class LineSiteView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr) { - - companion object { - const val TAG = "LineSiteView" - const val TAGLINELOOP = "LineSiteViewLineLoop" - } - - // 成功提交给后台得线路 - private var checkLine: LineInfoResponse.LineInfo? = null - - // 成功提交给后台得终点站点 - private var checkSite: SiteInfoResponse.SiteInfo? = null - - // 下一个站点 - private var currentSite: SiteInfoResponse.SiteInfo? = null - - // 向司机端端提交的临时线路 - private var tempCheckLine: LineInfoResponse.LineInfo? = null - - // 向司机端临时提交的终点站点 - private var tempCheckSite: SiteInfoResponse.SiteInfo? = null - - private var tempCheckLineIsSubmit = false - private var isChangeIngLineAndSite = false - - - private val lineList = mutableListOf() - private val siteList = mutableListOf() - - private var lineAdapter: OrderLineItemAdapter - private var siteAdapter: OrderSiteItemAdapter - - private var gnssSpeed = 0.0 - - private val loadingAni = - ObjectAnimator.ofFloat(iv_loading_wait_driver, "rotation", 0f, 90f, 180f, 270f, 360f) - .apply { - repeatCount = -1 - interpolator = LinearInterpolator() - duration = 1000 - } - private var changeCheck: M1ContainFragment.ChangeCheck?=null - private var subscribeSelectLine: Disposable? = null - private var subscribeSelectSite: Disposable? = null - - init { - LayoutInflater.from(context).inflate(R.layout.m1_order_lineside, this, true) - lineAdapter = OrderLineItemAdapter(context, lineList) - siteAdapter = OrderSiteItemAdapter(context, siteList) - loadingAni.target = iv_loading_wait_driver - } - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - rlv_line_list.layoutManager = - LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) - rlv_line_list.addItemDecoration( - BottomDecoration( - AutoSizeUtils.dp2px(context, 60f) - ) - ) - rlv_line_list.adapter = lineAdapter - - rv_site_list.layoutManager = - LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) - rv_site_list.addItemDecoration( - BottomDecoration( - AutoSizeUtils.dp2px(context, 60f) - ) - ) - rv_site_list.adapter = siteAdapter - - val hasSetLineAndSite = CharterPassengerModel.hasSetLineAndSite() - if (hasSetLineAndSite != null) {// 已经设置了线路和站点 - checkLine = hasSetLineAndSite.first - checkSite = hasSetLineAndSite.second - lineList.clear() - resetData() - } else { - queryLineList() - setEnableLineStatus(true) - setEnableSiteStatus(false) - onlyChangeSite(false) - setSiteAdapterEnable(false) - setSwitchEnable(false) - isChangeIngLineAndSite = false - } - - initListener() - - } - - /** - * 重置数据 - */ - private fun resetData() { - if(checkLine==null){// 没有提交线路 - queryLineList() - setEnableLineStatus(true) - setEnableSiteStatus(false) - onlyChangeSite(false) - setSiteAdapterEnable(false) - }else{ - checkLine?.let { - setEnableLineStatus(false) - setEnableSiteStatus(false) - onlyChangeSite(false) - setSiteAdapterEnable(true) - isChangeIngLineAndSite = true - lineAdapter.submitLine(it) - checkLine?.let { - querySitesByLineId(it.lineId.toString(),false) - } - } - } - } - - /** - * 设置是否可用进行选择线路 - */ - private fun setEnableLineStatus(enable: Boolean) { - if (enable) { - g_line_submit_group.visibility = View.VISIBLE - lineAdapter.setEnable(true) - } else { - g_line_submit_group.visibility = View.GONE - lineAdapter.setEnable(false) - } - } - - /** - * 设置是否可用选择站点 - */ - private fun setEnableSiteStatus(cancleAndSubmit: Boolean) { - if (cancleAndSubmit) { - g_side_cancle_submit_group.visibility = View.VISIBLE - } else { - g_side_cancle_submit_group.visibility = View.GONE - } - } - - fun onlyChangeSite(submit:Boolean){ - if (submit) { - g_side_submit_group.visibility = View.VISIBLE - } else { - g_side_submit_group.visibility = View.GONE - } - } - - fun setSiteAdapterEnable(enable: Boolean){ - if(enable){ - siteAdapter.setEnable(true) - }else{ - siteAdapter.setEnable(false) - } - } - - private fun initListener() { - lineAdapter.checkChangeListener = object : OrderLineItemAdapter.CheckListener { - override fun onCheckListener(lineInfo: LineInfoResponse.LineInfo) { - tempCheckLine = lineInfo - querySitesByLineId(lineInfo.lineId.toString(),true) - siteAdapter.clearCheck() - } - } - siteAdapter.checkChangeListener = object : OrderSiteItemAdapter.CheckListener { - override fun onCheckListener(siteInfo: SiteInfoResponse.SiteInfo) { - // 设置临时选中的 - tempCheckSite = siteInfo - if(isChangeIngLineAndSite) { - checkSite?.let { - if (it.siteId == siteInfo.siteId) { - onlyChangeSite(false) - } else { - onlyChangeSite(true) - } - } - } - } - - } - tv_line_cancle.onClick { - resetData() - tempCheckLine = null - } - tv_site_cancle.onClick { - resetData() - tempCheckLine = null - tempCheckSite = null - } - tv_line_submit.onClick { - if (tempCheckLine == null) { - ToastUtils.showLong("请选择线路") - return@onClick - } - if (!CallerTelematicManager.getClientConnStatus()) { - ToastUtils.showLong("乘客屏无法连接司机屏请联系安全员") - return@onClick - } - tempCheckLine?.let { - val msg = ChangeDestMsg( - it.lineId!!.toInt(), - it.name!!, - 0, - "", - 0, - "", - false - ) - CallerTelematicManager.sendMsgToServer( - OchCommonConst.BUSINESS_STRING, - GsonUtils.toJson(msg).toByteArray() - ) - startAni() - // 启动查看和司机端链接 - BusPassengerModelLoopManager.setLoopFunction( - TAGLINELOOP, - LoopInfo(3, ::checkServerStatus) - ) - RxUtils.disposeSubscribe(subscribeSelectLine) - subscribeSelectLine= RxUtils.createSubscribe(120_000){ - ToastUtils.showShort("请联系安全员确认") - endAni() - } - } - } - tv_site_submit.onClick { - if (!tempCheckLineIsSubmit) { - ToastUtils.showLong("请选择站点") - return@onClick - } - if (!CallerTelematicManager.getClientConnStatus()) { - ToastUtils.showLong("乘客屏无法连接司机屏请联系安全员") - return@onClick - } - tempCheckSite?.let { lineInfo -> - tempCheckSite?.let { siteInfo -> - val msg = ChangeDestMsg( - lineInfo.lineId!!.toInt(), - lineInfo.lineName!!, - currentSite!!.siteId!!.toInt(), - currentSite!!.siteName!!, - siteInfo.siteId!!.toInt(), - siteInfo.siteName!!, - false - ) - CallerTelematicManager.sendMsgToServer( - OchCommonConst.BUSINESS_STRING, - GsonUtils.toJson(msg).toByteArray() - ) - } - startAni() - // 启动查看和司机端链接 - BusPassengerModelLoopManager.setLoopFunction( - TAGLINELOOP, - LoopInfo(3, ::checkServerStatus) - ) - RxUtils.disposeSubscribe(subscribeSelectSite) - subscribeSelectSite = RxUtils.createSubscribe(120_000){ - ToastUtils.showShort("请联系安全员确认") - endAni() - } - } - } - tv_site_only_submit.onClick { - // 线路不换只换站点 - if (!CallerTelematicManager.getClientConnStatus()) { - ToastUtils.showLong("乘客屏无法连接司机屏请联系安全员") - return@onClick - } - tempCheckSite?.let { siteInfo -> - val msg = ChangeDestMsg( - siteInfo.lineId!!.toInt(), - siteInfo.lineName!!, - currentSite!!.siteId!!.toInt(), - currentSite!!.siteName!!, - siteInfo.siteId!!.toInt(), - siteInfo.siteName!!, - false - ) - CallerTelematicManager.sendMsgToServer( - OchCommonConst.BUSINESS_STRING, - GsonUtils.toJson(msg).toByteArray() - ) - } - startAni() - // 启动查看和司机端链接 - BusPassengerModelLoopManager.setLoopFunction( - TAGLINELOOP, - LoopInfo(3, ::checkServerStatus) - ) - RxUtils.disposeSubscribe(subscribeSelectSite) - subscribeSelectSite = RxUtils.createSubscribe(120_000){ - ToastUtils.showShort("请联系安全员确认") - endAni() - } - } - tv_loading_wait_driver_title.onClick { - endAni() - } - - CallerTelematicListenerManager.addListener(TAG, msgReceived) - CharterPassengerModel.setControllerStatusCallback(TAG) { location -> - location?.let { - gnssSpeed = it.gnssInfo.vehicleSpeed - } - } - tv_switch_line.onClick { - if (gnssSpeed < 0.5) { - // TODO: 自驾中 需要 靠边停车中、到站 - // TODO: 没有自驾中 需要 靠边停车中、到站 - when (CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state) { - IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> {// 不可自动驾驶 - // 可以切换路径 - isChangeIngLineAndSite = false - onlyChangeSite(false) - // 可以切换路径 - setEnableLineStatus(true) - setSiteAdapterEnable(false) - queryLineList() - } - IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE -> {// - isChangeIngLineAndSite = false - onlyChangeSite(false) - // 可以切换路径 - setEnableLineStatus(true) - setSiteAdapterEnable(false) - queryLineList() - } - IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> { - // 自动驾驶中 - when (OCHPlanningStopSideStatusManager.stopSiteStatus) { - OCHPlanningStopSideStatusManager.Status.EndingSuccess -> { - isChangeIngLineAndSite = false - onlyChangeSite(false) - // 可以切换路径 - setEnableLineStatus(true) - setSiteAdapterEnable(false) - queryLineList() - } - else ->{ - ToastUtils.showShort("自动驾驶中无法切换线路") - } - } - } - IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING -> { - ToastUtils.showShort("因车辆正在平行驾驶中无法切换线路") - } - else -> {} - } - } else { - ToastUtils.showShort("请停车后再修改目的地~") - } - } - } - private fun setSwitchEnable(enable: Boolean){ - tv_switch_line.isEnabled = enable - } - - /** - * 接收司机屏反馈信息 - */ - val msgReceived = object : IReceivedMsgListener { - override fun onReceivedMsg(type: Int, byteArray: ByteArray) { - UiThreadHandler.post { - if (type == OchCommonConst.BUSINESS_STRING) { - val msg = GsonUtils.fromJson( - String(byteArray), - ChangeDestMsg::class.java - ) as ChangeDestMsg - if (msg.type == DPMsgType.TYPE_CHANGE_DEST.type) { - if (msg.destSiteId == 0) { - if (msg.isConfirmed) { - ToastUtils.showShort("线路确定") - setEnableLineStatus(false) - setEnableSiteStatus(true) - onlyChangeSite(false) - setSiteAdapterEnable(true) - setSwitchEnable(false) - tempCheckLineIsSubmit = true - tempCheckLine?.let { - lineAdapter.submitLine(it) - } - } else { - tempCheckLineIsSubmit = false - ToastUtils.showShort("司机端拒绝请重新选择") - } - RxUtils.disposeSubscribe(subscribeSelectLine) - } else { - if (msg.isConfirmed) { - ToastUtils.showShort("站点确定") - setEnableLineStatus(false) - setEnableSiteStatus(true) - onlyChangeSite(false) - setSiteAdapterEnable(true) - setSwitchEnable(true) - checkLine = tempCheckLine - checkSite = tempCheckSite - tempCheckLine = null - tempCheckSite = null - tempCheckLineIsSubmit = false - checkLine?.let { - lineAdapter.submitLine(it) - } - go2StartCar() - CharterPassengerModel.queryOrder() - CharterPassengerModel.cleanbroadcastListInfo() - } else { - tempCheckLineIsSubmit = true - ToastUtils.showShort("司机端拒绝请重新选择") - } - RxUtils.disposeSubscribe(subscribeSelectSite) - } - BusPassengerModelLoopManager.removeLoopFunction(TAGLINELOOP) - endAni() - } - } - } - } - } - - private fun go2StartCar() { - changeCheck?.changeChange() - } - - fun setchangeCheck(changeCheck: M1ContainFragment.ChangeCheck?){ - this.changeCheck = changeCheck - } - - private fun startAni() { - g_lines_sites_data.visibility = View.GONE - g_loading_group.visibility = View.VISIBLE - if (!loadingAni.isRunning) { - loadingAni.start() - } - } - - private fun endAni() { - UiThreadHandler.post { - g_lines_sites_data.visibility = View.VISIBLE - g_loading_group.visibility = View.GONE - } - } - - override fun onDetachedFromWindow() { - super.onDetachedFromWindow() - loadingAni.cancel() - RxUtils.disposeSubscribe(subscribeSelectLine) - RxUtils.disposeSubscribe(subscribeSelectSite) - CallerTelematicListenerManager.removeListener(TAG) - BusPassengerModelLoopManager.removeLoopFunction(TAGLINELOOP) - CharterPassengerModel.setControllerStatusCallback(TAG, null) - - } - - private fun queryLineList() { - BusPassengerServiceManager.queryLineList(context, object : - OchCommonServiceCallback { - override fun onSuccess(data: LineInfoListResponse?) { - if (data?.data == null) return - lineAdapter.setDataList(data.data) - } - - override fun onFail(code: Int, msg: String) { - ToastUtils.showShort("查询线路失败") - } - }) - } - - private fun checkServerStatus() { - if (!CallerTelematicManager.getClientConnStatus()) { - ToastUtils.showShort("断开和司机端连接、请联系安全员") - BusPassengerModelLoopManager.removeLoopFunction(TAGLINELOOP) - endAni() - } - } - - private fun querySitesByLineId(lineId: String,isSelect:Boolean) { - BusPassengerServiceManager.queryLineSiteList( - context, - lineId, - object : OchCommonServiceCallback { - override fun onSuccess(data: SiteInfoResponse?) { - if (data?.data == null) return - siteAdapter.setDataList(data.data) - if (data.data.isNotEmpty()) { - // 计算当前站点是那个 - val calculateCurrentSite = - CharterPassengerModel.calculateCurrentSite(data.data) - val first = calculateCurrentSite.first// 可用站点 - if(first<0){ - // 所有站点不可用 - currentSite = data.data[data.data.size-1] - currentSite!!.isNear = calculateCurrentSite.second - siteAdapter.setEnableIndex(data.data.size-1) - }else{ - // - val index = if(first==0) { - 0 - }else if (first <= data.data.size-1) { - first-1 - } else { - data.data.size - 1 - } - currentSite = data.data[index] - currentSite!!.isNear = calculateCurrentSite.second - siteAdapter.setEnableIndex(index) - } - if(isSelect){ - data.data.last().isCheck = true - tempCheckSite = data.data.last() - }else{ - data.data.forEach { - if (it.siteId == checkSite?.siteId) { - it.isCheck = true - } - } - } - } - } - - override fun onFail(code: Int, msg: String?) { - ToastUtils.showShort("查询站点失败") - } - }) - } -} \ No newline at end of file diff --git a/OCH/mogo-och-charter-passenger/src/main/res/layout/m1_order_fragment.xml b/OCH/mogo-och-charter-passenger/src/main/res/layout/m1_order_fragment.xml index 4e300c8f82..6a89b97713 100644 --- a/OCH/mogo-och-charter-passenger/src/main/res/layout/m1_order_fragment.xml +++ b/OCH/mogo-och-charter-passenger/src/main/res/layout/m1_order_fragment.xml @@ -1,8 +1,9 @@ + android:layout_height="match_parent"> @@ -17,10 +18,242 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintWidth_percent="0.53698"> - + android:layout_height="match_parent" + tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file