Merge branch 'dev_minibus-d_230425_3.2.0' into dev_robobus_d_3.2.0_4.14_local

This commit is contained in:
wangmingjun
2023-04-26 18:24:51 +08:00
319 changed files with 2502 additions and 2695 deletions

View File

@@ -45,10 +45,6 @@ public class MogoOCHBusPassenger implements IMogoOCH {
this.mActivity = activity;
this.mContainerId = containerId;
showFragment();
if (AppIdentityModeUtils.isJL(FunctionBuildConfig.appIdentityMode)) {
MultiDisplayUtils.INSTANCE.startActWithSecond(activity, VideoPlayerActivity.class);
}
return null;
}

View File

@@ -45,14 +45,6 @@ android {
}
}
flavorDimensions "vehicle"
productFlavors {
// 车型金旅m1 包车业务
m1 {
dimension "vehicle"
buildConfigField 'int', 'NEW_TEST', '1'
}
}
}
dependencies {

View File

@@ -1,33 +0,0 @@
package com.mogo.och.bus.passenger.model
/**
* Created on 2022/08/19
*
*
* 0 初始状态,
* 10 已登录,
* 20 已登出,
*/
enum class OrderStatusEnum(val code: Int) {
Nothing(0),
NoOrderUnuse( 10 ), //无订单车闲置 m1_order_noorder.xml 无订单页面
OrderNoLine( 20), //有订单无线路 m1_order_lineside 选择线路页面
OrdersWithLine( 30), //有订单有线路 m1_order_lineside 选择线路页面隐藏掉确定取消
NoOrderUse( 40),; //无订单车不闲置 m1_order_end.xml 开门关门页面
companion object {
@JvmStatic
fun valueOf(code: Int): OrderStatusEnum? {
for (value in values()) {
if (value.code == code) {
return value
}
}
return NoOrderUnuse
}
}
}
interface IOrderStatusChangeListener {
fun onStatusChange(currentStatus:OrderStatusEnum)
}

View File

@@ -1,96 +0,0 @@
package com.mogo.och.bus.passenger.presenter
import androidx.lifecycle.LifecycleOwner
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.bus.passenger.model.CharterPassengerModel
import com.mogo.och.bus.passenger.ui.M1CarUserNoOrderFragment
import com.mogo.och.common.module.manager.OCHM1LightAirconditionDoorStatusManager
import io.reactivex.disposables.Disposable
class BusPassengerCarUseAndNoOrderPresenter(view: M1CarUserNoOrderFragment?) :
BusBasePassengerFunctionDevicePresenter<M1CarUserNoOrderFragment?>(view),
OCHM1LightAirconditionDoorStatusManager.OCHM1LightAirconditionDoorCallback {
companion object {
private const val TAG = "BusPassengerFunctionPresenter"
}
private var subscribe: Disposable? = null
private var subscribeDoorStatus: Disposable? = null
private var gnssSpeed = 0.0
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
OCHM1LightAirconditionDoorStatusManager.addListener(TAG, this)
CharterPassengerModel.setControllerStatusCallback(TAG) { location ->
location?.let {
gnssSpeed = it.gnssInfo.vehicleSpeed
}
}
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
OCHM1LightAirconditionDoorStatusManager.removeListener(TAG)
disposeSubscribe(subscribe)
disposeSubscribe(subscribeDoorStatus)
}
override fun onDoorStatusCallback(isOpen: Boolean, isFirst: Boolean) {
if (!isFirst) {
if (isOpen) {
ToastUtils.showShort("已开启车门")
} else {
ToastUtils.showShort("已关门车门")
}
}
}
fun openDoor() {
val canOpenOrCloseDoor = canOpenOrCloseDoor()
if (!canOpenOrCloseDoor.isNullOrEmpty()) {
ToastUtils.showShort(canOpenOrCloseDoor)
return
}
disposeSubscribe(subscribe)
subscribe = createSubscribe(1000) {
CallerAutoPilotControlManager.sendRoboBusJinlvM1FrontDoorCmd(0)
}
CallerAutoPilotControlManager.sendRoboBusJinlvM1FrontDoorCmd(1)
disposeSubscribe(subscribeDoorStatus)
subscribeDoorStatus = createSubscribe {
if (!OCHM1LightAirconditionDoorStatusManager.doorStatus.isOpen) {
ToastUtils.showShort("车门无法开启,请使用车内物理按钮")
}
}
}
fun closeDoor() {
val canOpenOrCloseDoor = canOpenOrCloseDoor()
if (!canOpenOrCloseDoor.isNullOrBlank()) {
ToastUtils.showShort(canOpenOrCloseDoor)
return
}
disposeSubscribe(subscribe)
subscribe = createSubscribe(1000) {
CallerAutoPilotControlManager.sendRoboBusJinlvM1FrontDoorCmd(0)
}
CallerAutoPilotControlManager.sendRoboBusJinlvM1FrontDoorCmd(2)
disposeSubscribe(subscribeDoorStatus)
subscribeDoorStatus = createSubscribe {
if (OCHM1LightAirconditionDoorStatusManager.doorStatus.isOpen) {
ToastUtils.showShort("车门无法关闭,请使用车内物理按钮")
}
}
}
private fun canOpenOrCloseDoor(): String? {
if (gnssSpeed < 0.01) {
return null
} else {
return "车辆正在运行、请稍后再试"
}
}
}

View File

@@ -1,142 +0,0 @@
package com.mogo.och.bus.passenger.presenter
import androidx.lifecycle.LifecycleOwner
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.bus.passenger.model.CharterPassengerModel
import com.mogo.och.bus.passenger.ui.M1DeviceFragment
import com.mogo.och.common.module.manager.OCHM1LightAirconditionDoorStatusManager
import io.reactivex.disposables.Disposable
class BusPassengerFunctionDevicePresenter(view: M1DeviceFragment?) :
BusBasePassengerFunctionDevicePresenter<M1DeviceFragment?>(view),
OCHM1LightAirconditionDoorStatusManager.OCHM1LightAirconditionDoorCallback {
private var subscribe: Disposable? = null
private var subscribeDoorStatus: Disposable? = null
private var gnssSpeed =0.0
companion object {
private const val TAG = "BusPassengerFunctionDevicePresenter"
}
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
OCHM1LightAirconditionDoorStatusManager.addListener(TAG, this)
CharterPassengerModel.setControllerStatusCallback(TAG) { location ->
location?.let {
gnssSpeed = it.gnssInfo.vehicleSpeed
}
}
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
OCHM1LightAirconditionDoorStatusManager.removeListener(TAG)
disposeSubscribe(subscribe)
disposeSubscribe(subscribeDoorStatus)
}
override fun onDoorStatusCallback(isOpen: Boolean,isFirst: Boolean) {
if(!isFirst) {
if (isOpen) {
ToastUtils.showShort("已开启车门")
} else {
ToastUtils.showShort("已关门车门")
}
}
}
fun openDoor() {
val canOpenOrCloseDoor = canOpenOrCloseDoor()
if(!canOpenOrCloseDoor.isNullOrEmpty()){
ToastUtils.showShort(canOpenOrCloseDoor)
return
}
disposeSubscribe(subscribe)
subscribe = createSubscribe(1000) {
CallerAutoPilotControlManager.sendRoboBusJinlvM1FrontDoorCmd(0)
}
CallerAutoPilotControlManager.sendRoboBusJinlvM1FrontDoorCmd(1)
disposeSubscribe(subscribeDoorStatus)
subscribeDoorStatus = createSubscribe(6000) {
if (!OCHM1LightAirconditionDoorStatusManager.doorStatus.isOpen) {
ToastUtils.showShort("车门无法开启,请使用车内物理按钮")
}
}
}
fun closeDoor() {
val canOpenOrCloseDoor = canOpenOrCloseDoor()
if(!canOpenOrCloseDoor.isNullOrBlank()){
ToastUtils.showShort(canOpenOrCloseDoor)
return
}
disposeSubscribe(subscribe)
subscribe = createSubscribe(1000) {
CallerAutoPilotControlManager.sendRoboBusJinlvM1FrontDoorCmd(0)
}
CallerAutoPilotControlManager.sendRoboBusJinlvM1FrontDoorCmd(2)
disposeSubscribe(subscribeDoorStatus)
subscribeDoorStatus = createSubscribe(6000) {
if (OCHM1LightAirconditionDoorStatusManager.doorStatus.isOpen) {
ToastUtils.showShort("车门无法关闭,请使用车内物理按钮")
}
}
}
private fun canOpenOrCloseDoor():String?{
if(gnssSpeed<0.01){
return null
}else{
return "车辆正在运行、请稍后再试"
}
}
// 靠边停车
fun startStopSide() {
when (CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state) {
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> {// 不可自动驾驶
ToastUtils.showShort("设备未就绪请稍等,请稍后再试")
}
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE -> {//
ToastUtils.showShort("因车辆正在人工驾驶中无法靠边停车,请稍后再试")
}
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> {
// 靠边停车
CallerAutoPilotControlManager.sendPlanningCmd(1)
}
IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING -> {
ToastUtils.showShort("因车辆正在平行驾驶中无法靠边停车,请稍后再试")
}
else -> {}
}
}
fun startGo() {
when (CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state) {
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> {// 不可自动驾驶
ToastUtils.showShort("设备未就绪请稍等")
}
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE -> {//
ToastUtils.showShort("启动自动驾驶中")
CallerAutoPilotControlManager.sendPlanningCmd(2)
CharterPassengerModel.startAutopilot()
CharterPassengerModel.leaveStation()
CharterPassengerModel.sendTripInfo()
}
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> {
// 重新起步
CallerAutoPilotControlManager.sendPlanningCmd(2)
CharterPassengerModel.leaveStation()
}
IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING -> {
ToastUtils.showShort("因车辆正在平行驾驶中无法靠边停车,请稍后再试")
}
else -> {}
}
}
}

View File

@@ -1,34 +0,0 @@
package com.mogo.och.bus.passenger.presenter
import androidx.lifecycle.LifecycleOwner
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.ui.M1OrderFragment
class BusPassengerFunctionOrderPresenter(view: M1OrderFragment?) :
BusBasePassengerFunctionDevicePresenter<M1OrderFragment?>(view), IOrderStatusChangeListener {
companion object{
const val TAG = "BusPassengerFunctionOrderPresenter"
}
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
CharterPassengerModel.setStatusChangeListener(TAG,this)
}
override fun onResume(owner: LifecycleOwner) {
super.onResume(owner)
mView?.setViewByOrderStatus(CharterPassengerModel.getCurrentOrderStatus())
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
CharterPassengerModel.setStatusChangeListener(TAG,null)
}
override fun onStatusChange(currentStatus: OrderStatusEnum) {
mView?.setViewByOrderStatus(currentStatus)
}
}

View File

@@ -1,63 +0,0 @@
package com.mogo.och.bus.passenger.ui
import android.os.Bundle
import com.mogo.commons.mvp.MvpFragment
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionDevicePresenter
import com.mogo.och.common.module.utils.SoundPoolHelper
import kotlinx.android.synthetic.m1.m1_devices_fragment.*
/**
* @author: yangyakun
* @date: 2023/1/28
*/
class M1DeviceFragment :
MvpFragment<M1DeviceFragment?, BusPassengerFunctionDevicePresenter?>() {
override fun getLayoutId(): Int = R.layout.m1_devices_fragment
override fun getTagName(): String = TAG
override fun initViews() {
initListener()
}
private fun initListener() {
tv_car_setting_go.setOnClickListener {
//判断自动驾驶状态
// 自动驾驶状态中: AdasManager.getInstance().sendPlanningCmd(2);
// 没有在自动驾驶中:启动自动驾驶 CallerAutoPilotControlManager.INSTANCE.startAutoPilot(parameters);
mPresenter?.startGo()
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
}
tv_car_setting_stopside.setOnClickListener {
// 执行靠边停车 AdasManager.getInstance().sendPlanningCmd(1);
mPresenter?.startStopSide()
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
}
tv_car_setting_opendoor.onClick {
// 开门 AdasManager.getInstance().sendRoboBusJinlvM1FrontDoorCmd(2);
mPresenter?.openDoor()
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
}
tv_car_setting_closedoor.onClick {
mPresenter?.closeDoor()
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
}
}
override fun createPresenter(): BusPassengerFunctionDevicePresenter =
BusPassengerFunctionDevicePresenter(this)
companion object {
const val TAG = "BusPassengerFunctionDeviceFragment"
@JvmStatic
fun newInstance(): M1DeviceFragment {
val args = Bundle()
val fragment = M1DeviceFragment()
fragment.arguments = args
return fragment
}
}
}

View File

@@ -1,72 +0,0 @@
package com.mogo.och.bus.passenger.ui
import android.os.Bundle
import android.view.View
import com.mogo.commons.mvp.MvpFragment
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.bean.TaxiPassengerVideoPlay
import com.mogo.och.bus.passenger.model.OrderStatusEnum
import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionOrderPresenter
import kotlinx.android.synthetic.m1.m1_order_fragment.*
/**
* @author: yangyakun
* @date: 2023/1/28
*/
class M1OrderFragment :
MvpFragment<M1OrderFragment?, BusPassengerFunctionOrderPresenter?>() {
private var changeCheck: M1ContainFragment.ChangeCheck?=null
override fun getLayoutId(): Int {
return R.layout.m1_order_fragment
}
override fun getTagName(): String {
return TAG
}
override fun initViews() {
lsv_line_site.setchangeCheck(this.changeCheck)
}
fun setViewByOrderStatus(currentStatus: OrderStatusEnum){
when (currentStatus) {
OrderStatusEnum.NoOrderUnuse -> {
// 无订单页面
m1_order_noorder.visibility = View.VISIBLE
m1_order_early_end.visibility = View.GONE
lsv_line_site.visibility = View.GONE
}
OrderStatusEnum.OrderNoLine -> {
// 选择线路页面
m1_order_noorder.visibility = View.GONE
m1_order_early_end.visibility = View.GONE
lsv_line_site.visibility = View.VISIBLE
}
OrderStatusEnum.OrdersWithLine -> {
// 选择线路页面
m1_order_noorder.visibility = View.GONE
m1_order_early_end.visibility = View.GONE
lsv_line_site.visibility = View.VISIBLE
}
}
}
override fun createPresenter(): BusPassengerFunctionOrderPresenter {
return BusPassengerFunctionOrderPresenter(this)
}
companion object {
const val TAG = "BusPassengerFunctionOrderFragment"
@JvmStatic
fun newInstance(changeCheck: M1ContainFragment.ChangeCheck): M1OrderFragment {
val args = Bundle()
val fragment = M1OrderFragment()
fragment.arguments = args
fragment.changeCheck = changeCheck
return fragment
}
}
}

View File

@@ -1,564 +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.bus.passenger.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.m1.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<LineInfoResponse.LineInfo>()
private val siteList = mutableListOf<SiteInfoResponse.SiteInfo>()
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<LineInfoListResponse> {
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<SiteInfoResponse> {
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("查询站点失败")
}
})
}
}

View File

@@ -1,38 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- 订单主页面 -->
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="0dp"
android:layout_height="0dp"
android:clickable="true"
android:background="@drawable/bus_p_function_setting_soft_b_shape"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="1031:500"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintWidth_percent="0.53698">
<com.mogo.och.bus.passenger.ui.view.LineSiteView
android:id="@+id/lsv_line_site"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<include
android:id="@+id/m1_order_early_end"
android:visibility="gone"
layout="@layout/m1_order_early_end"/>
<include
android:id="@+id/m1_order_noorder"
android:visibility="gone"
layout="@layout/m1_order_noorder"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -1,238 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
<!-- 选择线路和站点页面 -->
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_line_list"
android:layout_width="0dp"
android:layout_height="match_parent"
app:layout_constraintEnd_toStartOf="@+id/cl_side_list"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintWidth_percent="0.35887">
<TextView
android:id="@+id/tv_line_title"
android:text="浏览线路"
android:textSize="@dimen/dp_26"
android:textColor="@color/bus_p_m1_0f1e57"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginTop="@dimen/dp_40"
android:layout_marginStart="@dimen/dp_31"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_switch_line"
android:text="切换"
android:textSize="@dimen/dp_22"
android:textColor="@color/bus_p_m1_225eff"
app:layout_constraintTop_toTopOf="@+id/tv_line_title"
app:layout_constraintBottom_toBottomOf="@+id/tv_line_title"
app:layout_constraintEnd_toEndOf="parent"
android:paddingEnd="@dimen/dp_31"
android:paddingTop="@dimen/dp_10"
android:paddingBottom="@dimen/dp_10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:src="@drawable/m1_order_switch_line_enable"
android:id="@+id/iv_switch_line_left"
app:layout_constraintTop_toTopOf="@+id/tv_switch_line"
app:layout_constraintBottom_toBottomOf="@+id/tv_switch_line"
app:layout_constraintEnd_toStartOf="@+id/tv_switch_line"
android:layout_marginEnd="@dimen/dp_6"
android:layout_width="@dimen/dp_14"
android:layout_height="@dimen/dp_16"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rlv_line_list"
android:background="@drawable/m1_order_line_shape"
app:layout_constraintTop_toBottomOf="@+id/tv_line_title"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginTop="@dimen/dp_24"
android:layout_width="match_parent"
android:layout_height="0dp"/>
<ImageView
android:id="@+id/iv_line_cancle_submit_bg"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:src="@drawable/m1_line_cancle_submit_bg"
android:layout_width="@dimen/dp_275"
android:layout_height="@dimen/dp_60"/>
<TextView
android:id="@+id/tv_line_cancle"
android:text="取消"
android:textSize="@dimen/dp_20"
app:layout_constraintStart_toStartOf="@+id/iv_line_cancle_submit_bg"
app:layout_constraintTop_toTopOf="@+id/iv_line_cancle_submit_bg"
app:layout_constraintBottom_toBottomOf="@+id/iv_line_cancle_submit_bg"
app:layout_constraintEnd_toStartOf="@+id/gl_line_cancle_submit_guide"
android:textColor="@color/bus_p_m1_3b4056"
android:gravity="center"
android:layout_width="0dp"
android:layout_height="0dp"/>
<TextView
android:id="@+id/tv_line_submit"
android:text="确认"
android:textSize="@dimen/dp_20"
app:layout_constraintStart_toEndOf="@+id/gl_line_cancle_submit_guide"
app:layout_constraintEnd_toEndOf="@+id/iv_line_cancle_submit_bg"
app:layout_constraintTop_toTopOf="@+id/iv_line_cancle_submit_bg"
app:layout_constraintBottom_toBottomOf="@+id/iv_line_cancle_submit_bg"
android:textColor="@color/bus_p_m1_3b4056"
android:gravity="center"
android:layout_width="0dp"
android:layout_height="0dp"/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/gl_line_cancle_submit_guide"
app:layout_constraintGuide_percent="0.5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" />
<androidx.constraintlayout.widget.Group
android:id="@+id/g_line_submit_group"
app:constraint_referenced_ids="tv_line_submit,tv_line_cancle,iv_line_cancle_submit_bg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_side_list"
android:layout_width="0dp"
android:layout_height="match_parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/cl_line_list"
app:layout_constraintWidth_percent="0.64113">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_site_list"
android:paddingTop="@dimen/dp_20"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ImageView
android:id="@+id/iv_site_cancle_submit_bg"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:src="@drawable/m1_site_cancle_submit_bg"
android:layout_width="@dimen/dp_375"
android:layout_height="@dimen/dp_60"/>
<TextView
android:id="@+id/tv_site_cancle"
android:text="取消"
android:textSize="@dimen/dp_20"
app:layout_constraintStart_toStartOf="@+id/iv_site_cancle_submit_bg"
app:layout_constraintTop_toTopOf="@+id/iv_site_cancle_submit_bg"
app:layout_constraintBottom_toBottomOf="@+id/iv_site_cancle_submit_bg"
app:layout_constraintEnd_toStartOf="@+id/gl_site_cancle_submit_guide"
android:textColor="@color/bus_p_m1_3b4056"
android:gravity="center"
android:layout_width="0dp"
android:layout_height="0dp"/>
<TextView
android:id="@+id/tv_site_submit"
android:text="确认"
android:textSize="@dimen/dp_20"
android:gravity="center"
app:layout_constraintStart_toEndOf="@+id/gl_site_cancle_submit_guide"
app:layout_constraintEnd_toEndOf="@+id/iv_site_cancle_submit_bg"
app:layout_constraintTop_toTopOf="@+id/iv_site_cancle_submit_bg"
app:layout_constraintBottom_toBottomOf="@+id/iv_site_cancle_submit_bg"
android:textColor="@color/bus_p_m1_3b4056"
android:layout_width="0dp"
android:layout_height="0dp"/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/gl_site_cancle_submit_guide"
app:layout_constraintGuide_percent="0.5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" />
<androidx.constraintlayout.widget.Group
android:id="@+id/g_side_cancle_submit_group"
app:constraint_referenced_ids="tv_site_submit,tv_site_cancle,iv_site_cancle_submit_bg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:id="@+id/iv_site_submit_bg"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:src="@drawable/m1_site_submit_bg"
android:layout_width="@dimen/dp_258"
android:layout_height="@dimen/dp_60"/>
<TextView
android:id="@+id/tv_site_only_submit"
android:text="确认"
android:textSize="@dimen/dp_20"
android:gravity="center"
app:layout_constraintStart_toStartOf="@+id/iv_site_submit_bg"
app:layout_constraintEnd_toEndOf="@+id/iv_site_submit_bg"
app:layout_constraintTop_toTopOf="@+id/iv_site_submit_bg"
app:layout_constraintBottom_toBottomOf="@+id/iv_site_submit_bg"
android:textColor="@color/bus_p_m1_3b4056"
android:layout_width="0dp"
android:layout_height="0dp"/>
<androidx.constraintlayout.widget.Group
android:id="@+id/g_side_submit_group"
android:visibility="gone"
app:constraint_referenced_ids="tv_site_only_submit,iv_site_submit_bg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.Group
android:id="@+id/g_lines_sites_data"
app:constraint_referenced_ids="cl_line_list,cl_side_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:id="@+id/iv_loading_wait_driver"
android:src="@drawable/bus_p_loading"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.372"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="@dimen/dp_71"
android:layout_height="@dimen/dp_73"/>
<TextView
android:id="@+id/tv_loading_wait_driver_title"
app:layout_constraintStart_toStartOf="@+id/iv_loading_wait_driver"
app:layout_constraintEnd_toEndOf="@+id/iv_loading_wait_driver"
app:layout_constraintTop_toBottomOf="@+id/iv_loading_wait_driver"
android:layout_marginTop="63dp"
android:text="等待司机确认信息,请稍候…"
android:textSize="@dimen/dp_30"
android:textColor="@color/bus_p_m1_4a5375"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<androidx.constraintlayout.widget.Group
android:id="@+id/g_loading_group"
android:visibility="gone"
app:constraint_referenced_ids="iv_loading_wait_driver,tv_loading_wait_driver_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -3,7 +3,6 @@ package com.mogo.och.bus.passenger.model
import android.annotation.SuppressLint
import android.content.Context
import android.net.ConnectivityManager
import android.os.Build
import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.module.intent.IMogoIntentListener
import com.mogo.commons.module.intent.IntentManager
@@ -565,13 +564,11 @@ object CharterPassengerModel {
}
}
iDistanceTimeCallback?.setOrderTimeCallBack(-1)
iDistanceTimeCallback?.setDistancecAndTime(-1,-1)
}else{
iDistanceTimeCallback?.setOrderTimeCallBack(millisUntilFinished)
}
CallerLogger.d(
M_BUS_P + TAG,
"倒计时${millisUntilFinished}"
)
CallerLogger.d(M_BUS_P + TAG, "订单倒计时${millisUntilFinished}")
}
}
}
@@ -625,95 +622,55 @@ object CharterPassengerModel {
private fun calculateDistance() {
//mLocation gcj坐标
mLocationGCJ02?.let {
var lastSumLength = 0f
orderInfo?.let { order ->
// 启动轨迹计算
//当前站在轨迹中对应的点
val currentRouteIndex = CoordinateCalculateRouteUtil.getArrivedPointIndexNew(
0, mRoutePoints, it.longitude, it.latitude
)
var nextRouteIndex: Int = mRoutePoints.size - 1
var lastSumLength = 0f
val orderLonLat =
CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(
mContext,
order.wgs84Lon!!,
order.wgs84Lat!!
)
//要前往的站在轨迹中对应的点
nextRouteIndex = CoordinateCalculateRouteUtil.getArrivedPointIndexNew(
currentRouteIndex, mRoutePoints,
val mogoLocation = MogoLocation()
mogoLocation.longitude = orderLonLat.longitude
mogoLocation.latitude = orderLonLat.latitude
lastSumLength = CoordinateUtils.calculateLineDistance(
orderLonLat.longitude,
orderLonLat.latitude
orderLonLat.latitude,
mogoLocation.longitude,
mogoLocation.latitude
)
// 距离站点最近的轨迹点
val lastPoints = mRoutePoints.get(nextRouteIndex)
// 站点距离最近点的距离
val calculateLineDistance = CoordinateUtils.calculateLineDistance(
lastPoints.longitude, lastPoints.latitude,
orderLonLat.longitude, orderLonLat.latitude
)
if (currentRouteIndex < nextRouteIndex) {
// subList 是[) 需要的是[]
val subList = mRoutePoints.subList(currentRouteIndex, nextRouteIndex + 1)
// 轨迹点所有的距离
val middlePoingDistancee =
CoordinateCalculateRouteUtil.calculateRouteSumLength(subList)
// 需要加距离 和下一个轨迹点成钝角
if (nextRouteIndex + 1 < mRoutePoints.size) {
val lastPointsNext = mRoutePoints.get(nextRouteIndex + 1)
val degree = CoordinateCalculateRouteUtil.getDegree(
orderLonLat.longitude,orderLonLat.latitude,
lastPoints.longitude, lastPoints.latitude,
lastPointsNext.longitude, lastPointsNext.latitude,
if(lastSumLength>100) {
// 计算距离
lastSumLength =
CoordinateCalculateRouteUtil.calculateRouteSumLength(
mRoutePoints,
it,
mogoLocation
)
if (degree > 90) {
lastSumLength = middlePoingDistancee + calculateLineDistance
}
}
// 需要减距离 和上一个轨迹点成钝角
if (nextRouteIndex - 1 >= 0) {
val lastPointsPre = mRoutePoints.get(nextRouteIndex - 1)
val degree = CoordinateCalculateRouteUtil.getDegree(
orderLonLat.longitude,orderLonLat.latitude,
lastPoints.longitude, lastPoints.latitude,
lastPointsPre.longitude, lastPointsPre.latitude,
)
if (degree > 90) {
lastSumLength = middlePoingDistancee - calculateLineDistance
}
}
} else {
val lastPoints = mRoutePoints.get(nextRouteIndex)
lastSumLength = CoordinateUtils.calculateLineDistance(
lastPoints.longitude, lastPoints.latitude,
it.longitude, it.latitude
)
}
// 距离小于100m 直接计算当前位置距离站点的距离
if(lastSumLength<=100){
lastSumLength = CoordinateUtils.calculateLineDistance(
orderLonLat.longitude,
orderLonLat.latitude,
it.longitude,
it.latitude
val lastTime: Double = lastSumLength / it.gnssSpeed * 3.6 //秒
CallerLogger.d(M_BUS_P + "calculateDistance",
"---lastSumLength: " + lastSumLength + "----lastTime : " + lastTime
+ " thread = " + Thread.currentThread().name
)
if (lastSumLength < CharterPassengerConst.ARRIVE_AT_START_STATION_DISTANCE) {
CallerLogger.d(M_BUS_P + TAG,"小于15米到站2")
arriveDest()
return
}
if(order.arriveStatus==OrderInfoResponse.ARRIVING) {
iDistanceTimeCallback?.setDistancecAndTime(
lastSumLength.toLong(),
lastTime.toLong()
)
}else{
iDistanceTimeCallback?.setDistancecAndTime(-1, -1)
}
}
val lastTime: Double = lastSumLength / Charter_AVERAGE_SPEED * 3.6 //秒
CallerLogger.d(
SceneConstant.M_BUS_P + "calculateDistance",
"---lastSumLength: " + lastSumLength + "----lastTime : " + lastTime
+ " thread = " + Thread.currentThread().name
)
if (lastSumLength < CharterPassengerConst.ARRIVE_AT_START_STATION_DISTANCE) {
CallerLogger.d(SceneConstant.M_BUS_P + TAG,"小于15米到站2")
arriveDest()
}
iDistanceTimeCallback?.setDistancecAndTime(lastSumLength.toLong(), lastTime.toLong())
}
}
// endregion
@@ -870,7 +827,7 @@ object CharterPassengerModel {
// 结束路距计算
endCalculateDistanceLoop()
// 到站置距离位0
iDistanceTimeCallback?.setOrderTimeCallBack(-1)
iDistanceTimeCallback?.setDistancecAndTime(-1,-1)
}
}

View File

@@ -0,0 +1,21 @@
package com.mogo.och.bus.passenger.model
/**
* Created on 2022/08/19
*
*
* 0 初始状态,
* 10 已登录,
* 20 已登出,
*/
enum class OrderStatusEnum() {
Nothing(),
NoOrderUnuse(), //无订单车闲置 m1_order_noorder.xml 无订单页面
OrderNoLine(), //有订单无线路 m1_order_lineside 选择线路页面
OrdersWithLine(), //有订单有线路 m1_order_lineside 选择线路页面隐藏掉确定取消
NoOrderUse(),; //无订单车不闲置 m1_order_end.xml 开门关门页面
}
interface IOrderStatusChangeListener {
fun onStatusChange(currentStatus:OrderStatusEnum)
}

View File

@@ -4,7 +4,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P
import com.mogo.och.bus.passenger.bean.LoopInfo
import com.mogo.och.bus.passenger.constant.CharterPassengerConst
import com.mogo.och.bus.passenger.utils.RxUtils
import com.mogo.och.common.module.utils.RxUtils
import io.reactivex.Observable
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
@@ -71,6 +71,7 @@ object BusPassengerModelLoopManager {
loopInfo.function.invoke()
CallerLogger.d(TAG, "${aLong}正在执行方法${tag}")
}catch (e:Throwable){
e.printStackTrace()
CallerLogger.e(TAG,"$tag:--$e")
}
}

View File

@@ -4,7 +4,7 @@ import androidx.lifecycle.LifecycleOwner
import com.mogo.commons.mvp.IView
import com.mogo.commons.mvp.Presenter
import com.mogo.och.bus.passenger.model.CharterPassengerModel
import com.mogo.och.bus.passenger.utils.RxUtils
import com.mogo.och.common.module.utils.RxUtils
import io.reactivex.disposables.Disposable
abstract class BusBasePassengerFunctionDevicePresenter<V : IView?>(view: V) :

View File

@@ -0,0 +1,19 @@
package com.mogo.och.bus.passenger.presenter
import androidx.lifecycle.LifecycleOwner
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.bus.passenger.model.CharterPassengerModel
import com.mogo.och.bus.passenger.ui.M1CarUserNoOrderFragment
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorCallback
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorStatusManager
import io.reactivex.disposables.Disposable
class BusPassengerCarUseAndNoOrderPresenter(view: M1CarUserNoOrderFragment?) :
BusBasePassengerFunctionDevicePresenter<M1CarUserNoOrderFragment?>(view){
companion object {
private const val TAG = "BusPassengerFunctionPresenter"
}
}

View File

@@ -0,0 +1,29 @@
package com.mogo.och.bus.passenger.presenter
import androidx.lifecycle.LifecycleOwner
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.bus.passenger.model.CharterPassengerModel
import com.mogo.och.bus.passenger.ui.M1DeviceFragment
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorCallback
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorStatusManager
import io.reactivex.disposables.Disposable
class BusPassengerFunctionDevicePresenter(view: M1DeviceFragment?) :
BusBasePassengerFunctionDevicePresenter<M1DeviceFragment?>(view) {
companion object {
private const val TAG = "BusPassengerFunctionDevicePresenter"
}
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
}
}

View File

@@ -0,0 +1,452 @@
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<M1OrderFragment?>(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<SiteInfoResponse> {
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<LineInfoListResponse> {
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) {
super.onResume(owner)
mView?.setViewByOrderStatus(CharterPassengerModel.getCurrentOrderStatus())
}
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)
}
}
}
}
}

View File

@@ -7,12 +7,16 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.bus.passenger.ui.M1SoftFragment
import com.mogo.och.common.module.manager.OCHM1LightAirconditionDoorStatusManager
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorCallback
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorStatusManager
import com.mogo.och.common.module.manager.devicemanage.data.AirconditionStatus
import com.mogo.och.common.module.manager.devicemanage.data.HeaterStatue
import com.mogo.och.common.module.manager.devicemanage.data.LightStatus
import io.reactivex.disposables.Disposable
class BusPassengerFunctionSoftPresenter(view: M1SoftFragment?) :
BusBasePassengerFunctionDevicePresenter<M1SoftFragment?>(view),
OCHM1LightAirconditionDoorStatusManager.OCHM1LightAirconditionDoorCallback {
LightAirconditionDoorCallback {
companion object {
private const val TAG = "BusPassengerFunctionSoftPresenter"
}
@@ -26,23 +30,23 @@ class BusPassengerFunctionSoftPresenter(view: M1SoftFragment?) :
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
OCHM1LightAirconditionDoorStatusManager.addListener(TAG, this)
LightAirconditionDoorStatusManager.addListener(TAG, this)
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
OCHM1LightAirconditionDoorStatusManager.removeListener(TAG)
LightAirconditionDoorStatusManager.removeListener(TAG)
}
/**
* 空调状态变化
*/
override fun onAirconditionStatusCallback(heaterIsOpen: Boolean,airconditionStatus: OCHM1LightAirconditionDoorStatusManager.AirconditionStatus,isFirst: Boolean) {
override fun onAirconditionStatusCallback(heaterIsOpen: Boolean, airconditionStatus: AirconditionStatus, isFirst: Boolean) {
CallerLogger.d(SceneConstant.M_BUS_P + TAG,
"回写--空调开关:${OCHM1LightAirconditionDoorStatusManager.airconditionStatus.isOpen}" +
"空调温度:${OCHM1LightAirconditionDoorStatusManager.airconditionStatus.temperature}" +
"空调模式:${OCHM1LightAirconditionDoorStatusManager.airconditionStatus.pattert}" +
"空调风速:${OCHM1LightAirconditionDoorStatusManager.airconditionStatus.windSpeed}")
"回写--空调开关:${LightAirconditionDoorStatusManager.airconditionStatus.isOpen}" +
"空调温度:${LightAirconditionDoorStatusManager.airconditionStatus.temperature}" +
"空调模式:${LightAirconditionDoorStatusManager.airconditionStatus.pattert}" +
"空调风速:${LightAirconditionDoorStatusManager.airconditionStatus.windSpeed}")
UiThreadHandler.post {
if(airconditionStatus.isOpen){
mView?.setAirconditionHeaterView(
@@ -66,7 +70,7 @@ class BusPassengerFunctionSoftPresenter(view: M1SoftFragment?) :
/**
* 暖风机状态变化
*/
override fun onHeaterStatusCallback(airconditionIsOpen:Boolean,heaterStatue: OCHM1LightAirconditionDoorStatusManager.HeaterStatue,isFirst: Boolean) {
override fun onHeaterStatusCallback(airconditionIsOpen:Boolean, heaterStatue: HeaterStatue, isFirst: Boolean) {
CallerLogger.d(SceneConstant.M_BUS_P + TAG,
"回写--暖风机开关:${heaterStatue.isOpen}" +
"风速:${heaterStatue.windSpeed}")
@@ -93,7 +97,7 @@ class BusPassengerFunctionSoftPresenter(view: M1SoftFragment?) :
/**
* 灯状态变化
*/
override fun onLightTop1Callback(lightStatus: OCHM1LightAirconditionDoorStatusManager.LightStatus,isFirst: Boolean) {
override fun onLightTop1Callback(lightStatus: LightStatus, isFirst: Boolean) {
CallerLogger.d(SceneConstant.M_BUS_P + TAG,
"回写--顶灯1开关:${lightStatus.isOpenLight1}" +
"顶灯2开关:${lightStatus.isOpenLight2}" +
@@ -105,7 +109,7 @@ class BusPassengerFunctionSoftPresenter(view: M1SoftFragment?) :
/**
* 灯状态变化
*/
override fun onLightTop2Callback(lightStatus: OCHM1LightAirconditionDoorStatusManager.LightStatus,isFirst: Boolean) {
override fun onLightTop2Callback(lightStatus: LightStatus, isFirst: Boolean) {
CallerLogger.d(SceneConstant.M_BUS_P + TAG,
"回写--顶灯1开关:${lightStatus.isOpenLight1}" +
"顶灯2开关:${lightStatus.isOpenLight2}" +
@@ -118,7 +122,7 @@ class BusPassengerFunctionSoftPresenter(view: M1SoftFragment?) :
/**
* 灯状态变化
*/
override fun onLightAtmosphereCallback(lightStatus: OCHM1LightAirconditionDoorStatusManager.LightStatus,isFirst: Boolean) {
override fun onLightAtmosphereCallback(lightStatus: LightStatus, isFirst: Boolean) {
CallerLogger.d(SceneConstant.M_BUS_P + TAG,
"回写--顶灯1开关:${lightStatus.isOpenLight1}" +
"顶灯2开关:${lightStatus.isOpenLight2}" +
@@ -137,10 +141,10 @@ class BusPassengerFunctionSoftPresenter(view: M1SoftFragment?) :
CallerAutoPilotControlManager.sendRoboBusJinlvM1AirConditionerCmd(1,modeCmd,windSpeedCmd,temperatureCmd)
disposeSubscribe(airconditionDisposable)
airconditionDisposable = createSubscribe(10000){
if (!OCHM1LightAirconditionDoorStatusManager.airconditionStatus.isOpen&&
OCHM1LightAirconditionDoorStatusManager.airconditionStatus.windSpeed!=windSpeedCmd&&
OCHM1LightAirconditionDoorStatusManager.airconditionStatus.temperature!=temperatureCmd&&
OCHM1LightAirconditionDoorStatusManager.airconditionStatus.pattert!=modeCmd) {
if (!LightAirconditionDoorStatusManager.airconditionStatus.isOpen&&
LightAirconditionDoorStatusManager.airconditionStatus.windSpeed!=windSpeedCmd&&
LightAirconditionDoorStatusManager.airconditionStatus.temperature!=temperatureCmd&&
LightAirconditionDoorStatusManager.airconditionStatus.pattert!=modeCmd) {
ToastUtils.showShort("空调操作未生效,请稍后重试吧~")
}
}
@@ -150,7 +154,7 @@ class BusPassengerFunctionSoftPresenter(view: M1SoftFragment?) :
CallerAutoPilotControlManager.sendRoboBusJinlvM1AirConditionerCmd(2,modeCmd,windSpeedCmd,temperatureCmd)
disposeSubscribe(airconditionDisposable)
airconditionDisposable = createSubscribe(10000){
if (OCHM1LightAirconditionDoorStatusManager.airconditionStatus.isOpen) {
if (LightAirconditionDoorStatusManager.airconditionStatus.isOpen) {
ToastUtils.showShort("空调操作未生效,请稍后重试吧~")
}
}
@@ -163,8 +167,8 @@ class BusPassengerFunctionSoftPresenter(view: M1SoftFragment?) :
CallerAutoPilotControlManager.sendRoboBusJinlvM1HeaderCmd(1,windSpeedCmd)
disposeSubscribe(heaterDisposable)
heaterDisposable = createSubscribe(10000){
if (!OCHM1LightAirconditionDoorStatusManager.heaterStatue.isOpen&&
OCHM1LightAirconditionDoorStatusManager.heaterStatue.windSpeed!=windSpeedCmd) {
if (!LightAirconditionDoorStatusManager.heaterStatue.isOpen&&
LightAirconditionDoorStatusManager.heaterStatue.windSpeed!=windSpeedCmd) {
ToastUtils.showShort("暖风机操作未生效,请稍后重试吧~")
}
}
@@ -175,7 +179,7 @@ class BusPassengerFunctionSoftPresenter(view: M1SoftFragment?) :
CallerAutoPilotControlManager.sendRoboBusJinlvM1HeaderCmd(2,0)
disposeSubscribe(heaterDisposable)
heaterDisposable = createSubscribe(10000){
if (OCHM1LightAirconditionDoorStatusManager.heaterStatue.isOpen) {
if (LightAirconditionDoorStatusManager.heaterStatue.isOpen) {
ToastUtils.showShort("暖风机操作未生效,请稍后重试吧~")//还是开着的
}
}
@@ -187,14 +191,14 @@ class BusPassengerFunctionSoftPresenter(view: M1SoftFragment?) :
if(leftLight){
CallerAutoPilotControlManager.sendRoboBusJinlvM1MainLamp1Cmd(1)
subscribeLightTop1 = createSubscribe{
if (!OCHM1LightAirconditionDoorStatusManager.lightStatus.isOpenLight1) {
if (!LightAirconditionDoorStatusManager.lightStatus.isOpenLight1) {
ToastUtils.showShort("操作未生效,请稍后重试吧~")
}
}
}else{
CallerAutoPilotControlManager.sendRoboBusJinlvM1MainLamp1Cmd(2)
subscribeLightTop1 = createSubscribe{
if (OCHM1LightAirconditionDoorStatusManager.lightStatus.isOpenLight1) {
if (LightAirconditionDoorStatusManager.lightStatus.isOpenLight1) {
ToastUtils.showShort("操作未生效,请稍后重试吧~")
}
}
@@ -206,14 +210,14 @@ class BusPassengerFunctionSoftPresenter(view: M1SoftFragment?) :
if(rightLight){
CallerAutoPilotControlManager.sendRoboBusJinlvM1MainLamp2Cmd(1)
subscribeLightTop2 = createSubscribe{
if (!OCHM1LightAirconditionDoorStatusManager.lightStatus.isOpenLight2) {
if (!LightAirconditionDoorStatusManager.lightStatus.isOpenLight2) {
ToastUtils.showShort("操作未生效,请稍后重试吧~")
}
}
}else{
CallerAutoPilotControlManager.sendRoboBusJinlvM1MainLamp2Cmd(2)
subscribeLightTop2 = createSubscribe{
if (OCHM1LightAirconditionDoorStatusManager.lightStatus.isOpenLight2) {
if (LightAirconditionDoorStatusManager.lightStatus.isOpenLight2) {
ToastUtils.showShort("操作未生效,请稍后重试吧~")
}
}
@@ -225,14 +229,14 @@ class BusPassengerFunctionSoftPresenter(view: M1SoftFragment?) :
if (atmosphereLight) {
CallerAutoPilotControlManager.sendRoboBusJinlvM1SmallLampCmd(1)
subscribeLightAtmosphere = createSubscribe{
if (!OCHM1LightAirconditionDoorStatusManager.lightStatus.isOpenatmosphere) {
if (!LightAirconditionDoorStatusManager.lightStatus.isOpenatmosphere) {
ToastUtils.showShort("操作未生效,请稍后重试吧~")
}
}
} else {
CallerAutoPilotControlManager.sendRoboBusJinlvM1SmallLampCmd(2)
subscribeLightAtmosphere = createSubscribe{
if (OCHM1LightAirconditionDoorStatusManager.lightStatus.isOpenatmosphere) {
if (LightAirconditionDoorStatusManager.lightStatus.isOpenatmosphere) {
ToastUtils.showShort("操作未生效,请稍后重试吧~")
}
}

View File

@@ -3,7 +3,6 @@ package com.mogo.och.bus.passenger.presenter
import androidx.lifecycle.LifecycleOwner
import com.amap.api.maps.model.LatLng
import com.mogo.commons.voice.AIAssist
import com.mogo.eagle.core.data.map.MogoLocation
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.CallerAutoPilotControlManager
@@ -14,7 +13,6 @@ 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.response.OrderInfoResponse
import com.mogo.och.bus.passenger.callback.IBusPassengerControllerStatusCallback
import com.mogo.och.bus.passenger.callback.IOrderChangeCallback
import com.mogo.och.bus.passenger.callback.IDistanceTimeCallback
import com.mogo.och.bus.passenger.model.CharterPassengerModel
@@ -24,7 +22,7 @@ import com.mogo.och.bus.passenger.ui.MainFragment
import com.mogo.och.common.module.bean.dpmsg.DPMsgType
import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager
import com.mogo.och.common.module.biz.constant.OchCommonConst
import com.mogo.och.common.module.manager.OCHM1LightAirconditionDoorStatusManager
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorStatusManager
import com.mogo.och.common.module.manager.OCHPlanningStopSideStatusManager
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.common.module.utils.NumberFormatUtil
@@ -32,21 +30,19 @@ import com.mogo.och.common.module.utils.SoundPoolHelper
import com.mogo.och.common.module.voice.VoiceNotice
import com.mogo.och.common.module.bean.dpmsg.BaseDPMsg
import com.mogo.och.common.module.bean.dpmsg.DPCommonOperationMsg
import io.reactivex.disposables.Disposable
import java.util.*
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorCallback
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorManager
import kotlin.math.ceil
class BusPassengerPresenter(view: MainFragment?) :
BusBasePassengerFunctionDevicePresenter<MainFragment?>(view),
IBusPassengerControllerStatusCallback, IDistanceTimeCallback, IOrderChangeCallback,
IOrderStatusChangeListener, OCHPlanningStopSideStatusManager.OCHPlanningActionsCallback {
IDistanceTimeCallback, IOrderChangeCallback, IOrderStatusChangeListener,
OCHPlanningStopSideStatusManager.OCHPlanningActionsCallback, LightAirconditionDoorCallback {
private var subscribe: Disposable? = null
private var gnssSpeed = 0.0f
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
CharterPassengerModel.init()
// 定位监听
CharterPassengerModel.setControllerStatusCallback(TAG,this)
CharterPassengerModel.setiDistanceTimeCallback(this)
CharterPassengerModel.setCarTypeChangeListener(this)
CharterPassengerModel.setStatusChangeListener(TAG,this)
@@ -59,7 +55,6 @@ class BusPassengerPresenter(view: MainFragment?) :
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
CharterPassengerModel.setControllerStatusCallback(TAG,null)
CharterPassengerModel.setiDistanceTimeCallback(null)
CharterPassengerModel.setCarTypeChangeListener(null)
CallerTelematicListenerManager.removeListener(TAG)
@@ -71,9 +66,14 @@ class BusPassengerPresenter(view: MainFragment?) :
mView?.setSpeed(speedKM.toString())
}
}
private fun setDistanceAndTime(distance: String,distanceUnit: String){
private fun setDistanceAndTime(
distance: String,
distanceUnit: String,
leftTime: String,
arriveTime: String
) {
UiThreadHandler.post {
mView?.setDistanceAndTime(distance, distanceUnit)
mView?.setDistanceAndTime(distance, distanceUnit,leftTime,arriveTime)
}
}
private fun setOrderTime(sumTime:String,arrivedTime:String){
@@ -81,12 +81,6 @@ class BusPassengerPresenter(view: MainFragment?) :
mView?.setOrderTime(sumTime, arrivedTime)
}
}
override fun onCarLocationChanged(location: MogoLocation?) {
location?.let {
setSpeed(it.gnssSpeed)
gnssSpeed = it.gnssSpeed
}
}
val msgReceived = object : IReceivedMsgListener {
override fun onReceivedMsg(type: Int, byteArray: ByteArray) {
@@ -98,11 +92,11 @@ class BusPassengerPresenter(view: MainFragment?) :
) as BaseDPMsg
when (msg.type) {
DPMsgType.TYPE_OPEN_CLOSE_DOOR.type -> {
val doorStatus = OCHM1LightAirconditionDoorStatusManager.doorStatus
val doorStatus = LightAirconditionDoorStatusManager.doorStatus
if(doorStatus.isOpen){
closeDoor()
LightAirconditionDoorManager.go2OpenDoor(false)
}else{
openDoor()
LightAirconditionDoorManager.go2OpenDoor(true)
}
}
DPMsgType.TYPE_COMMON.type -> {
@@ -128,74 +122,37 @@ class BusPassengerPresenter(view: MainFragment?) :
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.m1_voice_di)
}
fun openDoor() {
val canOpenOrCloseDoor = canOpenOrCloseDoor()
if(!canOpenOrCloseDoor.isNullOrEmpty()){
ToastUtils.showShort(canOpenOrCloseDoor)
return
}
disposeSubscribe(subscribe)
subscribe = createSubscribe(1000) {
CallerAutoPilotControlManager.sendRoboBusJinlvM1FrontDoorCmd(0)
}
CallerAutoPilotControlManager.sendRoboBusJinlvM1FrontDoorCmd(1)
}
fun closeDoor() {
val canOpenOrCloseDoor = canOpenOrCloseDoor()
if(!canOpenOrCloseDoor.isNullOrBlank()){
ToastUtils.showShort(canOpenOrCloseDoor)
return
}
disposeSubscribe(subscribe)
subscribe = createSubscribe(1000) {
CallerAutoPilotControlManager.sendRoboBusJinlvM1FrontDoorCmd(0)
}
CallerAutoPilotControlManager.sendRoboBusJinlvM1FrontDoorCmd(2)
}
private fun canOpenOrCloseDoor():String?{
if(gnssSpeed<0.01){
return null
}else{
return "车辆正在运行、请稍后再试"
}
}
/**
* 计算剩余距离和剩余时间
*/
override fun setDistancecAndTime(meters: Long, timeInSecond: Long) {
if(meters<0&&timeInSecond<0){
setDistanceAndTime("--", context.getString(R.string.m1_distance_unit_km), "--", "--")
}
var dis: String? = "0"
var disUnit = "KM"
if (meters > 0) {
if (meters / 1000 < 1) {
disUnit = "M"
disUnit = context.getString(R.string.m1_distance_unit_m)
dis = Math.round(meters.toFloat()).toString()
} else {
disUnit = "KM"
disUnit = context.getString(R.string.m1_distance_unit_km)
dis = NumberFormatUtil.formatLong(meters.toDouble() / 1000)
}
}
setDistanceAndTime(dis.toString(),disUnit)
val time = ceil(timeInSecond / 60f).toInt()
val arriveTime = DateTimeUtil.getAfterSecondTime(time)
setDistanceAndTime(dis.toString(),disUnit,time.toString(),arriveTime)
}
override fun setOrderTimeCallBack(timeInSecond: Long) {
if(timeInSecond<0){
setDistanceAndTime("0", "KM")
setOrderTime("--","--")
return
}
var surplusTime = (timeInSecond / 60).toInt()
if(surplusTime==0){
surplusTime = 1
}
val beforeTime = Calendar.getInstance()
beforeTime.add(Calendar.SECOND, timeInSecond.toInt())
//到达时间
val arriveTime = DateTimeUtil.formatCalendarToString(beforeTime, DateTimeUtil.HH_mm)
setOrderTime(surplusTime.toString(),arriveTime)
val time = ceil(timeInSecond / 60f).toInt()
val arriveTime = DateTimeUtil.getAfterSecondTime(timeInSecond.toInt())
setOrderTime(time.toString(),arriveTime)
}
companion object{
@@ -251,7 +208,7 @@ class BusPassengerPresenter(view: MainFragment?) :
UiThreadHandler.post {
mView?.showOpenAndCloseDoor()
mView?.cleanEndStation()
setDistanceAndTime("0", "KM")
setDistancecAndTime(-1, -1)
setOrderTime("--","--")
}
}
@@ -290,4 +247,13 @@ class BusPassengerPresenter(view: MainFragment?) :
}
}
override fun onDoorStatusCallback(isOpen: Boolean, isFirst: Boolean) {
if (!isFirst) {
if (isOpen) {
ToastUtils.showShort("已开启车门")
} else {
ToastUtils.showShort("已关门车门")
}
}
}
}

View File

@@ -4,9 +4,7 @@ import android.os.Bundle
import android.util.Log
import android.view.View
import android.view.WindowManager
import android.widget.CompoundButton
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import com.mogo.commons.mvp.MvpDialogFragment
@@ -14,12 +12,10 @@ 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.Companion.M_BUS_P
import com.mogo.eagle.core.utilcode.util.BarUtils
import com.mogo.eagle.core.utilcode.util.SharedPrefs
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.presenter.BusPassengerCarUseAndNoOrderPresenter
import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionPresenter
import kotlinx.android.synthetic.m1.m1_contain_fragment.*
import kotlinx.android.synthetic.m1.m1_order_end.*
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorManager
import kotlinx.android.synthetic.main.m1_order_end.*
/**
* @author: yangyakun
@@ -45,10 +41,10 @@ class M1CarUserNoOrderFragment :
override fun initViews() {
dialog?.setCancelable(false)
iv_end_order_opendoor.onClick {
mPresenter?.openDoor()
LightAirconditionDoorManager.go2OpenDoor(true)
}
iv_end_order_closedoor.onClick {
mPresenter?.closeDoor()
LightAirconditionDoorManager.go2OpenDoor(false)
}
}

View File

@@ -16,7 +16,7 @@ import com.mogo.eagle.core.utilcode.util.BarUtils
import com.mogo.eagle.core.utilcode.util.SharedPrefs
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionPresenter
import kotlinx.android.synthetic.m1.m1_contain_fragment.*
import kotlinx.android.synthetic.main.m1_contain_fragment.*
/**
* @author: yangyakun

View File

@@ -0,0 +1,43 @@
package com.mogo.och.bus.passenger.ui
import android.os.Bundle
import com.mogo.commons.mvp.MvpFragment
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionDevicePresenter
import com.mogo.och.common.module.utils.SoundPoolHelper
import kotlinx.android.synthetic.main.m1_devices_fragment.*
/**
* @author: yangyakun
* @date: 2023/1/28
*/
class M1DeviceFragment :
MvpFragment<M1DeviceFragment?, BusPassengerFunctionDevicePresenter?>() {
override fun getLayoutId(): Int = R.layout.m1_devices_fragment
override fun getTagName(): String = TAG
override fun initViews() {
initListener()
}
private fun initListener() {
}
override fun createPresenter(): BusPassengerFunctionDevicePresenter =
BusPassengerFunctionDevicePresenter(this)
companion object {
const val TAG = "BusPassengerFunctionDeviceFragment"
@JvmStatic
fun newInstance(): M1DeviceFragment {
val args = Bundle()
val fragment = M1DeviceFragment()
fragment.arguments = args
return fragment
}
}
}

View File

@@ -5,7 +5,7 @@ import com.mogo.commons.mvp.MvpFragment
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionEarlyEndOrderPresenter
import kotlinx.android.synthetic.m1.m1_order_early_end.*
import kotlinx.android.synthetic.main.m1_order_early_end.*
/**
* @author: yangyakun

View File

@@ -0,0 +1,256 @@
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
* @date: 2023/1/28
*/
class M1OrderFragment :
MvpFragment<M1OrderFragment?, BusPassengerFunctionOrderPresenter?>() {
private var changeCheck: M1ContainFragment.ChangeCheck? = null
private lateinit var lineAdapter: OrderLineItemAdapter
private lateinit var siteAdapter: OrderSiteItemAdapter
val lineList = mutableListOf<LineInfoResponse.LineInfo>()
val siteList = mutableListOf<SiteInfoResponse.SiteInfo>()
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
}
override fun getTagName(): String {
return TAG
}
override fun initViews() {
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()
}
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 -> {
// 无订单页面
m1_order_noorder.visibility = View.VISIBLE
m1_order_early_end.visibility = View.GONE
lsv_line_site.visibility = View.GONE
}
OrderStatusEnum.OrderNoLine -> {
// 选择线路页面
m1_order_noorder.visibility = View.GONE
m1_order_early_end.visibility = View.GONE
lsv_line_site.visibility = View.VISIBLE
}
OrderStatusEnum.OrdersWithLine -> {
// 选择线路页面
m1_order_noorder.visibility = View.GONE
m1_order_early_end.visibility = View.GONE
lsv_line_site.visibility = View.VISIBLE
}
}
}
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<LineInfoResponse.LineInfo>) {
lineAdapter.setDataList(lineInfo)
}
fun siteAdapterSetData(siteInfo: List<SiteInfoResponse.SiteInfo>) {
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()
val fragment = M1OrderFragment()
fragment.arguments = args
fragment.changeCheck = changeCheck
return fragment
}
}
}

View File

@@ -16,9 +16,6 @@ import android.widget.SeekBar
import android.widget.SeekBar.OnSeekBarChangeListener
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearSnapHelper
import androidx.recyclerview.widget.SnapHelper
import com.mogo.commons.mvp.MvpFragment
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
@@ -30,6 +27,7 @@ import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.bean.Temperature
import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionSoftPresenter
import com.mogo.och.bus.passenger.ui.adapter.TemperatureAdapter
import com.mogo.och.bus.passenger.ui.layoutmanage.PagerCenterSnapHelper
import com.mogo.och.bus.passenger.view.HorizontalDecoration
import com.mogo.och.bus.passenger.view.PickerLayoutManager
import com.mogo.och.common.module.utils.SoundPoolHelper
@@ -37,7 +35,7 @@ import com.yangyakun.main.ui.loading.drawable.MineGradientDrawable
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import kotlinx.android.synthetic.m1.m1_soft_fragment.*
import kotlinx.android.synthetic.main.m1_soft_fragment.*
import me.jessyan.autosize.utils.AutoSizeUtils
import java.util.concurrent.TimeUnit
@@ -228,20 +226,34 @@ class M1SoftFragment :
}
}
val pickerLayoutManager =
PickerLayoutManager(requireContext(), PickerLayoutManager.HORIZONTAL, false)
PickerLayoutManager(
requireContext(),
PickerLayoutManager.HORIZONTAL,
false
)
pickerLayoutManager.isChangeAlpha = true
pickerLayoutManager.scaleDownBy = 0.29f
pickerLayoutManager.scaleDownDistance = 0.8f
val data = getData()
val adapter = TemperatureAdapter(requireContext(), data, rv_aircondition_temperature)
val snapHelper: SnapHelper = LinearSnapHelper()
val adapter = TemperatureAdapter(
requireContext(),
data,
rv_aircondition_temperature
)
val snapHelper = PagerCenterSnapHelper()
snapHelper.attachToRecyclerView(rv_aircondition_temperature)
rv_aircondition_temperature.layoutManager = pickerLayoutManager
rv_aircondition_temperature.adapter = adapter
HorizontalDecoration.distance = SharedPrefsMgr.getInstance(requireContext()).getInt(HorizontalDecoration.distancekey,0)
val space = AutoSizeUtils.dp2px(context, 22f)
rv_aircondition_temperature.addItemDecoration(HorizontalDecoration(space,data.size-1))
HorizontalDecoration.distance = SharedPrefsMgr.getInstance(requireContext()).getInt(
HorizontalDecoration.distancekey,0)
val space = AutoSizeUtils.dp2px(context, 15f)
rv_aircondition_temperature.addItemDecoration(
HorizontalDecoration(
space,
data.size - 1
)
)
pickerLayoutManager.setOnScrollStopListener { view ->
if (view is TextView) {
@@ -271,7 +283,7 @@ class M1SoftFragment :
}
}
private fun setCheckAir(adapter:TemperatureAdapter,tag:Temperature){
private fun setCheckAir(adapter: TemperatureAdapter, tag:Temperature){
adapter.setCheckIndex(tag.index)
currentTemperature = tag
if (rv_aircondition_temperature.tag == touchTag) {

View File

@@ -13,7 +13,7 @@ import com.mogo.och.bus.passenger.ui.layoutmanage.CarouselZoomPostLayoutListener
import com.mogo.och.bus.passenger.ui.layoutmanage.CenterScrollListener
import com.mogo.och.bus.passenger.view.ConsultVideoPlayer
import com.shuyu.gsyvideoplayer.video.base.GSYVideoView
import kotlinx.android.synthetic.m1.m1_video_fragment.*
import kotlinx.android.synthetic.main.m1_video_fragment.*
import kotlin.math.floor
/**
@@ -35,7 +35,11 @@ class M1VideoFragment :
override fun initViews() {
initConsultData()
val carouselLayoutManager = CarouselLayoutManager(CarouselLayoutManager.HORIZONTAL, true)
val carouselLayoutManager =
CarouselLayoutManager(
CarouselLayoutManager.HORIZONTAL,
true
)
carouselLayoutManager.setPostLayoutListener(CarouselZoomPostLayoutListener())
carouselLayoutManager.maxVisibleItems = 1
rvVideoPlaylist.addOnScrollListener(object : CenterScrollListener() {
@@ -81,7 +85,12 @@ class M1VideoFragment :
}
}
}
val recyclerVideoAdapter = RecyclerVideoAdapter(requireContext(), arrayListOf, rvVideoPlaylist)
val recyclerVideoAdapter =
RecyclerVideoAdapter(
requireContext(),
arrayListOf,
rvVideoPlaylist
)
recyclerVideoAdapter.setOnThumbImageClilckListener {
val (_: kotlin.Int, player) = getPlayer(carouselLayoutManager)
if (player is ConsultVideoPlayer) {

View File

@@ -27,7 +27,7 @@ import com.mogo.och.common.module.voice.VoiceManager
import com.mogo.och.bus.passenger.presenter.BusPassengerPresenter
import com.mogo.och.bus.passenger.utils.VoiceFocusManager
import com.mogo.och.common.module.biz.constant.LoginStatusManager
import kotlinx.android.synthetic.m1.m1_main_fragment.*
import kotlinx.android.synthetic.main.m1_main_fragment.*
import java.lang.ref.WeakReference
/**
@@ -143,16 +143,19 @@ class MainFragment :
fun setDistanceAndTime(
distance: String,
distanceUnit: String,
leftTime:String,
arriveTime:String
) {
tv_distance.text = distance
tv_distance_unit.text = "距离(${distanceUnit})"
tv_distance_surplus_time.text = leftTime
tv_distance_arrive_time.text = arriveTime
}
fun setOrderTime(
sumTime: String,
arrivedTime: String
) {
tv_distance_surplus_time.text = sumTime
tv_distance_arrive_time.text = arrivedTime
}
fun setCarModle(rawInfo: Int){

View File

@@ -0,0 +1,81 @@
package com.mogo.och.bus.passenger.ui.layoutmanage
import android.view.View
import androidx.recyclerview.widget.OrientationHelper
import androidx.recyclerview.widget.PagerSnapHelper
import androidx.recyclerview.widget.RecyclerView
class PagerCenterSnapHelper : PagerSnapHelper() {
private var mHorizontalHelper: OrientationHelper? = null
private var pageScollListener: PageScollListener? = null
override fun findSnapView(layoutManager: RecyclerView.LayoutManager): View? {
if (layoutManager.canScrollVertically()) {
return super.findSnapView(layoutManager)
} else if (layoutManager.canScrollHorizontally()) {
return findCenterView(layoutManager, getHorizontalHelper(layoutManager))
}
return null
}
private fun findCenterView(
layoutManager: RecyclerView.LayoutManager,
helper: OrientationHelper
): View? {
val childCount = layoutManager.childCount
if (childCount == 0) {
return null
}
var closestChild: View? = null
val center = helper.startAfterPadding + helper.totalSpace / 2
var absClosest = Int.MAX_VALUE
for (i in 0 until childCount) {
val child = layoutManager.getChildAt(i)
val params = child!!.layoutParams as RecyclerView.LayoutParams
var childCenter = 0
childCenter = if (i == 0) {
helper.getDecoratedStart(child) + helper.getDecoratedMeasurement(child) - layoutManager.getDecoratedMeasuredWidth(
child
) / 2 - params.rightMargin / 2
} else if (i == childCount - 1) {
(helper.getDecoratedStart(child)
+ (helper.getDecoratedMeasurement(child) - layoutManager.getDecoratedMeasuredWidth(
child
) / 2 - params.leftMargin / 2 - params.rightMargin))
} else {
helper.getDecoratedStart(child) + helper.getDecoratedMeasurement(child) / 2
}
val absDistance = Math.abs(childCenter - center)
/* if child center is closer than previous closest, set it as closest */if (absDistance < absClosest) {
absClosest = absDistance
closestChild = child
}
}
if (pageScollListener != null) {
if (closestChild != null) {
pageScollListener!!.onPageSelected(layoutManager.getPosition(closestChild))
}
}
return closestChild
}
private fun getHorizontalHelper(
layoutManager: RecyclerView.LayoutManager
): OrientationHelper {
if (mHorizontalHelper == null || mHorizontalHelper!!.layoutManager !== layoutManager) {
mHorizontalHelper = OrientationHelper.createHorizontalHelper(layoutManager)
}
return mHorizontalHelper!!
}
fun setPageScollListener(pageScollListener: PageScollListener?) {
this.pageScollListener = pageScollListener
}
interface PageScollListener {
fun onPageSelected(i: Int)
}
companion object {
private const val TAG = "PagerSnapHelper "
}
}

View File

@@ -0,0 +1,32 @@
package com.mogo.och.bus.passenger.ui.view.door
import android.content.Context
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatTextView
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.bus.passenger.R
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorManager
import com.mogo.och.common.module.utils.RxUtils
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorStatusManager
import com.mogo.och.common.module.utils.SoundPoolHelper
import io.reactivex.disposables.Disposable
class CloseDoorView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : AppCompatTextView(context, attrs, defStyleAttr) {
init {
setOnClickListener {
go2OpenDoor()
}
}
private fun go2OpenDoor(){
LightAirconditionDoorManager.go2OpenDoor(false)
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
}
}

View File

@@ -0,0 +1,27 @@
package com.mogo.och.bus.passenger.ui.view.door
import android.content.Context
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatTextView
import com.mogo.och.bus.passenger.R
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorManager
import com.mogo.och.common.module.utils.SoundPoolHelper
class OpenDoorView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : AppCompatTextView(context, attrs, defStyleAttr) {
init {
setOnClickListener {
go2OpenDoor()
}
}
private fun go2OpenDoor(){
LightAirconditionDoorManager.go2OpenDoor(true)
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
}
}

View File

@@ -0,0 +1,50 @@
package com.mogo.och.bus.passenger.ui.view.stopsite
import android.content.Context
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatTextView
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.bus.passenger.R
import com.mogo.och.bus.passenger.model.CharterPassengerModel
import com.mogo.och.common.module.utils.SoundPoolHelper
class GoView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : AppCompatTextView(context, attrs, defStyleAttr) {
init {
setOnClickListener {
startGo()
}
}
private fun startGo(){
when (CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state) {
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> {// 不可自动驾驶
ToastUtils.showShort("设备未就绪请稍等")
}
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE -> {//
ToastUtils.showShort("启动自动驾驶中")
CallerAutoPilotControlManager.sendPlanningCmd(2)
CharterPassengerModel.startAutopilot()
CharterPassengerModel.leaveStation()
CharterPassengerModel.sendTripInfo()
}
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> {
// 重新起步
CallerAutoPilotControlManager.sendPlanningCmd(2)
CharterPassengerModel.leaveStation()
}
IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING -> {
ToastUtils.showShort("因车辆正在平行驾驶中无法靠边停车,请稍后再试")
}
else -> {}
}
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
}
}

View File

@@ -0,0 +1,44 @@
package com.mogo.och.bus.passenger.ui.view.stopsite
import android.content.Context
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatTextView
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.bus.passenger.R
import com.mogo.och.common.module.utils.SoundPoolHelper
class StopSiteView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : AppCompatTextView(context, attrs, defStyleAttr) {
init {
setOnClickListener {
stopSite()
}
}
private fun stopSite(){
when (CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state) {
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> {// 不可自动驾驶
ToastUtils.showShort("设备未就绪请稍等,请稍后再试")
}
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE -> {//
ToastUtils.showShort("因车辆正在人工驾驶中无法靠边停车,请稍后再试")
}
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> {
// 靠边停车
CallerAutoPilotControlManager.sendPlanningCmd(1)
}
IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING -> {
ToastUtils.showShort("因车辆正在平行驾驶中无法靠边停车,请稍后再试")
}
else -> {}
}
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
}
}

View File

@@ -6,10 +6,6 @@ import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr;
import com.mogo.och.bus.passenger.ui.adapter.TemperatureAdapter;
public class BottomDecoration extends RecyclerView.ItemDecoration {
/**
* 第一个视图和最后一个视图偏移的距离

View File

@@ -6,7 +6,7 @@ import android.view.LayoutInflater
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener
import com.mogo.eagle.core.function.hmi.ui.widget.BlueToothView
import com.mogo.och.bus.passenger.R
import kotlinx.android.synthetic.m1.m1_statusview_blue_tooth.view.*
import kotlinx.android.synthetic.main.m1_statusview_blue_tooth.view.*
/**
* 魔戒蓝牙控件

View File

@@ -20,7 +20,7 @@ import com.mogo.eagle.core.function.hmi.ui.widget.DemoModeView
import com.mogo.eagle.core.utilcode.util.ClickUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.bus.passenger.R
import kotlinx.android.synthetic.m1.m1_statusview_datetime.view.*
import kotlinx.android.synthetic.main.m1_statusview_datetime.view.*
import me.jessyan.autosize.utils.AutoSizeUtils
import kotlin.math.roundToInt

Some files were not shown because too many files have changed in this diff Show More