[fea]
[runningtask]
This commit is contained in:
yangyakun
2024-09-14 16:12:11 +08:00
parent 5b08428b18
commit c995645c69
25 changed files with 611 additions and 1266 deletions

View File

@@ -7,6 +7,7 @@ import android.os.Message
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.mogo.logger.scene.SceneConstant.Companion.M_BUS_P
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.och.common.module.utils.RxUtils
import io.reactivex.Observable
import io.reactivex.Observer
@@ -130,4 +131,14 @@ object BizLoopManager {
handler.removeCallbacks(function)
}
fun runInMainThread(function: Runnable){
if (ThreadUtils.isMainThread()) {
function.run()
}else{
ThreadUtils.runOnUiThread({
function.run()
},ThreadUtils.MODE.QUEUE)
}
}
}

View File

@@ -6,7 +6,6 @@ import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.och.weaknet.fragment.ShuttleFragment
import com.mogo.och.common.module.constant.OchCommonConst
import com.mogo.och.common.module.biz.provider.CommonServiceImpl
import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutopilotAnalytics
@@ -14,6 +13,7 @@ import com.mogo.och.weaknet.database.repository.EventRepository
import com.mogo.och.weaknet.database.repository.LineRepository
import com.mogo.och.weaknet.database.repository.TaskRepository
import com.mogo.och.weaknet.database.repository.TaskSiteRepository
import com.mogo.och.weaknet.fragment.ShuttleFragment
import com.mogo.och.weaknet.model.BusLineModel
import com.mogo.och.weaknet.util.BusAnalyticsManager

View File

@@ -25,8 +25,4 @@ public interface IBusADASStatusCallback {
* 结束清理一遍、选择任务后清理一遍
*/
void clearBusStationsMarkers();
void updateEmptyUi();
void hideSlidePanel();
}

View File

@@ -26,4 +26,12 @@ public interface IBusLinesCallback {
default void onNoRunningTask(){}
default void onRunningTask(){}
default void onLeaveStaionSuccess(){}
default void onLeaveStaionFail(){}
default void onArriveStationSuccess(){}
default void onCompleteTask(){}
}

View File

@@ -1,511 +0,0 @@
package com.mogo.och.weaknet.fragment
import android.animation.ObjectAnimator
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.LinearInterpolator
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.constraintlayout.widget.Group
import androidx.core.content.ContextCompat
import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.mvp.IView
import com.mogo.commons.mvp.MvpFragment
import com.mogo.commons.mvp.Presenter
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.config.HdMapBuildConfig
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.isCanStartAutopilot
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getState
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager.attachAutopilotBeforeLaunchView
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getMapUIController
import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxBubbleView
import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxButtonView
import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxListView
import com.mogo.eagle.core.function.smp.view.SmallMapView
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isB1
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isB2
import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.map.MogoMap
import com.mogo.och.common.module.utils.ResourcesUtils
import com.mogo.och.common.module.utils.ResourcesUtils.getColor
import com.mogo.och.common.module.utils.SoundPoolHelper
import com.mogo.och.common.module.wigets.SlidePanelView
import com.mogo.och.shuttle.weaknet.R
import com.mogo.och.weaknet.constant.BusConst
import com.mogo.och.weaknet.view.BizMapView
import org.greenrobot.eventbus.EventBus
/**
* 网约车基础Fragment主要负责布局通用界面处理站点面板和通话面板互斥情况
*
*
* 部分业务放在了此处处理
*
* @author tongchenfei
*/
abstract class BaseShuttleTabFragment<V : IView?, P : Presenter<V>?> : MvpFragment<V, P>() {
protected var slidePanelView: SlidePanelView? = null
private var ctvAutopilotStatus: RelativeLayout? = null
private var ctvAutopilotStatusIv: ImageView? = null
private var ctvAutopilotStatusTv: TextView? = null
protected var tvArrived: TextView? = null
private var flStationPanelContainer: FrameLayout? = null
private var mapBizView: BizMapView? = null
private var groupTestPanel: Group? = null
protected var smallMapView: SmallMapView? = null
//消息盒子
private var viewDriverMsgBoxButton: DriverMsgBoxButtonView? = null
private var viewDriverMsgBoxList: DriverMsgBoxListView? = null
private var viewDriverMsgBoxBubble: DriverMsgBoxBubbleView? = null
private var autopilotLoadingAnimator: ObjectAnimator? = null
var isAnimateRunning: Boolean = false
/**
* 滑动按钮触发的事件
*/
private val onSlideToEndListener = SlidePanelView.OnSlidePanelMoveToEndListener {
// 此处做一个代理,处理一下共有情况
if (slidePanelOnEndListener() != null) {
slidePanelOnEndListener()!!.moveToEnd()
}
}
override fun getLayoutId(): Int {
return R.layout.shuttle_weak_base_fragment
}
override fun initViews() {
mapBizView = findViewById(R.id.mapBizView)
groupTestPanel = findViewById(R.id.groupTestPanel)
slidePanelView = findViewById(R.id.module_mogo_och_slide_panel)
ctvAutopilotStatus = findViewById(R.id.module_mogo_och_autopilot_status)
ctvAutopilotStatusIv = findViewById(R.id.bus_autopilot_btn_iv)
ctvAutopilotStatusTv = findViewById(R.id.bus_autopolot_btn_tv)
flStationPanelContainer = findViewById(R.id.module_mogo_och_station_panel_container)
tvArrived = findViewById(R.id.module_mogo_och_arrived_tv)
val flSpeed = findViewById<FrameLayout>(R.id.fl_speed)
if (flSpeed != null) {
attachAutopilotBeforeLaunchView(flSpeed.context, flSpeed)
}
LayoutInflater.from(context).inflate(stationPanelViewId(), flStationPanelContainer)
slidePanelView!!.setOnSlidePanelMoveToEndListener(onSlideToEndListener)
updateSwitchMapIcon()
initListener()
setAutopilotBtnStatus(
getState(),
isCanStartAutopilot(false, 0)
)
ctvAutopilotStatus!!.setOnClickListener(object : OnPreventFastClickListener() {
override fun onClickImpl(v: View) {
restartAutopilot()
}
})
// 模拟 不可自动驾驶目前场景是刚开机adas还未和工控机连接
findViewById<View>(R.id.btnAutopilotDisable)!!.setOnClickListener { view: View? ->
debugAutoPilotStatus(
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE
)
}
// 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态
findViewById<View>(R.id.btnAutopilotEnable)!!.setOnClickListener { view: View? ->
debugAutoPilotStatus(
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE
)
}
// 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人
findViewById<View>(R.id.btnAutopilotRunning)!!.setOnClickListener { view: View? ->
debugAutoPilotStatus(
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
)
}
findViewById<View>(R.id.btnAutopilotPingxing)!!.setOnClickListener { view: View? ->
debugAutoPilotStatus(
IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING
)
}
// 模拟 自动驾驶网约车回调数据
findViewById<View>(R.id.btnAutopilotArrive)!!.setOnClickListener { view: View? -> debugArrivedStation() }
tvArrived!!.setOnClickListener { view: View? ->
onArriveStation()
}
//消息盒子
viewDriverMsgBoxButton = findViewById(R.id.viewDriverMsgBoxButton)
viewDriverMsgBoxList = findViewById(R.id.viewDriverMsgBoxList)
viewDriverMsgBoxBubble = findViewById(R.id.viewDriverMsgBoxBubble)
viewDriverMsgBoxButton!!.setClickListener(object :DriverMsgBoxButtonView.ClickListener {
override fun showMsgBoxList(show: Boolean) {
if (show) {
viewDriverMsgBoxList!!.visibility = View.VISIBLE
viewDriverMsgBoxList!!.notifyData()
viewDriverMsgBoxBubble!!.visibility = View.GONE
viewDriverMsgBoxBubble!!.isShowData(false)
} else {
viewDriverMsgBoxList!!.visibility = View.GONE
viewDriverMsgBoxBubble!!.visibility = View.VISIBLE
viewDriverMsgBoxBubble!!.isShowData(true)
}
}
})
smallMapView = findViewById(R.id.smallMapView)
}
override fun initViews(savedInstanceState: Bundle?) {
super.initViews(savedInstanceState)
mapBizView!!.onCreate(savedInstanceState)
smallMapView!!.onCreateView(savedInstanceState)
}
override fun onResume() {
super.onResume()
mapBizView!!.onResume()
smallMapView!!.onResume()
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
EventBus.getDefault().register(this)
return super.onCreateView(inflater, container, savedInstanceState)
}
protected abstract fun onArriveStation()
private fun updateSwitchMapIcon() {
val mapUIController = getMapUIController(MogoMap.DEFAULT)
if (mapUIController != null) {
if (isB2(FunctionBuildConfig.appIdentityMode)) {
mapUIController.changeCurrentIcon(R.raw.m2)
HdMapBuildConfig.currentCarVrIconRes = R.raw.m2
} else if (isB1(FunctionBuildConfig.appIdentityMode)) {
mapUIController.changeCurrentIcon(R.raw.xiaoba)
HdMapBuildConfig.currentCarVrIconRes = R.raw.xiaoba
}
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
mapBizView!!.onSaveInstanceState(outState)
}
override fun onLowMemory() {
super.onLowMemory()
mapBizView!!.onLowMemory()
}
override fun onPause() {
super.onPause()
mapBizView!!.onPause()
smallMapView!!.onPause()
}
override fun onDestroyView() {
mapBizView!!.onDestroy()
if (smallMapView != null) {
smallMapView!!.onDestroy()
}
super.onDestroyView()
CallerAutopilotRecordListenerManager.removeListener(TAG)
EventBus.getDefault().unregister(this)
}
/**
* 测试到站
*/
protected abstract fun debugArrivedStation()
private fun initListener() {
}
/**
* 展示滑动按钮
*
* @param text 指定的文字
*/
fun showSlidePanel(text: String?) {
UiThreadHandler.post({
slidePanelView!!.setText(text)
slidePanelView!!.visibility = View.VISIBLE
}, UiThreadHandler.MODE.QUEUE)
setArrivedClikable(false)
}
/**
* 设置进站按钮状态
*
* @param isClickable
*/
fun setArrivedClikable(isClickable: Boolean) {
UiThreadHandler.post({
tvArrived!!.isEnabled = isClickable
if (isClickable) {
tvArrived!!.setTextColor(
ContextCompat.getColor(
AbsMogoApplication.getApp(),
R.color.bus_white
)
)
} else {
tvArrived!!.setTextColor(
ContextCompat.getColor(
AbsMogoApplication.getApp(),
R.color.bus_arrived_btn_un_clickable_color
)
)
}
}, UiThreadHandler.MODE.QUEUE)
}
/**
* 隐藏滑动按钮
*/
fun hideSlidePanel() {
UiThreadHandler.post(
{ slidePanelView!!.visibility = View.GONE },
UiThreadHandler.MODE.QUEUE
)
}
fun playDI() {
SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di)
}
/**
* 改变自动驾驶状态
*
* @param autopilotStatus 0:不可用 1:可用状态 2:自动驾驶中
*/
fun onAutopilotStatusChanged(autopilotStatus: Int, canStartAuto: Boolean) {
UiThreadHandler.post({
changeAutopilotBtnView(
autopilotStatus,
isAnimateRunning,
canStartAuto
)
}, UiThreadHandler.MODE.QUEUE)
}
fun setAutopilotBtnStatus(autopilotStatus: Int, canStartAuto: Boolean) {
if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE == autopilotStatus) { //0不可用
ctvAutopilotStatusTv!!.setTextColor(getColor(R.color.bus_autopilot_text_color_disable))
ctvAutopilotStatusTv!!.text =
ResourcesUtils.getString(R.string.bus_loading_autopilot_runnig_tv)
ctvAutopilotStatusIv!!.setImageResource(R.drawable.bus_disable_autopilot_icon)
ctvAutopilotStatus!!.isClickable = true
ctvAutopilotStatus!!.setBackgroundResource(R.drawable.common_autopilot_start_fail)
} else {
ctvAutopilotStatusTv!!.setTextColor(
AbsMogoApplication.getApp().getColor(R.color.bus_autopilot_text_color_normal)
)
ctvAutopilotStatusIv!!.setImageResource(R.drawable.bus_ic_autopilot)
if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == autopilotStatus) { //1可用
ctvAutopilotStatusTv!!.text =
ResourcesUtils.getString(R.string.bus_loading_autopilot_runnig_tv)
if (canStartAuto) {
ctvAutopilotStatus!!.isClickable = true
ctvAutopilotStatus!!.setBackgroundResource(R.drawable.common_autopilot_press)
} else {
ctvAutopilotStatusTv!!.setTextColor(getColor(R.color.bus_autopilot_text_color_disable))
ctvAutopilotStatusIv!!.setImageResource(R.drawable.bus_disable_autopilot_icon)
ctvAutopilotStatus!!.isClickable = true
ctvAutopilotStatus!!.setBackgroundResource(R.drawable.common_autopilot_start_fail)
}
} else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == autopilotStatus) {
ctvAutopilotStatusTv!!.setText(R.string.bus_loading_autopilot_runnig_tv)
ctvAutopilotStatus!!.isClickable = true
ctvAutopilotStatus!!.setBackgroundResource(R.drawable.common_autopilot_in_autopilot)
} else if (IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING
== autopilotStatus
) {
ctvAutopilotStatusTv!!.setText(R.string.bus_pingxing_driver)
ctvAutopilotStatus!!.isClickable = false
ctvAutopilotStatus!!.setBackgroundResource(R.drawable.common_autopilot_pxjs)
}
}
}
fun updateAutopilotStatus(autopilotStatus: Int) {
if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
== autopilotStatus
) { //2 running
ctvAutopilotStatusIv!!.setImageResource(R.drawable.bus_right_autopilot_icon)
ctvAutopilotStatusTv!!.setTextColor(getColor(R.color.bus_autopilot_text_color_normal))
ctvAutopilotStatusTv!!.text =
ResourcesUtils.getString(R.string.bus_loading_autopilot_success_tv)
// ctvAutopilotStatus.setSelected(false);
ctvAutopilotStatus!!.isClickable = false
} else {
ctvAutopilotStatusIv!!.setImageResource(R.drawable.bus_wrong_autopilot_icon)
ctvAutopilotStatusTv!!.setTextColor(getColor(R.color.bus_autopilot_text_color_normal))
ctvAutopilotStatusTv!!.text =
ResourcesUtils.getString(R.string.bus_loading_autopilot_failure_tv)
ctvAutopilotStatus!!.isClickable = false
// ctvAutopilotStatus.setSelected(false);
}
UiThreadHandler.postDelayed({
setAutopilotBtnStatus(
autopilotStatus,
isCanStartAutopilot(false, 0)
)
}, 1000)
}
private fun changeAutopilotBtnView(
autopilotStatus: Int,
isAnimateRunning: Boolean,
canStartAuto: Boolean
) {
if (isAnimateRunning && (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
!= autopilotStatus)
) {
// 主动开启自动驾驶中不为2为0、1则继续loading
return
}
if (isAnimateRunning) {
stopAnimAndUpdateBtnStatus()
} else {
setAutopilotBtnStatus(autopilotStatus, canStartAuto)
}
}
fun stopAnimAndUpdateBtnStatus() {
stopAutopilotAnimation()
updateAutopilotStatus(getState())
}
/**
* 隐藏【自动驾驶】按钮
*/
fun hideAutopilotBiz() {
}
/**
* 展示【自动驾驶】按钮
*/
fun showAutopilotBiz() {
}
abstract fun slidePanelOnEndListener(): SlidePanelView.OnSlidePanelMoveToEndListener?
/**
* 获取站点面板view在[.initViews]时候添加到container中
*
* @return 站点面板view
*/
abstract fun stationPanelViewId(): Int
/**
* 重新开启自动驾驶
*/
abstract fun restartAutopilot()
/**
* 模拟自动驾驶返回状态
*
* @param status
*/
abstract fun debugAutoPilotStatus(status: Int)
/**
* 开启自动驾驶中间动画
*/
fun startAutopilotAnimation() {
isAnimateRunning = true
ctvAutopilotStatusTv!!.text =
ResourcesUtils.getString(R.string.bus_loading_autopilot_tv)
ctvAutopilotStatusTv!!.setTextColor(getColor(R.color.bus_autopilot_text_color_normal))
ctvAutopilotStatus!!.isClickable = true
ctvAutopilotStatusIv!!.setImageResource(R.drawable.bus_loading_autopilot_icon)
if (autopilotLoadingAnimator == null) {
autopilotLoadingAnimator = ObjectAnimator.ofFloat(ctvAutopilotStatusIv!!, "rotation", 0f, 360f)
autopilotLoadingAnimator?.interpolator = LinearInterpolator()
autopilotLoadingAnimator?.repeatCount = -1 //无限循环
autopilotLoadingAnimator?.setDuration(1000) //设置持续时间
}
autopilotLoadingAnimator!!.start() //动画开始
startingAutoApilotCountDown()
}
private fun startingAutoApilotCountDown() {
//10s 若自动驾驶没有开启,则结束动画
UiThreadHandler.postDelayed({
//未启动成功做处理
if (isAnimateRunning) { // 只判断动画是否在进行,根据自动驾驶当前状态去设置自动驾驶状态
stopAutopilotAnimation()
updateAutopilotStatus(getState())
}
}, BusConst.TIMER_START_AUTOPILOT_INTERVAL)
}
/**
* 停止自动驾驶中间动画
*/
protected fun stopAutopilotAnimation() {
if (autopilotLoadingAnimator != null) {
autopilotLoadingAnimator!!.end()
ctvAutopilotStatusIv!!.clearAnimation()
autopilotLoadingAnimator = null
isAnimateRunning = false
}
}
// /**
// * 迈速表实时更新
// *
// * @param newSpeed
// */
// public void updateSpeedView(float newSpeed) {
// int speed = (int) (Math.abs(newSpeed) * 3.6F); // 倒车时工控机反馈定位信息中speed为负值
// if (mTrafficDataView != null) {
// mTrafficDataView.updateSpeedWithValue(speed);
// }
// }
override fun onDestroy() {
super.onDestroy()
}
/**
* bus调试面板打开关闭
*/
fun debugTestBar() {
if (groupTestPanel!!.visibility == View.VISIBLE) {
groupTestPanel!!.visibility = View.GONE
} else {
groupTestPanel!!.visibility = View.VISIBLE
}
}
/**
* END
*/
companion object {
private const val TAG = "BaseBusTabFragment"
}
}

View File

@@ -1,104 +1,323 @@
package com.mogo.och.weaknet.fragment
import android.animation.ObjectAnimator
import android.graphics.BitmapFactory
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.LinearInterpolator
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.Group
import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.mvp.MvpFragment
import com.mogo.commons.storage.SharedPrefsMgr
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.config.HdMapBuildConfig
import com.mogo.eagle.core.data.temp.EventLogout
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.isCanStartAutopilot
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getState
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager.attachAutopilotBeforeLaunchView
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getMapUIController
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getOverlayManager
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isB1
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isB2
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.map.MogoMap
import com.mogo.map.overlay.core.Level
import com.mogo.map.overlay.point.Point
import com.mogo.och.common.module.utils.BlinkAnimationUtil
import com.mogo.och.common.module.utils.OCHThreadPoolManager
import com.mogo.och.common.module.utils.ResourcesUtils
import com.mogo.och.common.module.utils.ResourcesUtils.getColor
import com.mogo.och.common.module.utils.createQRCodeWithPicture
import com.mogo.och.common.module.wigets.BindQRCodeDialog
import com.mogo.och.common.module.wigets.MarqueeTextView
import com.mogo.och.common.module.wigets.OCHCommitDialog
import com.mogo.och.common.module.wigets.SlidePanelView
import com.mogo.och.data.bean.BusStationBean
import com.mogo.och.shuttle.weaknet.R
import com.mogo.och.weaknet.constant.BusConst
import com.mogo.och.weaknet.presenter.BusPresenter
import com.mogo.och.weaknet.ui.BusStationCommonItem
import com.mogo.och.weaknet.ui.taskrunned.RunningTaskManager
import com.mogo.och.weaknet.view.BizMapView
import me.jessyan.autosize.utils.AutoSizeUtils
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
* 网约车小巴界面
* 网约车基础Fragment主要负责布局通用界面处理站点面板和通话面板互斥情况
*
*
* 部分业务放在了此处处理
*
* @author tongchenfei
*/
class ShuttleFragment : BaseShuttleTabFragment<ShuttleFragment?, BusPresenter?>(),
SlidePanelView.OnSlidePanelMoveToEndListener, View.OnClickListener {
class ShuttleFragment : MvpFragment<ShuttleFragment?, BusPresenter?>(), View.OnClickListener {
private var ctvAutopilotStatus: RelativeLayout? = null
private var ctvAutopilotStatusIv: ImageView? = null
private var ctvAutopilotStatusTv: TextView? = null
private var flStationPanelContainer: FrameLayout? = null
private var mapBizView: BizMapView? = null
private val TAG = "BusFragment"
private var autopilotLoadingAnimator: ObjectAnimator? = null
private var mSwitchLine: TextView? = null //切换路线
private var mLineName: MarqueeTextView? = null
private var mTaskTime: TextView? = null
private var groupStationsPanel: Group? = null
private var noDataView: ConstraintLayout? = null
private var startStation: BusStationBean? = null
private var endStation: BusStationBean? = null
private var firstStationItem: BusStationCommonItem? = null
private var secondStationItem: BusStationCommonItem? = null
private var thirdStationItem: BusStationCommonItem? = null
var isAnimateRunning: Boolean = false
override fun getLayoutId(): Int {
return R.layout.shuttle_weak_base_fragment
}
override fun getTagName(): String {
return "BusFragment"
}
override fun initViews() {
mapBizView = findViewById(R.id.mapBizView)
ctvAutopilotStatus = findViewById(R.id.module_mogo_och_autopilot_status)
ctvAutopilotStatusIv = findViewById(R.id.bus_autopilot_btn_iv)
ctvAutopilotStatusTv = findViewById(R.id.bus_autopolot_btn_tv)
flStationPanelContainer = findViewById(R.id.module_mogo_och_station_panel_container)
val flSpeed = findViewById<FrameLayout>(R.id.fl_speed)
if (flSpeed != null) {
attachAutopilotBeforeLaunchView(flSpeed.context, flSpeed)
}
updateSwitchMapIcon()
initListener()
setAutopilotBtnStatus(
getState(),
isCanStartAutopilot(false, 0)
)
ctvAutopilotStatus!!.setOnClickListener(object : OnPreventFastClickListener() {
override fun onClickImpl(v: View) {
}
})
}
override fun initViews(savedInstanceState: Bundle?) {
super.initViews(savedInstanceState)
mapBizView!!.onCreate(savedInstanceState)
}
override fun createPresenter(): BusPresenter {
return BusPresenter(this)
}
override fun onResume() {
super.onResume()
mapBizView!!.onResume()
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
EventBus.getDefault().register(this)
return super.onCreateView(inflater, container, savedInstanceState)
}
private fun updateSwitchMapIcon() {
val mapUIController = getMapUIController(MogoMap.DEFAULT)
if (mapUIController != null) {
if (isB2(FunctionBuildConfig.appIdentityMode)) {
mapUIController.changeCurrentIcon(R.raw.m2)
HdMapBuildConfig.currentCarVrIconRes = R.raw.m2
} else if (isB1(FunctionBuildConfig.appIdentityMode)) {
mapUIController.changeCurrentIcon(R.raw.xiaoba)
HdMapBuildConfig.currentCarVrIconRes = R.raw.xiaoba
}
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
mapBizView!!.onSaveInstanceState(outState)
}
override fun onLowMemory() {
super.onLowMemory()
mapBizView!!.onLowMemory()
}
override fun onPause() {
super.onPause()
mapBizView!!.onPause()
}
override fun onDestroyView() {
mapBizView!!.onDestroy()
if (mPresenter != null) {
mPresenter!!.onDestroy(this)
}
val overlayManager = getOverlayManager()
if (overlayManager != null) {
overlayManager.removeAllLines()
overlayManager.removeAllPoints()
}
super.onDestroyView()
CallerAutopilotRecordListenerManager.removeListener(TAG)
EventBus.getDefault().unregister(this)
}
override fun initViews() {
super.initViews()
mSwitchLine = findViewById(R.id.switch_line_btn)
mSwitchLine!!.tag = 0
mLineName = findViewById(R.id.module_och_bus_line_name)
firstStationItem = findViewById(R.id.bus_panel_first_station)
secondStationItem = findViewById(R.id.bus_panel_second_station)
thirdStationItem = findViewById(R.id.bus_panel_third_station)
mTaskTime = findViewById(R.id.bus_task_time_tv)
groupStationsPanel = findViewById(R.id.group_stations_panel)
noDataView = findViewById(R.id.no_line_data_view)
d(SceneConstant.M_BUS + TAG, "initView: " + getState())
// 初始化的时候设置 UI 按钮状态
showAutopilotBiz()
mSwitchLine!!.setOnClickListener(this)
private fun initListener() {
}
/**
* 改变自动驾驶状态
*
* @param autopilotStatus 0:不可用 1:可用状态 2:自动驾驶中
*/
fun onAutopilotStatusChanged(autopilotStatus: Int, canStartAuto: Boolean) {
UiThreadHandler.post({
changeAutopilotBtnView(
autopilotStatus,
isAnimateRunning,
canStartAuto
)
}, UiThreadHandler.MODE.QUEUE)
}
fun setAutopilotBtnStatus(autopilotStatus: Int, canStartAuto: Boolean) {
if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE == autopilotStatus) { //0不可用
ctvAutopilotStatusTv!!.setTextColor(getColor(R.color.bus_autopilot_text_color_disable))
ctvAutopilotStatusTv!!.text =
ResourcesUtils.getString(R.string.bus_loading_autopilot_runnig_tv)
ctvAutopilotStatusIv!!.setImageResource(R.drawable.bus_disable_autopilot_icon)
ctvAutopilotStatus!!.isClickable = true
ctvAutopilotStatus!!.setBackgroundResource(R.drawable.common_autopilot_start_fail)
} else {
ctvAutopilotStatusTv!!.setTextColor(
AbsMogoApplication.getApp().getColor(R.color.bus_autopilot_text_color_normal)
)
ctvAutopilotStatusIv!!.setImageResource(R.drawable.bus_ic_autopilot)
if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == autopilotStatus) { //1可用
ctvAutopilotStatusTv!!.text =
ResourcesUtils.getString(R.string.bus_loading_autopilot_runnig_tv)
if (canStartAuto) {
ctvAutopilotStatus!!.isClickable = true
ctvAutopilotStatus!!.setBackgroundResource(R.drawable.common_autopilot_press)
} else {
ctvAutopilotStatusTv!!.setTextColor(getColor(R.color.bus_autopilot_text_color_disable))
ctvAutopilotStatusIv!!.setImageResource(R.drawable.bus_disable_autopilot_icon)
ctvAutopilotStatus!!.isClickable = true
ctvAutopilotStatus!!.setBackgroundResource(R.drawable.common_autopilot_start_fail)
}
} else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == autopilotStatus) {
ctvAutopilotStatusTv!!.setText(R.string.bus_loading_autopilot_runnig_tv)
ctvAutopilotStatus!!.isClickable = true
ctvAutopilotStatus!!.setBackgroundResource(R.drawable.common_autopilot_in_autopilot)
} else if (IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING
== autopilotStatus
) {
ctvAutopilotStatusTv!!.setText(R.string.bus_pingxing_driver)
ctvAutopilotStatus!!.isClickable = false
ctvAutopilotStatus!!.setBackgroundResource(R.drawable.common_autopilot_pxjs)
}
}
}
fun updateAutopilotStatus(autopilotStatus: Int) {
if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
== autopilotStatus
) { //2 running
ctvAutopilotStatusIv!!.setImageResource(R.drawable.bus_right_autopilot_icon)
ctvAutopilotStatusTv!!.setTextColor(getColor(R.color.bus_autopilot_text_color_normal))
ctvAutopilotStatusTv!!.text =
ResourcesUtils.getString(R.string.bus_loading_autopilot_success_tv)
// ctvAutopilotStatus.setSelected(false);
ctvAutopilotStatus!!.isClickable = false
} else {
ctvAutopilotStatusIv!!.setImageResource(R.drawable.bus_wrong_autopilot_icon)
ctvAutopilotStatusTv!!.setTextColor(getColor(R.color.bus_autopilot_text_color_normal))
ctvAutopilotStatusTv!!.text =
ResourcesUtils.getString(R.string.bus_loading_autopilot_failure_tv)
ctvAutopilotStatus!!.isClickable = false
// ctvAutopilotStatus.setSelected(false);
}
UiThreadHandler.postDelayed({
setAutopilotBtnStatus(
autopilotStatus,
isCanStartAutopilot(false, 0)
)
}, 1000)
}
private fun changeAutopilotBtnView(
autopilotStatus: Int,
isAnimateRunning: Boolean,
canStartAuto: Boolean
) {
if (isAnimateRunning && (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
!= autopilotStatus)
) {
// 主动开启自动驾驶中不为2为0、1则继续loading
return
}
if (isAnimateRunning) {
stopAnimAndUpdateBtnStatus()
} else {
setAutopilotBtnStatus(autopilotStatus, canStartAuto)
}
}
fun stopAnimAndUpdateBtnStatus() {
stopAutopilotAnimation()
updateAutopilotStatus(getState())
}
/**
* 开启自动驾驶中间动画
*/
fun startAutopilotAnimation() {
isAnimateRunning = true
ctvAutopilotStatusTv!!.text =
ResourcesUtils.getString(R.string.bus_loading_autopilot_tv)
ctvAutopilotStatusTv!!.setTextColor(getColor(R.color.bus_autopilot_text_color_normal))
ctvAutopilotStatus!!.isClickable = true
ctvAutopilotStatusIv!!.setImageResource(R.drawable.bus_loading_autopilot_icon)
if (autopilotLoadingAnimator == null) {
autopilotLoadingAnimator = ObjectAnimator.ofFloat(ctvAutopilotStatusIv!!, "rotation", 0f, 360f)
autopilotLoadingAnimator?.interpolator = LinearInterpolator()
autopilotLoadingAnimator?.repeatCount = -1 //无限循环
autopilotLoadingAnimator?.setDuration(1000) //设置持续时间
}
autopilotLoadingAnimator!!.start() //动画开始
startingAutoApilotCountDown()
}
private fun startingAutoApilotCountDown() {
//10s 若自动驾驶没有开启,则结束动画
UiThreadHandler.postDelayed({
//未启动成功做处理
if (isAnimateRunning) { // 只判断动画是否在进行,根据自动驾驶当前状态去设置自动驾驶状态
stopAutopilotAnimation()
updateAutopilotStatus(getState())
}
}, BusConst.TIMER_START_AUTOPILOT_INTERVAL)
}
/**
* 停止自动驾驶中间动画
*/
protected fun stopAutopilotAnimation() {
if (autopilotLoadingAnimator != null) {
autopilotLoadingAnimator!!.end()
ctvAutopilotStatusIv!!.clearAnimation()
autopilotLoadingAnimator = null
isAnimateRunning = false
}
}
override fun onDestroy() {
super.onDestroy()
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun changeOverview(eventLogout: EventLogout) {
when (eventLogout.messgae) {
@@ -138,317 +357,20 @@ class ShuttleFragment : BaseShuttleTabFragment<ShuttleFragment?, BusPresenter?>(
}
}
override fun onArriveStation() {
mPresenter!!.onAutopilotArriveAtStation(null)
mPresenter!!.arriveStation(null, "点击进站触发进站操作")
}
override fun debugArrivedStation() {
mPresenter!!.onAutopilotArriveAtStation(null)
mPresenter!!.arriveStation(null, "点击debug进站按钮触发进站操作")
}
override fun createPresenter(): BusPresenter {
return BusPresenter(this)
}
private fun hideStationsPanel() {
groupStationsPanel!!.visibility = View.GONE
noDataView!!.visibility = View.VISIBLE
}
private fun showStationsPanel() {
groupStationsPanel!!.visibility = View.VISIBLE
noDataView!!.visibility = View.GONE
}
fun updateLineEmptyUI() {
setArrivedClikable(false)
showOrHideSwitchLineBtn(true)
hideStationsPanel()
hideSlidePanel()
resetStationBlinkAnim()
}
private fun resetStationBlinkAnim() {
BlinkAnimationUtil.clearAnimation(firstStationItem!!.getCircleImageView())
BlinkAnimationUtil.clearAnimation(secondStationItem!!.getCircleImageView())
BlinkAnimationUtil.clearAnimation(thirdStationItem!!.getCircleImageView())
}
fun updateBusTaskStatus(
lineName: String?, lineTime: String,
stationList: List<BusStationBean>?,
arrivingOrArrivedIndex: Int,
isArrived: Boolean
) {
if (activity == null) {
return
}
UiThreadHandler.post(Runnable {
if (stationList == null) {
// 获取小巴数据失败
return@Runnable
}
showStationsPanel()
showOrHideSwitchLineBtn(false)
mLineName?.text = lineName
mTaskTime?.text = ResourcesUtils.getString(R.string.shuttle_line_time_tag,lineTime)
// 渲染小巴路线数据
updateBusStationStatus(stationList, arrivingOrArrivedIndex, isArrived)
}, UiThreadHandler.MODE.QUEUE)
}
private fun updateBusStationStatus(
stationList: List<BusStationBean>,
arrivingOrArrivedIndex: Int,
isArrived: Boolean
) {
startStation = stationList[0]
endStation = stationList[stationList.size - 1]
if (arrivingOrArrivedIndex == stationList.size - 1 && isArrived) {
//切换路线和结束路线按钮切换
showSlidePanel("单程结束")
setOrRemoveMapMaker(
false, BusConst.BUS_END_MAP_MAKER, endStation!!.lat,
endStation!!.lon, R.raw.end_marker
)
} else if (arrivingOrArrivedIndex == 0 && isArrived) {
showSlidePanel("滑动出发")
setOrRemoveMapMaker(
true, BusConst.BUS_START_MAP_MAKER,
startStation!!.lat, startStation!!.lon, R.raw.star_marker
)
setOrRemoveMapMaker(
true, BusConst.BUS_END_MAP_MAKER,
endStation!!.lat, endStation!!.lon, R.raw.end_marker
)
} else {
if (isArrived) {
// 重置滑动按钮文字
showSlidePanel("滑动出发")
}
setOrRemoveMapMaker(
false, BusConst.BUS_START_MAP_MAKER, startStation!!.lat,
startStation!!.lon, R.raw.star_marker
)
setOrRemoveMapMaker(
true, BusConst.BUS_END_MAP_MAKER, endStation!!.lat,
endStation!!.lon, R.raw.end_marker
)
}
if (stationList.size > 2) { //只有两个站点
updateMoreThanTwoStationsUI(stationList, arrivingOrArrivedIndex, isArrived)
} else {
updateTwoStationsUI(stationList, arrivingOrArrivedIndex, isArrived)
}
}
/**
* 有两个以上站点的路线
* @param stationList
* @param arrivingOrArrivedIndex
* @param isArrived
*/
private fun updateMoreThanTwoStationsUI(
stationList: List<BusStationBean>,
arrivingOrArrivedIndex: Int,
isArrived: Boolean
) {
secondStationItem!!.setStationTag("")
secondStationItem!!.showOrHideStationArrowBg(true)
thirdStationItem!!.setStationTag("")
secondStationItem!!.visibility = View.VISIBLE
thirdStationItem!!.showOrHideStationArrowBg(false)
if (arrivingOrArrivedIndex == 0 || arrivingOrArrivedIndex - 1 == 0 || (arrivingOrArrivedIndex - 2 == 0 && stationList.size == 3)) {
firstStationItem!!.setStationTag(ResourcesUtils.getString(R.string.bus_station_txt_tag_start))
} else {
firstStationItem!!.setStationTag("")
}
if (arrivingOrArrivedIndex + 1 == stationList.size - 1 || arrivingOrArrivedIndex == stationList.size - 1 || (arrivingOrArrivedIndex == 0 && arrivingOrArrivedIndex + 2 == stationList.size - 1)) { //确认是否显示 "终"
thirdStationItem!!.setStationTag(ResourcesUtils.getString(R.string.bus_station_txt_tag_end))
} else {
thirdStationItem!!.setStationTag("")
}
//圆点: 0:灰色 过站 1绿色 到站或者即将到站 2蓝色未到站
if (arrivingOrArrivedIndex == 0 && isArrived) {
firstStationItem!!.setStationNameColor(getColor(R.color.bus_line_station_color_selected))
secondStationItem!!.setStationNameColor(getColor(R.color.bus_arrived_station_name_text_color))
thirdStationItem!!.setStationNameColor(getColor(R.color.bus_arrived_station_name_text_color))
firstStationItem!!.setStationName(stationList[0].name)
secondStationItem!!.setStationName(stationList[1].name)
thirdStationItem!!.setStationName(stationList[2].name)
firstStationItem!!.setStationPointBg(1)
secondStationItem!!.setStationPointBg(2)
thirdStationItem!!.setStationPointBg(2)
firstStationItem!!.setStationArrowBg(2)
secondStationItem!!.setStationArrowBg(2)
} else if (arrivingOrArrivedIndex == stationList.size - 1) {
firstStationItem!!.setStationNameColor(getColor(R.color.bus_station_tag_txt_un_color))
secondStationItem!!.setStationNameColor(getColor(R.color.bus_station_tag_txt_un_color))
thirdStationItem!!.setStationNameColor(getColor(R.color.bus_line_station_color_selected))
firstStationItem!!.setStationName(stationList[arrivingOrArrivedIndex - 2].name)
secondStationItem!!.setStationName(stationList[arrivingOrArrivedIndex - 1].name)
thirdStationItem!!.setStationName(stationList[arrivingOrArrivedIndex].name)
firstStationItem!!.setStationPointBg(0)
secondStationItem!!.setStationPointBg(0)
thirdStationItem!!.setStationPointBg(1)
firstStationItem!!.setStationArrowBg(0)
if (isArrived) {
secondStationItem!!.setStationArrowBg(0)
} else {
secondStationItem!!.setStationArrowBg(1)
}
} else {
firstStationItem!!.setStationNameColor(getColor(R.color.bus_station_tag_txt_un_color))
secondStationItem!!.setStationNameColor(getColor(R.color.bus_line_station_color_selected))
thirdStationItem!!.setStationNameColor(getColor(R.color.bus_arrived_station_name_text_color))
firstStationItem!!.setStationName(stationList[arrivingOrArrivedIndex - 1].name)
secondStationItem!!.setStationName(stationList[arrivingOrArrivedIndex].name)
thirdStationItem!!.setStationName(stationList[arrivingOrArrivedIndex + 1].name)
firstStationItem!!.setStationPointBg(0)
secondStationItem!!.setStationPointBg(1)
thirdStationItem!!.setStationPointBg(2)
secondStationItem!!.setStationArrowBg(2)
if (isArrived) {
firstStationItem!!.setStationArrowBg(0)
} else {
firstStationItem!!.setStationArrowBg(1)
}
}
}
/**
* 只有两个站点的路线
* @param stationList
* @param arrivingOrArrivedIndex
* @param isArrived
*/
private fun updateTwoStationsUI(
stationList: List<BusStationBean>,
arrivingOrArrivedIndex: Int,
isArrived: Boolean
) {
secondStationItem!!.visibility = View.GONE
secondStationItem!!.showOrHideStationArrowBg(false)
thirdStationItem!!.showOrHideStationArrowBg(false)
firstStationItem!!.setStationTag(ResourcesUtils.getString(R.string.bus_station_txt_tag_start))
thirdStationItem!!.setStationTag(ResourcesUtils.getString(R.string.bus_station_txt_tag_end))
firstStationItem!!.setStationName(stationList[0].name)
thirdStationItem!!.setStationName(stationList[1].name)
//圆点: 0:灰色 过站 1绿色 到站或者即将到站 2蓝色未到站
if (arrivingOrArrivedIndex == 0 && isArrived) { //到站
firstStationItem!!.setStationNameColor(getColor(R.color.bus_line_station_color_selected))
thirdStationItem!!.setStationNameColor(getColor(R.color.bus_arrived_station_name_text_color))
firstStationItem!!.setStationPointBg(1)
firstStationItem!!.setStationArrowBg(2)
thirdStationItem!!.setStationPointBg(0)
} else {
firstStationItem!!.setStationNameColor(getColor(R.color.bus_station_tag_txt_un_color))
thirdStationItem!!.setStationNameColor(getColor(R.color.bus_line_station_color_selected))
if (isArrived) { //到终点
firstStationItem!!.setStationPointBg(0)
firstStationItem!!.setStationArrowBg(0)
thirdStationItem!!.setStationPointBg(1)
} else { //到终点途中
firstStationItem!!.setStationPointBg(0)
firstStationItem!!.setStationArrowBg(1)
thirdStationItem!!.setStationPointBg(1)
}
}
}
private fun showOrHideSwitchLineBtn(isShow: Boolean) {
if (isShow) { //显示切换路线
mSwitchLine!!.tag = 0
mSwitchLine!!.text =
ResourcesUtils.getString(R.string.bus_switch_line_btn)
} else { //显示结束路线
mSwitchLine!!.tag = 1
mSwitchLine!!.text =
ResourcesUtils.getString(R.string.bus_close_line_btn)
}
}
fun hideOchBus() {
// tvNotice.setVisibility(View.GONE);
}
override fun stationPanelViewId(): Int {
return R.layout.shuttle_weak_fragment_och
}
override fun restartAutopilot() {
if (!isAnimateRunning) {
mPresenter!!.restartAutopilot()
}
}
override fun slidePanelOnEndListener(): SlidePanelView.OnSlidePanelMoveToEndListener {
return this
}
override fun moveToEnd() {
// 开启自动驾驶到下一站
if (isAnimateRunning) {
stopAutopilotAnimation()
}
mPresenter!!.autoDriveToNextStation()
}
/**
* 设置自动驾驶可用状态
*/
fun onAutopilotEnableChange(isEnable: Boolean) {
if (isEnable) {
showAutopilotBiz()
} else {
hideAutopilotBiz()
}
}
fun clearBusStationsMarkers() {
d(SceneConstant.M_BUS + TAG, "clearBusStationsMarkers()")
if (null != startStation) {
setOrRemoveMapMaker(
false, BusConst.BUS_START_MAP_MAKER, startStation!!.lat,
startStation!!.lon, R.raw.star_marker
)
}
if (null != endStation) {
setOrRemoveMapMaker(
false, BusConst.BUS_END_MAP_MAKER, endStation!!.lat,
endStation!!.lon, R.raw.end_marker
)
}
//清除鹰眼右下角小地图轨迹
d(SceneConstant.M_BUS, "clearBusStationsMarkers --------->")
smallMapView?.clearPolyline()
// d(SceneConstant.M_BUS + TAG, "clearBusStationsMarkers()")
// if (null != startStation) {
// setOrRemoveMapMaker(
// false, BusConst.BUS_START_MAP_MAKER, startStation!!.lat,
// startStation!!.lon, R.raw.star_marker
// )
// }
// if (null != endStation) {
// setOrRemoveMapMaker(
// false, BusConst.BUS_END_MAP_MAKER, endStation!!.lat,
// endStation!!.lon, R.raw.end_marker
// )
// }
}
/**
@@ -497,10 +419,6 @@ class ShuttleFragment : BaseShuttleTabFragment<ShuttleFragment?, BusPresenter?>(
}
}
override fun debugAutoPilotStatus(status: Int) {
mPresenter!!.debugAutoPilotStatus(status)
}
override fun onClick(v: View) {
if (v.id == R.id.switch_line_btn) { //切换路线条件: 自动驾驶过程中点击则toast提示自动驾驶中不可切换路线
//本次行程未结束不支持切换路线。点击则toast提示当前行程未完成不可切换路线
@@ -510,30 +428,13 @@ class ShuttleFragment : BaseShuttleTabFragment<ShuttleFragment?, BusPresenter?>(
ToastUtils.showLong(ResourcesUtils.getString(R.string.bus_switch_line_btn_warning1))
return
}
if (mSwitchLine!!.tag as Int == 0) { //切换路线
context?.let {
RunningTaskManager.showSwitchLineWindow(it)
}
} else { //结束任务
val builder = OCHCommitDialog.Builder()
val closeLineConfirmDialog = builder
.title(getString(R.string.bus_dialog_title))
.tips(getString(R.string.bus_dialog_tips))
.confirmStr(getString(R.string.bus_dialog_confirm))
.cancelStr(getString(R.string.bus_dialog_cancel))
.build(AbsMogoApplication.getApp())
closeLineConfirmDialog!!.setClickListener(object : OCHCommitDialog.ClickListener {
override fun confirm() {
mPresenter!!.abortTask()
}
override fun cancel() {
closeLineConfirmDialog.dismiss()
}
})
closeLineConfirmDialog.show()
}
}
}
/**
* END
*/
companion object {
private const val TAG = "BaseBusTabFragment"
}
}

View File

@@ -77,9 +77,6 @@ object BusLineModel {
// 当前任务的站点列表
var stationList:MutableList<BusStationBean>? = mutableListOf<BusStationBean>()
@JvmStatic
val busRoutesResult: BusRoutesResult = BusRoutesResult()
private val isRequesting = AtomicBoolean(false)
private val loopQueryInfo = object :Runnable{
@@ -424,12 +421,15 @@ object BusLineModel {
fun leaveStation(){
//开始站点: leaving false->true
LineManager.getStartStation {
it.drivingStatus = TaskSiteDataBean.drivingStatusCurrent
it.isLeaving = true
if (currentTask != null && currentTask!!.taskId != null) {
currentTask?.let { task ->
if (task.taskId!=null&&task.lineId!=null) {
it.drivingStatus = TaskSiteDataBean.drivingStatusCurrent
it.isLeaving = true
TaskSiteRepository.updateLeave(task.taskId!!, it.siteId.toLong(), true)
mBusLinesCallbackMap.forEach {map->
map.value.onLeaveStaionSuccess()
}
OchChainLogManager.writeChainLogDb("滑动出发", "task:${currentTask}__taskId:${currentTask?.taskId}")
// 设置滑动出发任务
LineManager.lineInfos?.lineName?.let { lineName->
@@ -445,6 +445,9 @@ object BusLineModel {
}
}
} else {
mBusLinesCallbackMap.forEach {map->
map.value.onLeaveStaionFail()
}
OchChainLogManager.writeChainLog(
"滑动出发_数据更新_error",
"task:${currentTask}__taskId:${currentTask?.taskId}"
@@ -490,6 +493,9 @@ object BusLineModel {
stationList?.let {
startStationIndex+=1
mBusLinesCallbackMap.forEach {
it.value.onArriveStationSuccess()
}
val startStation = LineManager.endStation
if(startStationIndex+1< it.size){
val endStation = it[startStationIndex+1]
@@ -509,7 +515,7 @@ object BusLineModel {
fun getTaskTime():String {
return DateTimeUtil.formatLongToString(
currentTask!!.taskStartTime!!,
currentTask?.taskStartTime?:System.currentTimeMillis(),
DateTimeUtil.HH_mm
)
}
@@ -531,6 +537,9 @@ object BusLineModel {
LineManager.setStartAndEndStation(null,null)
stationList = mutableListOf()
startStationIndex = 0
mBusLinesCallbackMap.forEach {
it.value.onCompleteTask()
}
}
fun startTaskMessage():Boolean {
@@ -558,24 +567,4 @@ object BusLineModel {
}
}
fun sendTaskDetailsToClients() {
if (LineManager.lineInfos==null||currentTask==null||stationList.isNullOrEmpty()) {
val data = BusTransferData(if (LoginStatusManager.isLogin()) 1 else 0, null)
val msg = TaskDetailsMsg(GsonUtils.toJson(data), BusinessType.shuttle)
d(M_BUS + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(msg))
LanSocketManager.sendMsgToClient(msg)
}else{
busRoutesResult.setSite(stationList)
busRoutesResult.lineId = LineManager.lineInfos!!.lineId.toInt()
busRoutesResult.name = LineManager.lineInfos!!.lineName
busRoutesResult.taskId = currentTask!!.taskId!!.toInt()
busRoutesResult.taskTime = currentTask!!.taskStartTime!!
val data = BusTransferData(if (LoginStatusManager.isLogin()) 1 else 0, busRoutesResult)
val msg = TaskDetailsMsg(GsonUtils.toJson(data), BusinessType.shuttle)
d(M_BUS + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(msg))
LanSocketManager.sendMsgToClient(msg)
}
}
}

View File

@@ -140,7 +140,7 @@ object OrderModel {
// 乘客屏请求线路信息
private val taskDetailsMsgListener = object : ILanMessageListener<TaskDetailsMsg> {
override fun targetLan(): Class<TaskDetailsMsg> = TaskDetailsMsg::class.java
override fun onLanMsgReceived(taskDetailsMsg: TaskDetailsMsg?) = BusLineModel.sendTaskDetailsToClients()
override fun onLanMsgReceived(taskDetailsMsg: TaskDetailsMsg?) = ThirdDeviceData.sendTaskDetailsToClients()
}
@JvmStatic
@@ -211,7 +211,6 @@ object OrderModel {
BusLineModel.loadStartedTaskAndDefaultInfo()
if(BusLineModel.stationList.isNullOrEmpty()){
d(M_BUS + TAG, "获取到小巴路线数据:空 ")
mADASStatusCallback?.updateEmptyUi()
LineManager.setLineInfo(null);
updateBusStatus()
clearAutopilotControlParameters()
@@ -288,9 +287,12 @@ object OrderModel {
OCHThreadPoolManager.getsInstance().execute {
d(M_BUS + TAG, "结束当前路线abortTask")
endOrAbortTaskSuccess()
clearBusStationDatas()
queryBusRoutes()
isGoingToNextStation = false
ThirdDeviceData.endTask()
BusLineModel.endTask()
ThirdDeviceData.sendTaskDetailsToClients()
mADASStatusCallback?.clearBusStationsMarkers()
removeTipRunnables()
ShuttleVoiceManager.endOrderBus()
// 取消自驾
@@ -299,27 +301,6 @@ object OrderModel {
}
}
/**
* 中断或者正常结束任务后的处理
*/
private fun endOrAbortTaskSuccess() {
isGoingToNextStation = false
LineManager.lineInfos?.let {
LedScreenManager.sendTripInfo2Led(
LedScreenManager.END_TRIP,
it.lineName,
"",
"",
false
)
}
BusLineModel.endTask()
BusLineModel.sendTaskDetailsToClients()
}
private fun onStartAutopilot() {
//开启自动驾驶 2.10.0: 如果自动驾驶状态下开启, 非自动驾驶状态下不开启,需手动点击自动驾驶按钮开启
isGoingToNextStation = true
@@ -337,8 +318,6 @@ object OrderModel {
* @param isRestart
*/
private fun startAutopilot(isRestart: Boolean) {
val temp = initAutopilotControlParameters()
/**
* 存在Session
*/
@@ -412,45 +391,6 @@ object OrderModel {
mADASStatusCallback?.startOpenAutopilot()
}
/**
* 到站后重置站点状态
*/
private fun arriveSiteStation(changeInfo: String) {
OchChainLogManager.writeChainLog("触发进站", changeInfo)
if (LineManager.endStation==null) {
e(M_BUS + TAG, "未设置终点坐标")
OchChainLogManager.writeChainLog("shuttle弱网","围栏距离判断 未设置终点坐标")
return
}
isArrivedStation = true
isGoingToNextStation = false
arriveStationSuccess()
}
private fun arriveStationSuccess() {
LineManager.getStations { start, end ->
ShuttleVoiceManager.arrivedStationBus(end.name, end.nameKr)
//给bus外屏发送
LedScreenManager.sendTripInfo2Led(
LedScreenManager.ARRIVE_STATION,
LineManager.lineInfos!!.lineName,
start.name,
end.name,
BusLineModel.isLastStation()==true
)
}
BusLineModel.arrivedStation()
updateBusStatus()
}
//车站10s后播报
private fun leaveTTSTips(nextStation: String?, nextStationKr: String?) {
UiThreadHandler.postDelayed({ //延迟10s播报
ShuttleVoiceManager.leaveStationBus(nextStation, nextStationKr)
}, BusConst.DELAY_10S)
}
@JvmStatic
fun startBeautificationMode() {
FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true
@@ -488,17 +428,8 @@ object OrderModel {
}
isArrivedStation = false
onStartAutopilot()
LineManager.getStations { start, end ->
leaveTTSTips(end.name, end.nameKr)
//给bus外屏发送
LedScreenManager.sendTripInfo2Led(
LedScreenManager.LEAVE_STATION,
LineManager.lineInfos!!.lineName,
start.name,
end.name,
BusLineModel.isLastStation()==true
)
}
ThirdDeviceData.leaveStation()
BusLineModel.leaveStation()
@@ -532,14 +463,13 @@ object OrderModel {
LineManager.getStartStation {
if (it.isLeaving) {
mADASStatusCallback?.hideSlidePanel()
isGoingToNextStation = true
}else{
isGoingToNextStation = false
}
}
BusLineModel.sendTaskDetailsToClients()
ThirdDeviceData.sendTaskDetailsToClients()
//更新bus路线面板
updateBusTaskStatus()
@@ -605,13 +535,6 @@ object OrderModel {
firstStartAutopilot = 0
}
@JvmStatic
fun clearBusStationDatas() {
mADASStatusCallback?.clearBusStationsMarkers()
}
/**
* 在踩刹车、控制方向盘等操作后,会停止自动驾驶,重启自动驾驶的话相当于重新设置自动驾驶目的地
*/
@@ -657,7 +580,13 @@ object OrderModel {
if (isArrivedStation) return
arriveSiteStation(type)
OchChainLogManager.writeChainLog("触发进站", type)
isArrivedStation = true
isGoingToNextStation = false
ThirdDeviceData.arriveStation()
BusLineModel.arrivedStation()
updateBusStatus()
}
// 登出

View File

@@ -0,0 +1,87 @@
package com.mogo.och.weaknet.model
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.common.module.biz.login.LoginStatusManager
import com.mogo.och.common.module.manager.autopilot.line.LineManager
import com.mogo.och.common.module.manager.socket.lan.LanSocketManager
import com.mogo.och.common.module.manager.socket.lan.LedScreenManager
import com.mogo.och.common.module.manager.socket.lan.bean.BusinessType
import com.mogo.och.common.module.manager.socket.lan.bean.TaskDetailsMsg
import com.mogo.och.data.bean.BusRoutesResult
import com.mogo.och.data.bean.BusTransferData
import com.mogo.och.weaknet.constant.BusConst
import com.mogo.och.weaknet.util.ShuttleVoiceManager
object ThirdDeviceData {
const val TAG = "ThirdDeviceData"
@JvmStatic
val busRoutesResult: BusRoutesResult = BusRoutesResult()
fun leaveStation(){
LineManager.getStations { start, end ->
UiThreadHandler.postDelayed({ //延迟10s播报
ShuttleVoiceManager.leaveStationBus(end.name, end.nameKr)
}, BusConst.DELAY_10S)
//给bus外屏发送
LedScreenManager.sendTripInfo2Led(
LedScreenManager.LEAVE_STATION,
LineManager.lineInfos!!.lineName,
start.name,
end.name,
BusLineModel.isLastStation()==true
)
}
}
fun arriveStation(){
LineManager.getStations { start, end ->
ShuttleVoiceManager.arrivedStationBus(end.name, end.nameKr)
//给bus外屏发送
LedScreenManager.sendTripInfo2Led(
LedScreenManager.ARRIVE_STATION,
LineManager.lineInfos!!.lineName,
start.name,
end.name,
BusLineModel.isLastStation()==true
)
}
}
fun endTask(){
LineManager.lineInfos?.let {
LedScreenManager.sendTripInfo2Led(
LedScreenManager.END_TRIP,
it.lineName,
"",
"",
false
)
}
}
fun sendTaskDetailsToClients() {
if (LineManager.lineInfos==null|| BusLineModel.currentTask ==null|| BusLineModel.stationList.isNullOrEmpty()) {
val data = BusTransferData(if (LoginStatusManager.isLogin()) 1 else 0, null)
val msg = TaskDetailsMsg(GsonUtils.toJson(data), BusinessType.shuttle)
d(M_BUS + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(msg))
LanSocketManager.sendMsgToClient(msg)
}else{
busRoutesResult.setSite(BusLineModel.stationList)
busRoutesResult.lineId = LineManager.lineInfos!!.lineId.toInt()
busRoutesResult.name = LineManager.lineInfos!!.lineName
busRoutesResult.taskId = BusLineModel.currentTask!!.taskId!!.toInt()
busRoutesResult.taskTime = BusLineModel.currentTask!!.taskStartTime!!
val data = BusTransferData(if (LoginStatusManager.isLogin()) 1 else 0, busRoutesResult)
val msg = TaskDetailsMsg(GsonUtils.toJson(data), BusinessType.shuttle)
d(M_BUS + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(msg))
LanSocketManager.sendMsgToClient(msg)
}
}
}

View File

@@ -99,21 +99,11 @@ class BusPresenter(view: ShuttleFragment?) : Presenter<ShuttleFragment?>(view),
arrivingOrArrivedIndex - 1
}
d(SceneConstant.M_BUS + "BusOrderModel =", " mCurrentStation =$mCurrentStation")
mView?.updateBusTaskStatus(
lineName, lineTime,
stationList, arrivingOrArrivedIndex, isArrived
)
}
override fun updateEmptyUi() {
UiThreadHandler.post({
if (mView != null) {
mView!!.updateLineEmptyUI()
}
}, UiThreadHandler.MODE.QUEUE)
}
override fun clearBusStationsMarkers() {
// TODO: 清理或展示地图
UiThreadHandler.post({
if (mView != null) {
mView!!.clearBusStationsMarkers()
@@ -121,13 +111,6 @@ class BusPresenter(view: ShuttleFragment?) : Presenter<ShuttleFragment?>(view),
}, UiThreadHandler.MODE.QUEUE)
}
override fun hideSlidePanel() {
if (mView != null) {
mView!!.hideSlidePanel()
mView!!.setArrivedClikable(true)
}
}
override fun onAutopilotArriveAtStation(arrivedStation: ArrivedStation?) {
e(SceneConstant.M_BUS + TAG, "行程日志-onAutopilotArriveAtStation arrive")
arriveStation(arrivedStation, "底盘触发进站")
@@ -165,9 +148,7 @@ class BusPresenter(view: ShuttleFragment?) : Presenter<ShuttleFragment?>(view),
}
else -> UiThreadHandler.post({
if (mView != null) {
mView!!.onAutopilotEnableChange(false)
}
}, UiThreadHandler.MODE.QUEUE)
}
}
@@ -219,9 +200,6 @@ class BusPresenter(view: ShuttleFragment?) : Presenter<ShuttleFragment?>(view),
BusTrajectoryManager.getInstance().stopTrajReqLoop()
BusTrajectoryManager.getInstance().stopTrajReqLoop()
clearBusStationsMarkers()
if (mView != null) {
mView!!.hideSlidePanel()
}
OrderModel.closeBeautificationMode()
}
}

View File

@@ -74,5 +74,13 @@ class SwtichBizeModel : ViewModel(), IBusLinesCallback {
this.viewCallback?.loadRunningTask()
CallerLogger.d(TAG,"有任务去加载正在执行的任务")
}
override fun onCompleteTask() {
super.onCompleteTask()
ThreadUtils.getIoPool().execute {
BusLineModel.loadStartedTaskAndDefaultInfo()
}
}
}

View File

@@ -59,14 +59,6 @@ object RunningTaskManager : LifecycleEventObserver{
}
}
/**
* 展示BadCase配置页面
*/
fun showSwitchLineWindow(context: Context) {
val badCaseConfigView = SwitchBizView(context)
}
override fun onStateChanged(source: LifecycleOwner, event: Event) {
}

View File

@@ -16,6 +16,7 @@ import com.mogo.och.data.bean.BusStationBean
import com.mogo.och.weaknet.bean.BusQueryLinesResponse
import com.mogo.och.shuttle.weaknet.R
import com.mogo.och.weaknet.bean.BusQueryLineTaskResponse
import com.mogo.och.weaknet.ui.writeoff.WriteOffView
import me.jessyan.autosize.utils.AutoSizeUtils
/**
@@ -31,9 +32,9 @@ class TaskRunningAdapter(
}
private var startStationIndex:Int = -1
@SuppressLint("NotifyDataSetChanged")
fun setDataList(dataList: List<BusStationBean>, startStationIndex:Int) {
this.startStationIndex = startStationIndex
val tempData = this.mData
this.mData.clear()
this.mData.addAll(dataList)
notifyDataSetChanged()
@@ -58,14 +59,17 @@ class TaskRunningAdapter(
holder.actvStationName.setTextSize(TypedValue.COMPLEX_UNIT_PX, AutoSizeUtils.dp2px(mContext,40f).toFloat())
holder.actvStationName.setTextColor(ResourcesUtils.getColor(R.color.bus_color_4dffffff))
holder.itemView.background = null
holder.actvWriteOffCount.visibility = View.GONE
}else if(currentPosition==startStationIndex){
holder.actvStationName.setTextSize(TypedValue.COMPLEX_UNIT_PX, AutoSizeUtils.dp2px(mContext,45f).toFloat())
holder.actvStationName.setTextColor(ResourcesUtils.getColor(R.color.bus_color_2EACFF))
holder.itemView.setBackgroundResource(R.drawable.bus_task_current_station_bg)
holder.actvWriteOffCount.visibility = View.VISIBLE
}else{
holder.actvStationName.setTextColor(ResourcesUtils.getColor(R.color.white))
holder.actvStationName.setTextSize(TypedValue.COMPLEX_UNIT_PX, AutoSizeUtils.dp2px(mContext,40f).toFloat())
holder.itemView.background = null
holder.actvWriteOffCount.visibility = View.GONE
}
when (currentPosition) {
@@ -96,34 +100,7 @@ class TaskRunningAdapter(
val actvStationName: AppCompatTextView = itemView.findViewById(R.id.actv_station_name)//站点名称
val acivStationHead: AppCompatImageView = itemView.findViewById(R.id.aciv_station_head)//线路标识
val acivStationHeadBig: AppCompatImageView = itemView.findViewById(R.id.aciv_station_head_big)//线路标识
val actvWriteOffCount: AppCompatTextView = itemView.findViewById(R.id.actv_write_off_count) //此战核销的人数
val actvWriteOffCount: WriteOffView = itemView.findViewById(R.id.actv_write_off_count) //此战核销的人数
}
interface LineItemClickListener {
fun onItemClick(position: Int,close:Boolean)
}
inner class MyDiffCallback(private val oldData:List<BusStationBean>, private val newData:List<BusStationBean>):
Callback(){
override fun getOldListSize(): Int {
return oldData.size
}
override fun getNewListSize(): Int {
return newData.size
}
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
val oldItem = oldData[oldItemPosition]
val newItem = newData[newItemPosition]
return oldItem == newItem
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
val oldItem = oldData[oldItemPosition]
val newItem = newData[newItemPosition]
return oldItem == newItem
}
}
}

View File

@@ -3,6 +3,7 @@ package com.mogo.och.weaknet.ui.taskrunning
import androidx.lifecycle.ViewModel
import com.mogo.commons.storage.SharedPrefsMgr
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.och.common.module.manager.loop.BizLoopManager
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.weaknet.bean.BusQueryLinesResponse
import com.mogo.och.weaknet.callback.IBusLinesCallback
@@ -15,7 +16,7 @@ import com.mogo.och.weaknet.model.OrderModel
* @description BadCase录包管理页面
* @since: 2022/12/15
*/
class TaskRunningModel : ViewModel() {
class TaskRunningModel : ViewModel(), IBusLinesCallback {
private val TAG = TaskRunningModel::class.java.simpleName
@@ -27,6 +28,7 @@ class TaskRunningModel : ViewModel() {
fun setDistanceCallback(viewCallback:SwtichLineViewCallback){
this.viewCallback = viewCallback
BusLineModel.setBusLinesCallback(TAG,this)
}
fun leaveStation() {
@@ -34,7 +36,41 @@ class TaskRunningModel : ViewModel() {
}
interface SwtichLineViewCallback{
fun showRunningTaskInfo()
}
override fun onLeaveStaionSuccess() {
BizLoopManager.runInMainThread{
viewCallback?.showRunningTaskInfo()
}
}
override fun onLeaveStaionFail() {
BizLoopManager.runInMainThread{
viewCallback?.showRunningTaskInfo()
}
}
fun arriveStation() {
OrderModel.onArriveAt(null, "页面触发到站")
}
override fun onArriveStationSuccess() {
BizLoopManager.runInMainThread{
viewCallback?.showRunningTaskInfo()
}
}
override fun onCompleteTask() {
BizLoopManager.runInMainThread{
viewCallback?.showRunningTaskInfo()
}
}
fun completeTask() {
OrderModel.abortTask()
}
}

View File

@@ -8,8 +8,13 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.findViewTreeViewModelStoreOwner
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.view.SpacesItemDecoration
import com.mogo.och.common.module.manager.autopilot.line.LineManager
import com.mogo.och.common.module.utils.ResourcesUtils
import com.mogo.och.common.module.wigets.OCHCommitDialog
import com.mogo.och.shuttle.weaknet.R
import com.mogo.och.weaknet.model.BusLineModel
import com.mogo.och.weaknet.ui.bizswitch.SwtichBizeModel
@@ -17,6 +22,8 @@ import com.mogo.och.weaknet.ui.switchline.SwitchLineAdapter
import com.mogo.och.weaknet.view.BizLeaveStationView.SlideListener
import kotlinx.android.synthetic.main.shuttle_weak_switch_line.view.switch_line_rv
import kotlinx.android.synthetic.main.shuttle_weak_task_running.view.aciv_task_leave_station_slide_bg
import kotlinx.android.synthetic.main.shuttle_weak_task_running.view.actv_arriver_station
import kotlinx.android.synthetic.main.shuttle_weak_task_running.view.actv_complete_task
import kotlinx.android.synthetic.main.shuttle_weak_task_running.view.actv_running_task_last_station
import kotlinx.android.synthetic.main.shuttle_weak_task_running.view.actv_running_task_time
import kotlinx.android.synthetic.main.shuttle_weak_task_running.view.bus_task_running_line_name
@@ -45,9 +52,6 @@ class TaskRunningView: ConstraintLayout, TaskRunningModel.SwtichLineViewCallback
private lateinit var mAdapter: TaskRunningAdapter
private var animator:ObjectAnimator?=null
private lateinit var linearLayoutManager:LinearLayoutManager
init {
@@ -70,6 +74,28 @@ class TaskRunningView: ConstraintLayout, TaskRunningModel.SwtichLineViewCallback
viewModel?.leaveStation()
}
})
actv_arriver_station.onClick {
viewModel?.arriveStation()
}
actv_complete_task.onClick {
val builder = OCHCommitDialog.Builder()
val closeLineConfirmDialog = builder
.title(ResourcesUtils.getString(R.string.bus_dialog_title))
.tips(ResourcesUtils.getString(R.string.bus_dialog_tips))
.confirmStr(ResourcesUtils.getString(R.string.bus_dialog_confirm))
.cancelStr(ResourcesUtils.getString(R.string.bus_dialog_cancel))
.build(AbsMogoApplication.getApp())
closeLineConfirmDialog!!.setClickListener(object : OCHCommitDialog.ClickListener {
override fun confirm() {
viewModel?.completeTask()
}
override fun cancel() {
closeLineConfirmDialog.dismiss()
}
})
closeLineConfirmDialog.show()
}
}
override fun onAttachedToWindow() {
@@ -84,13 +110,36 @@ class TaskRunningView: ConstraintLayout, TaskRunningModel.SwtichLineViewCallback
viewModel?.setDistanceCallback(this)
}
fun showRunningTaskInfo() {
override fun showRunningTaskInfo() {
bus_task_running_line_name.text = LineManager.lineInfos?.lineName?:""
actv_running_task_time.text = BusLineModel.getTaskTime()
BusLineModel.stationList?.takeIf { it.size>2 }?.let {
actv_running_task_last_station.text = "${it.last().name ?: ""}"
mAdapter.setDataList(it,BusLineModel.startStationIndex)
CallerLogger.d(TAG,"BusLineModel.startStationIndex:${BusLineModel.startStationIndex}___$it")
val currentStation = it.get(BusLineModel.startStationIndex)
if(currentStation.isLeaving){
showArriverStationAndCompleteTask()
}else{
showLeaveStationView()
}
if(BusLineModel.startStationIndex==it.size-1){
aciv_task_leave_station_slide_bg.setTextValue("单程结束")
}else{
aciv_task_leave_station_slide_bg.setTextValue("滑动出发")
}
}
}
fun showLeaveStationView(){
aciv_task_leave_station_slide_bg.visibility = VISIBLE
actv_arriver_station.visibility = GONE
actv_complete_task.visibility = GONE
}
fun showArriverStationAndCompleteTask(){
aciv_task_leave_station_slide_bg.visibility = INVISIBLE
actv_arriver_station.visibility = VISIBLE
actv_complete_task.visibility = VISIBLE
}
}

View File

@@ -3,13 +3,14 @@ package com.mogo.och.weaknet.ui.writeoff
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.appcompat.widget.AppCompatTextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.findViewTreeViewModelStoreOwner
import com.mogo.och.shuttle.weaknet.R
import kotlinx.android.synthetic.main.shuttle_weak_wirte_off_view.view.tv_write_off_count
class WriteOffView : ConstraintLayout, WriteOffViewModel.IwriteOffViewCallback {
class WriteOffView : AppCompatTextView, WriteOffViewModel.IwriteOffViewCallback {
private val TAG = "ItineraryView"
@@ -19,35 +20,45 @@ class WriteOffView : ConstraintLayout, WriteOffViewModel.IwriteOffViewCallback {
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes)
private fun initView() {
LayoutInflater.from(context).inflate(R.layout.shuttle_weak_wirte_off_view, this, true)
}
private var viewModel:WriteOffViewModel? = null
override fun onAttachedToWindow() {
super.onAttachedToWindow()
val viewModel = findViewTreeViewModelStoreOwner()?.let {
viewModel = findViewTreeViewModelStoreOwner()?.let {
ViewModelProvider(it).get(WriteOffViewModel::class.java)
}
viewModel?.setWriteOffCallback(this)
}
private fun startListenerWriteOff(){
viewModel?.setWriteOffCallback(this)
visibility = VISIBLE
}
private fun stopListenerWriteOff(){
viewModel?.setWriteOffCallback(null)
visibility = GONE
}
override fun onVisibilityAggregated(isVisible: Boolean) {
super.onVisibilityAggregated(isVisible)
if(isVisible){
startListenerWriteOff()
}else{
stopListenerWriteOff()
}
}
init {
try {
initView()
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun setWriteOffCount(showText: String) {
tv_write_off_count.text = showText
text = showText
}

View File

@@ -43,7 +43,7 @@ class WriteOffViewModel : ViewModel() {
}
fun setWriteOffCallback(viewCallback: IwriteOffViewCallback) {
fun setWriteOffCallback(viewCallback: IwriteOffViewCallback?) {
this.viewCallback = viewCallback
TicketModel
.getWriteOffCountObservable()

View File

@@ -10,6 +10,7 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.och.shuttle.weaknet.R
import kotlinx.android.synthetic.main.shuttle_weak_task_leave_station_view.view.actv_draggable
class BizLeaveStationView @JvmOverloads constructor(
context: Context,
@@ -120,6 +121,10 @@ class BizLeaveStationView @JvmOverloads constructor(
CallerLogger.d(TAG,"onDetachedFromWindow")
}
fun setTextValue(value: String) {
actv_draggable.text = value
}
interface SlideListener{
fun slideEnd()
}

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/bus_switch_task_selected"/>
<item android:state_pressed="false" android:drawable="@drawable/bus_switch_task_normal"/>
<item android:state_checked="true" android:drawable="@drawable/bus_switch_task_selected"/>
<item android:state_checked="false" android:drawable="@drawable/bus_switch_task_normal"/>
<item android:drawable="@drawable/bus_switch_task_normal"/>
</selector>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/bus_switch_task_selected"/>
<item android:state_pressed="false" android:drawable="@drawable/bus_switch_task_normal"/>
<item android:state_checked="true" android:drawable="@drawable/bus_switch_task_selected"/>
<item android:state_checked="false" android:drawable="@drawable/bus_switch_task_normal"/>
<item android:drawable="@drawable/bus_switch_task_normal"/>
</selector>

View File

@@ -114,34 +114,6 @@
android:visibility="invisible"
app:layout_constraintTop_toBottomOf="@+id/viewLimitingVelocity"/>
<!--消息盒子选择入口-->
<com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxButtonView
android:id="@+id/viewDriverMsgBoxButton"
android:layout_width="@dimen/dp_142"
android:layout_height="@dimen/dp_142"
android:layout_marginTop="15dp"
android:layout_marginEnd="25dp"
app:layout_constraintRight_toLeftOf="@id/viewLimitingVelocity"
app:layout_constraintTop_toBottomOf="@+id/ivCameraIcon" />
<!--消息盒子打开视图-->
<com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxListView
android:id="@+id/viewDriverMsgBoxList"
android:layout_width="864dp"
android:layout_height="746dp"
android:layout_marginEnd="40dp"
android:visibility="gone"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/viewDriverMsgBoxButton" />
<!--消息盒子气泡视图-->
<com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxBubbleView
android:id="@+id/viewDriverMsgBoxBubble"
android:layout_width="864dp"
android:layout_height="wrap_content"
android:layout_marginEnd="40dp"
android:visibility="visible"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/viewDriverMsgBoxButton" />
<!--红绿灯-->
<com.mogo.eagle.core.function.hmi.ui.widget.SingleTrafficLightView
android:id="@+id/viewTrafficLightVr"
@@ -215,142 +187,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<com.mogo.och.weaknet.ui.writeoff.WriteOffView
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toTopOf="@+id/module_mogo_och_arrived_tv"
android:layout_marginStart="@dimen/dp_12"
android:layout_marginBottom="@dimen/dp_5"
android:background="@drawable/shuttle_write_off_bg"
android:layout_width="@dimen/dp_618"
android:layout_height="@dimen/dp_177"/>
<TextView
android:id="@+id/module_mogo_och_arrived_tv"
android:layout_width="@dimen/dp_142"
android:layout_height="@dimen/dp_142"
android:layout_marginBottom="@dimen/dp_16"
android:layout_marginStart="@dimen/dp_19"
android:background="@drawable/common_arrive_station_selector"
android:gravity="center"
android:textColor="@color/bus_autopilot_text_color_selector"
android:textSize="@dimen/module_mogo_och_arrived_text_size"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" />
<com.mogo.och.common.module.wigets.map.toolsview.ToolsView
android:id="@+id/toolsView"
android:layout_marginStart="-10dp"
android:layout_marginBottom="@dimen/dp_17"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/module_mogo_och_arrived_tv"
android:layout_width="@dimen/dp_142"
android:layout_height="@dimen/dp_142"/>
<com.mogo.och.common.module.wigets.map.reportworkorder.ReportWorkOrderView
android:id="@+id/reportworkorderview"
android:layout_marginStart="-10dp"
android:layout_marginBottom="@dimen/dp_17"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/toolsView"
android:layout_width="@dimen/dp_142"
android:layout_height="@dimen/dp_142"/>
<com.mogo.och.common.module.wigets.map.drawline.LineView
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/reportworkorderview"
android:layout_marginStart="-11dp"
android:layout_marginBottom="@dimen/dp_17"
android:layout_width="@dimen/dp_142"
android:layout_height="@dimen/dp_142"/>
<com.mogo.och.common.module.wigets.SlidePanelView
android:id="@+id/module_mogo_och_slide_panel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/module_mogo_och_margin_bottom"
android:visibility="invisible"
app:BLOCK_START_X="@dimen/module_mogo_och_slide_panel_block_start_x"
app:BLOCK_START_Y="@dimen/module_mogo_och_slide_panel_block_start_y"
app:NORMAL_TEXT_MARGIN_LEFT="@dimen/module_mogo_och_slide_panel_normal_text_margin_left"
app:NORMAL_TEXT_MARGIN_RIGHT="@dimen/module_mogo_och_slide_panel_normal_text_margin_right"
app:SHORT_TEXT_MARGIN_LEFT="@dimen/module_mogo_och_slide_panel_short_text_margin_left"
app:SHORT_TEXT_MARGIN_RIGHT="@dimen/module_mogo_och_slide_panel_short_text_margin_right"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:textSize="@dimen/module_mogo_och_slide_panel_textSize"
tools:visibility="visible" />
<Button
android:id="@+id/btnAutopilotDisable"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#f00"
android:text="Disable"
android:textSize="@dimen/dp_60"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btnAutopilotEnable"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#0f0"
android:text="Enable"
android:textSize="@dimen/dp_60"
app:layout_constraintRight_toRightOf="@id/btnAutopilotDisable"
app:layout_constraintTop_toBottomOf="@id/btnAutopilotDisable" />
<Button
android:id="@+id/btnAutopilotRunning"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00f"
android:text="Running"
android:textSize="@dimen/dp_60"
app:layout_constraintRight_toRightOf="@id/btnAutopilotDisable"
app:layout_constraintTop_toBottomOf="@id/btnAutopilotEnable" />
<Button
android:id="@+id/btnAutopilotPingxing"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00f"
android:text="pingxingjiashi"
android:textSize="@dimen/dp_60"
app:layout_constraintRight_toRightOf="@id/btnAutopilotDisable"
app:layout_constraintTop_toBottomOf="@id/btnAutopilotRunning" />
<Button
android:id="@+id/btnAutopilotArrive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#f00"
android:text="Arrived"
android:textSize="@dimen/dp_60"
app:layout_constraintRight_toRightOf="@id/btnAutopilotDisable"
app:layout_constraintTop_toBottomOf="@id/btnAutopilotPingxing" />
<androidx.constraintlayout.widget.Group
android:id="@+id/groupTestPanel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:constraint_referenced_ids="btnAutopilotArrive,btnAutopilotDisable,btnAutopilotEnable
,btnAutopilotRunning,btnAutopilotPingxing"
tools:visibility="visible" />
<com.mogo.eagle.core.function.smp.view.SmallMapView
android:id="@+id/smallMapView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="30dp"
android:layout_marginBottom="30dp"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
/>
<com.mogo.och.common.module.wigets.LoadingMapStatusView
android:layout_width="match_parent"
android:layout_height="match_parent"/>

View File

@@ -44,7 +44,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"/>
<androidx.appcompat.widget.AppCompatTextView
<com.mogo.och.weaknet.ui.writeoff.WriteOffView
android:id="@+id/actv_write_off_count"
android:text="核销66人"
app:layout_constraintTop_toTopOf="parent"

View File

@@ -62,4 +62,32 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_arriver_station"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:gravity="center"
android:textSize="@dimen/dp_40"
android:textColor="@color/white"
android:background="@drawable/bus_running_task_arrive_station_selector"
android:layout_marginBottom="@dimen/dp_46"
android:layout_marginStart="@dimen/dp_54"
android:text="@string/bus_running_task_arrive_station"
android:layout_width="@dimen/dp_474"
android:layout_height="@dimen/dp_120"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_complete_task"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:gravity="center"
android:textSize="@dimen/dp_40"
android:textColor="@color/white"
android:background="@drawable/bus_running_task_complete_selector"
android:layout_marginBottom="@dimen/dp_46"
android:layout_marginEnd="@dimen/dp_54"
android:text="@string/bus_running_task_complete"
android:layout_width="@dimen/dp_245"
android:layout_height="@dimen/dp_120"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -7,15 +7,11 @@
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"
android:id="@+id/no_line_data_view">
<TextView
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_write_off_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/shuttle_driver_cad6ff"
android:textSize="30dp"
android:layout_marginStart="@dimen/dp_68"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:textColor="@color/white"
android:textSize="@dimen/dp_36"
android:text="@string/shuttle_write_off_count_default"/>
</merge>

View File

@@ -6,6 +6,8 @@
<string name="bus_loading_autopilot_failure_tv">启动失败</string>
<string name="bus_loading_autopilot_runnig_tv">自动驾驶</string>
<string name="bus_switch_line_title">请选择任务</string>
<string name="bus_running_task_arrive_station">到站</string>
<string name="bus_running_task_complete">结束</string>
<string name="bus_switch_line_no_task">暂无任务</string>
<string name="bus_switch_line_select_task">选择时间</string>
<string name="bus_switch_task_submit">确认班次</string>
@@ -47,7 +49,7 @@
<string name="shuttle_logout_error">请在网络良好的区域完成任务信息同步后退出</string>
<string name="bus_no_task_tip">暂无任务</string>
<string name="shuttle_write_off_count">本站核销成功:%1$d人</string>
<string name="shuttle_write_off_count">核销%1$d人</string>
<string name="shuttle_write_off_count_default">本站核销成功0人</string>
<string name="bus_no_running_task">暂无待上传任务</string>