[自主算路验证] feat: 增加接口定义及管理类,Model, ViewModel 各层次之间依赖等;

This commit is contained in:
aibingbing
2023-11-23 21:36:16 +08:00
parent 69a853ecc2
commit 2eec825543
15 changed files with 720 additions and 90 deletions

View File

@@ -1,7 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mogo.och.taxi">
<application>
<activity android:name=".ui.routing.TaxiRoutingChooseTaskActivity"
<activity android:name=".ui.routing.TaxiRoutingChooseLineActivity"
android:theme="@style/RoutingChooseLineDialogStyle"
android:launchMode="singleTask"
android:screenOrientation="landscape" />

View File

@@ -0,0 +1,39 @@
package com.mogo.och.taxi.bean
import com.mogo.eagle.core.data.BaseData
data class GrayLineBean(
var lineId: Long?, //线路id
var lineName: String?, //线路名称
var contrailId: Long?, //轨迹id
var carVerificationCount: Int?, //本次今日已验证次数
var lineSuccessCount: Int?, //线路累计反馈可用次数
var lineFailCount: Int?, //线路累计反馈不可用次数
var isChoosed: Boolean = false //当前是否选中
)
data class ContrailBean(
var lineId: Long?,
var contrailId: Long?,
var csvFileUrl: String?,
var csvFileMd5: String?,
var txtFileUrl: String?,
var txtFileMd5: String?,
var version: Long?
)
data class QueryGrayContrailListRsp(var data: MutableList<GrayLineBean>?) : BaseData()
data class StartGrayContrailTaskReq(var sn: String, var contrailId: Long)
data class StartGrayContrailTaskRsp(var data: Long?) : BaseData()
data class QueryRoutingContrailByIdRsp(var data: ContrailBean?) : BaseData()
data class SubmitGrayLineIssueLocationReq(var grayId: Long, var gcjLon: Double, var gcjLat: Double)
data class EndGrayContrailTaskReq(var grayId: Long, var feedback: Int) //feedback 1:成功 2:失败
data class StartGrayAndQueryContrailRsp(
var taskId: Long?,
var contrail: ContrailBean?,
var grayLineBean: GrayLineBean
) : BaseData()

View File

@@ -1,22 +0,0 @@
package com.mogo.och.taxi.bean;
import com.mogo.eagle.core.data.BaseData;
import java.util.List;
/**
* @author: wangmingjun
* @date: 2022/2/9
*/
public class TaxiRoutingQueryLineResponse extends BaseData {
public List<Result> data;
public static class Result {
public int lineId;//线路id
public String name;//线路名字
public int todayVerifyNum;//本车今天验证次数
public int historyVerifyTotalUsableNum;//历史累计验证可用次数
public int historyVerifyTotalNotUsableNum;//历史累计验证不可用次数
public boolean isChoosed;//当前是否选中
}
}

View File

@@ -0,0 +1,11 @@
package com.mogo.och.taxi.callback
import com.mogo.och.taxi.bean.GrayLineBean
import com.mogo.och.taxi.bean.StartGrayAndQueryContrailRsp
interface ITaxiRoutingCallback {
fun onQueryRoutingGrayLineListSuccess(data: MutableList<GrayLineBean>)
fun onQueryRoutingGrayLineListFailed(errorStr: String)
fun onStartGrayTaskAndQueryContrailSuccess(data: StartGrayAndQueryContrailRsp)
fun onStartGrayTaskAndQueryContrailFailed(errorStr: String)
}

View File

@@ -0,0 +1,75 @@
package com.mogo.och.taxi.network
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.data.BaseData
import com.mogo.och.taxi.bean.EndGrayContrailTaskReq
import com.mogo.och.taxi.bean.QueryGrayContrailListRsp
import com.mogo.och.taxi.bean.QueryRoutingContrailByIdRsp
import com.mogo.och.taxi.bean.StartGrayContrailTaskReq
import com.mogo.och.taxi.bean.StartGrayContrailTaskRsp
import com.mogo.och.taxi.bean.SubmitGrayLineIssueLocationReq
import io.reactivex.Observable
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.Header
import retrofit2.http.Headers
import retrofit2.http.POST
import retrofit2.http.Query
interface TaxiRoutingServiceApi {
/**
* 查询灰度线路列表
*/
@Headers("Content-type:application/json;charset=UTF-8")
@GET("/och-taxi-cabin/api/business/v1/queryGrayContrailList")
fun queryRoutingGrayLineList(
@Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId,
@Header("ticket") ticket: String = MoGoAiCloudClientConfig.getInstance().token,
@Query("sn") sn: String?
): Observable<QueryGrayContrailListRsp>
/**
* 开始一个路线的灰度任务
*/
@Headers("Content-type:application/json;charset=UTF-8")
@POST("/och-taxi-cabin/api/business/v1/startGray")
fun startGrayTask(
@Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId,
@Header("ticket") ticket: String = MoGoAiCloudClientConfig.getInstance().token,
@Body data: StartGrayContrailTaskReq
): Observable<StartGrayContrailTaskRsp>
/**
* 根据id查询灰度轨迹详情
*/
@Headers("Content-type:application/json;charset=UTF-8")
@GET("/och-taxi-cabin/api/business/v1/gray/contrail")
fun queryRoutingContrailById(
@Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId,
@Header("ticket") ticket: String = MoGoAiCloudClientConfig.getInstance().token,
@Query("id") contrailId: Long
): Observable<QueryRoutingContrailByIdRsp>
/**
* 上报路线打点
*/
@Headers("Content-type:application/json;charset=UTF-8")
@POST("/och-taxi-cabin/api/business/v1/saveDotDetail")
fun submitGrayLineIssueLocation(
@Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId,
@Header("ticket") ticket: String = MoGoAiCloudClientConfig.getInstance().token,
@Body data: SubmitGrayLineIssueLocationReq
): Observable<BaseData>
/**
* 结束一个路线的灰度任务
*/
@Headers("Content-type:application/json;charset=UTF-8")
@POST("/och-taxi-cabin/api/business/v1/endGray")
fun endGrayTask(
@Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId,
@Header("ticket") ticket: String = MoGoAiCloudClientConfig.getInstance().token,
@Body data: EndGrayContrailTaskReq
): Observable<BaseData>
}

View File

@@ -0,0 +1,130 @@
package com.mogo.och.taxi.network
import android.content.Context
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.data.BaseData
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.och.common.module.biz.constant.OchCommonConst
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
import com.mogo.och.common.module.biz.network.OchCommonSubscribeImpl
import com.mogo.och.common.module.biz.network.interceptor.transformTry
import com.mogo.och.taxi.bean.EndGrayContrailTaskReq
import com.mogo.och.taxi.bean.GrayLineBean
import com.mogo.och.taxi.bean.QueryGrayContrailListRsp
import com.mogo.och.taxi.bean.QueryRoutingContrailByIdRsp
import com.mogo.och.taxi.bean.StartGrayAndQueryContrailRsp
import com.mogo.och.taxi.bean.StartGrayContrailTaskReq
import com.mogo.och.taxi.bean.StartGrayContrailTaskRsp
import com.mogo.och.taxi.bean.SubmitGrayLineIssueLocationReq
import io.reactivex.Observable
object TaxiRoutingServiceManager {
private var mRoutingServiceApi: TaxiRoutingServiceApi =
MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(
TaxiRoutingServiceApi::class.java
)
/**
* 查询灰度路线列表
*/
fun queryRoutingGrayLineList(
context: Context,
callback: OchCommonServiceCallback<QueryGrayContrailListRsp>
) {
mRoutingServiceApi.queryRoutingGrayLineList(
sn = MoGoAiCloudClientConfig.getInstance().sn
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryRoutingGrayLineList"))
}
/**
* 开始一个灰度任务
*/
fun startGrayTask(
context: Context,
data: StartGrayContrailTaskReq,
callback: OchCommonServiceCallback<StartGrayContrailTaskRsp>
) {
mRoutingServiceApi.startGrayTask(data = data).transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "startGrayTask"))
}
/**
* 通过id查询轨迹详情
*/
fun queryRoutingContrailById(
context: Context,
contrailId: Long,
callback: OchCommonServiceCallback<QueryRoutingContrailByIdRsp>
) {
mRoutingServiceApi.queryRoutingContrailById(contrailId = contrailId).transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryRoutingContrailById"))
}
/**
* 上报线路打点
*/
fun submitGrayLineIssueLocation(
context: Context,
data: SubmitGrayLineIssueLocationReq,
callback: OchCommonServiceCallback<BaseData>
) {
mRoutingServiceApi.submitGrayLineIssueLocation(data = data).transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "submitGrayLineIssueLocation"))
}
/**
* 结束一个灰度任务
*/
fun endGrayTask(
context: Context,
data: EndGrayContrailTaskReq,
callback: OchCommonServiceCallback<BaseData>
) {
mRoutingServiceApi.endGrayTask(data = data).transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "endGrayTask"))
}
fun startGrayTaskAndQueryRoutingContrail(
context: Context,
sn: String,
contrailId: Long,
grayLineBean: GrayLineBean,
callback: OchCommonServiceCallback<StartGrayAndQueryContrailRsp>
) {
val data = StartGrayContrailTaskReq(sn = sn, contrailId = contrailId)
var taskId: Long
mRoutingServiceApi.startGrayTask(data = data)
.flatMap { startGrayRsp ->
if (startGrayRsp.data == null) {
taskId = -1L
val result = StartGrayAndQueryContrailRsp(
taskId = taskId,
contrail = null,
grayLineBean = grayLineBean
)
return@flatMap Observable.just(result)
}
taskId = startGrayRsp.data!!
return@flatMap mRoutingServiceApi.queryRoutingContrailById(contrailId = contrailId)
.map { queryRoutingContrailRsp ->
val result = StartGrayAndQueryContrailRsp(
taskId = taskId,
contrail = queryRoutingContrailRsp.data,
grayLineBean = grayLineBean
)
result
}
}
.transformTry()
.subscribe(
OchCommonSubscribeImpl(
context,
callback,
"startGrayTaskAndQueryRoutingContrail"
)
)
}
}

View File

@@ -7,24 +7,34 @@ import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.view.SpacesItemDecoration
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.common.module.utils.FlowBus
import com.mogo.och.taxi.R
import com.mogo.och.taxi.bean.TaxiRoutingQueryLineResponse
import com.mogo.och.taxi.bean.GrayLineBean
import com.mogo.och.taxi.constant.TaxiDriverEventConst
import kotlinx.android.synthetic.main.routing_choose_task_activity.btnChooseLineSubmit
import kotlinx.android.synthetic.main.routing_choose_task_activity.btnClose
import kotlinx.android.synthetic.main.routing_choose_task_activity.chooseLineListView
import kotlinx.android.synthetic.main.routing_no_data_common_view.noDataContainer
import kotlinx.coroutines.flow.map
class TaxiRoutingChooseTaskActivity : AppCompatActivity() {
class TaxiRoutingChooseLineActivity : AppCompatActivity() {
companion object {
const val TAG = "TaxiRoutingChooseTaskActivity"
const val TAG = "TaxiRoutingChooseLineActivity"
}
private val mViewModel: TaxiRoutingChooseLineViewModel by lazy {
ViewModelProvider(
this,
ViewModelProvider.NewInstanceFactory()
)[TaxiRoutingChooseLineViewModel::class.java]
}
private val mLoadingDialog: TaxiRoutingLoadingDialog by lazy {
@@ -34,14 +44,16 @@ class TaxiRoutingChooseTaskActivity : AppCompatActivity() {
}
private lateinit var mChooseLineListAdapter: TaxiRoutingChooseLineAdapter
private lateinit var mLinearLayoutManager: LinearLayoutManager
private val mRoutingLineList: MutableList<TaxiRoutingQueryLineResponse.Result> = ArrayList()
private var mCurrentChosenLineId: Int? = -1
private val mRoutingLineList: MutableList<GrayLineBean> = ArrayList()
private var mCurrentChosenPosition: Int = -1
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.routing_choose_task_activity)
initWindowParams()
initView()
initViewListener()
initViewModelObserver()
loadData()
}
@@ -69,20 +81,27 @@ class TaxiRoutingChooseTaskActivity : AppCompatActivity() {
mChooseLineListAdapter.setOnLineItemClickListener(object :
TaxiRoutingChooseLineAdapter.OnChooseLineItemClickListener {
override fun onItemClick(position: Int, close: Boolean) {
mCurrentChosenLineId = mRoutingLineList[position].lineId
mCurrentChosenPosition = position
}
})
}
private fun initViewListener() {
btnClose.setOnClickListener {
finish()
}
btnChooseLineSubmit.setOnClickListener {
if (mCurrentChosenLineId == -1) {
if (mCurrentChosenPosition == -1) {
ToastUtils.showLong("请先选择任务")
return@setOnClickListener
}
ToastUtils.showLong("当前选择的路线LineId:$mCurrentChosenLineId")
ToastUtils.showLong("当前选择的路线contrailId:$mCurrentChosenPosition")
mLoadingDialog.showLoading()
val chosenItem = mRoutingLineList[mCurrentChosenPosition]
mViewModel.sendUiIntent(
TaxiRoutingUiIntent.StartTaskAndQueryContrail(chosenItem)
)
// TODO
UiThreadHandler.postDelayed({
mLoadingDialog.hideLoading()
FlowBus.with<Int>(TaxiDriverEventConst.RoutingActivityEvent.EVENT_TYPE_GET_CHOSEN_LINE_TASK_ID)
@@ -93,6 +112,26 @@ class TaxiRoutingChooseTaskActivity : AppCompatActivity() {
}
}
private fun initViewModelObserver() {
lifecycleScope.launchWhenStarted {
mViewModel.uiStateFlow.map { it.routingUiState }.collect { routingUiState ->
CallerLogger.d(
TAG,
"uiStateFlow-initViewModelObserver: $routingUiState"
)
when (routingUiState) {
is RoutingUIState.Init -> {
showEmptyView()
}
is RoutingUIState.ShowGrayLineList -> {
onRoutingGrayLineListChanged(routingUiState.data)
}
}
}
}
}
private fun showEmptyView() {
chooseLineListView.visibility = View.GONE
btnChooseLineSubmit.visibility = View.GONE
@@ -105,41 +144,18 @@ class TaxiRoutingChooseTaskActivity : AppCompatActivity() {
noDataContainer.visibility = View.GONE
}
/**
* 初始化数据
*/
private fun loadData() {
//TODO
for (i in 1..10) {
val result = TaxiRoutingQueryLineResponse.Result()
result.lineId = i
result.name = "路线名称$i"
result.todayVerifyNum = 2
result.historyVerifyTotalUsableNum = 5
result.historyVerifyTotalNotUsableNum = 1
result.isChoosed = false
mRoutingLineList.add(result)
}
if (mRoutingLineList.isEmpty()) {
showEmptyView()
} else {
showRecyclerView()
mChooseLineListAdapter.notifyDataSetChanged()
}
mViewModel.sendUiIntent(TaxiRoutingUiIntent.QueryRoutingGrayLineList)
}
fun onRoutingLineDataChanged(data: TaxiRoutingQueryLineResponse?) {
if (data?.data?.isNotEmpty() == true) {
private fun onRoutingGrayLineListChanged(data: MutableList<GrayLineBean>) {
if (data.isNotEmpty()) {
showRecyclerView()
mRoutingLineList.clear()
mRoutingLineList.addAll(data.data)
mRoutingLineList.addAll(data)
mChooseLineListAdapter.notifyDataSetChanged()
} else {
showEmptyView()
}
}
override fun onDestroy() {
super.onDestroy()
}
}

View File

@@ -8,11 +8,11 @@ import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatTextView
import androidx.recyclerview.widget.RecyclerView
import com.mogo.och.taxi.R
import com.mogo.och.taxi.bean.TaxiRoutingQueryLineResponse
import com.mogo.och.taxi.bean.GrayLineBean
class TaxiRoutingChooseLineAdapter(
private val mContext: Context,
private val mData: List<TaxiRoutingQueryLineResponse.Result>
private val mData: List<GrayLineBean>
) : RecyclerView.Adapter<TaxiRoutingChooseLineAdapter.SwitchLineViewHolder>() {
companion object {
@@ -32,10 +32,10 @@ class TaxiRoutingChooseLineAdapter(
override fun onBindViewHolder(holder: SwitchLineViewHolder, position: Int) {
val currentPosition = holder.bindingAdapterPosition
val data = mData[currentPosition]
holder.lineNameTextView.text = data.name
holder.todayVerifyNumTextView.text = "本车今日已验证:${data.todayVerifyNum}"
holder.lineNameTextView.text = data.lineName
holder.todayVerifyNumTextView.text = "本车今日已验证:${data.carVerificationCount}"
holder.historyVerifyNumTextView.text =
"路线累计反馈${data.historyVerifyTotalUsableNum}可用,${data.historyVerifyTotalNotUsableNum}不可用"
"路线累计反馈${data.lineSuccessCount}可用,${data.lineFailCount}不可用"
if (data.isChoosed) {
holder.itemView.setBackgroundResource(R.drawable.routing_choose_line_shape_select_line_item_bg_selected)
} else {

View File

@@ -0,0 +1,94 @@
package com.mogo.och.taxi.ui.routing
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.och.taxi.base.BaseViewModel
import com.mogo.och.taxi.base.IUiIntent
import com.mogo.och.taxi.bean.GrayLineBean
import com.mogo.och.taxi.bean.StartGrayAndQueryContrailRsp
import com.mogo.och.taxi.callback.ITaxiRoutingCallback
class TaxiRoutingChooseLineViewModel : BaseViewModel<TaxiRoutingUiState, TaxiRoutingUiIntent>(),
ITaxiRoutingCallback {
private val TAG = SceneConstant.M_TAXI + "TaxiRoutingChooseLineViewModel"
init {
TaxiRoutingModel.addTaxiRoutingListener(TAG, this)
}
override fun initUiState(): TaxiRoutingUiState {
return TaxiRoutingUiState(RoutingUIState.Init)
}
override fun handleIntent(intent: IUiIntent) {
when (intent) {
is TaxiRoutingUiIntent.QueryRoutingGrayLineList -> {
TaxiRoutingModel.queryRoutingGrayLineList()
}
is TaxiRoutingUiIntent.StartTaskAndQueryContrail -> {
val contrailId = intent.grayLineBean.contrailId
TaxiRoutingModel.startGrayTaskAndQueryRoutingContrail(
contrailId ?: -1L,
intent.grayLineBean
)
}
}
}
override fun onQueryRoutingGrayLineListSuccess(data: MutableList<GrayLineBean>) {
sendUiState {
copy(
routingUiState = RoutingUIState.ShowGrayLineList(data)
)
}
}
override fun onQueryRoutingGrayLineListFailed(errorStr: String) {
// sendUiState {
// copy(
// routingUiState = RoutingUIState.Init
// )
// }
//TODO
val data: MutableList<GrayLineBean> = mutableListOf()
for (i in 1..15) {
val result = GrayLineBean(
lineId = i + 1L,
lineName = "路线名称$i",
contrailId = i + 1L,
carVerificationCount = i,
lineSuccessCount = i,
lineFailCount = i,
isChoosed = false
)
data.add(result)
}
sendUiState {
copy(
routingUiState = RoutingUIState.ShowGrayLineList(data)
)
}
}
override fun onStartGrayTaskAndQueryContrailSuccess(data: StartGrayAndQueryContrailRsp) {
sendUiState {
copy(
routingUiState = RoutingUIState.RoutingTask(
grayId = data.taskId,
grayLineBean = data.grayLineBean,
contrailBean = data.contrail
)
)
}
}
override fun onStartGrayTaskAndQueryContrailFailed(errorStr: String) {
}
override fun onCleared() {
super.onCleared()
TaxiRoutingModel.removeTaxiRoutingListener(TAG)
}
}

View File

@@ -1,12 +1,12 @@
package com.mogo.och.taxi.ui.routing
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import com.mogo.commons.mvp.BaseFragment
import com.mogo.eagle.core.function.main.MainMoGoApplication
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.common.module.utils.FlowBus
@@ -20,11 +20,12 @@ import kotlinx.android.synthetic.main.routing_fragment.headerTitleContainer
import kotlinx.android.synthetic.main.routing_fragment.mCurrentTaskLayout
import kotlinx.android.synthetic.main.routing_fragment.noDataContainer
import kotlinx.android.synthetic.main.routing_fragment.taskTitleTv
import kotlinx.coroutines.flow.map
class TaxiRoutingFragment : BaseFragment() {
companion object {
const val TAG = SceneConstant.M_TAXI + "RoutingFragment"
const val TAG = SceneConstant.M_TAXI + "TaxiRoutingFragment"
fun newInstance(): TaxiRoutingFragment {
val args = Bundle()
@@ -34,39 +35,69 @@ class TaxiRoutingFragment : BaseFragment() {
}
}
private val mViewModel: TaxiRoutingFragmentViewModel by lazy {
ViewModelProvider(
this,
ViewModelProvider.NewInstanceFactory()
)[TaxiRoutingFragmentViewModel::class.java]
}
override fun getLayoutId(): Int {
return R.layout.routing_fragment
}
override fun getTagName(): String {
return "RoutingFragment"
return "TaxiRoutingFragment"
}
override fun initViews() {
btnChooseTask.setOnClickListener {
val intent = Intent(context, TaxiRoutingChooseTaskActivity::class.java)
startActivity(intent)
}
showChooseTaskView()
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
initEventBus()
return super.onCreateView(inflater, container, savedInstanceState)
initViewListener()
initViewModelObserver()
}
private fun initEventBus() {
FlowBus.with<Int>(TaxiDriverEventConst.RoutingActivityEvent.EVENT_TYPE_GET_CHOSEN_LINE_TASK_ID)
.register(this) { taskId ->
ToastUtils.showLong("接收到taskId:$taskId")
showCurrentLineTaskContentView()
FlowBus.with<RoutingUIState.RoutingTask>(TaxiDriverEventConst.RoutingActivityEvent.EVENT_TYPE_GET_CHOSEN_LINE_TASK_ID)
.register(this) { task ->
ToastUtils.showLong("接收到taskId:${task.grayId}")
mViewModel.sendUiIntent(TaxiRoutingUiIntent.ShowRoutingTask(task))
}
}
private fun initViewListener() {
btnChooseTask.setOnClickListener {
mViewModel.sendUiIntent(TaxiRoutingUiIntent.StartChooseLineAction)
}
}
private fun initViewModelObserver() {
lifecycleScope.launchWhenStarted {
mViewModel.uiStateFlow.map { it.routingUiState }.collect { routingUiState ->
CallerLogger.d(
TAG,
"uiStateFlow-initViewModelObserver: $routingUiState"
)
when (routingUiState) {
is RoutingUIState.Init -> {
showChooseTaskView()
}
is RoutingUIState.RoutingTask -> {
showCurrentLineTaskContentView(routingUiState)
}
is RoutingUIState.ShowFinishTaskButton -> {
showFinishTaskView()
}
is RoutingUIState.ShowFeedbackDialog -> {
showFeedbackDialog()
}
}
}
}
}
private fun showChooseTaskView() {
noDataContainer.visibility = View.VISIBLE
mCurrentTaskLayout.visibility = View.GONE
@@ -77,17 +108,17 @@ class TaxiRoutingFragment : BaseFragment() {
finishSubmitIssueGroup.visibility = View.GONE
}
private fun showCurrentLineTaskContentView() {
private fun showCurrentLineTaskContentView(data: RoutingUIState.RoutingTask) {
noDataContainer.visibility = View.GONE
mCurrentTaskLayout.visibility = View.VISIBLE
headerTitleContainer.visibility = View.VISIBLE
taskTitleTv.text = "测试任务测试任务"
taskTitleTv.text = data.grayLineBean.lineName
btnChooseTask.visibility = View.GONE
btnStartTask.visibility = View.VISIBLE
btnStartTask.setOnClickListener {
showFinishTaskView()
mViewModel.sendUiIntent(TaxiRoutingUiIntent.StartTaskAction)
}
finishSubmitIssueGroup.visibility = View.GONE
}
@@ -97,7 +128,7 @@ class TaxiRoutingFragment : BaseFragment() {
btnStartTask.visibility = View.GONE
finishSubmitIssueGroup.visibility = View.VISIBLE
btnFinishTask.setOnClickListener {
showFeedbackDialog()
mViewModel.sendUiIntent(TaxiRoutingUiIntent.ShowFeedbackDialog)
}
}

View File

@@ -0,0 +1,53 @@
package com.mogo.och.taxi.ui.routing
import android.content.Context
import android.content.Intent
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.och.taxi.base.BaseViewModel
import com.mogo.och.taxi.base.IUiIntent
class TaxiRoutingFragmentViewModel : BaseViewModel<TaxiRoutingUiState, TaxiRoutingUiIntent>() {
companion object {
const val TAG = SceneConstant.M_TAXI + "TaxiRoutingFragmentViewModel"
}
private val mContext: Context
get() = AbsMogoApplication.getApp().applicationContext
override fun initUiState(): TaxiRoutingUiState {
return TaxiRoutingUiState(RoutingUIState.Init)
}
override fun handleIntent(intent: IUiIntent) {
when (intent) {
is TaxiRoutingUiIntent.StartChooseLineAction -> {
val intent = Intent(mContext, TaxiRoutingChooseLineActivity::class.java)
mContext?.startActivity(intent)
}
is TaxiRoutingUiIntent.ShowRoutingTask -> {
val task = intent.routingTask
sendUiState {
copy(
routingUiState = RoutingUIState.RoutingTask(
task.grayLineBean,
task.contrailBean,
task.grayId
)
)
}
}
is TaxiRoutingUiIntent.StartTaskAction -> {
//TODO 启动自动驾驶
sendUiState {
copy(
routingUiState = RoutingUIState.ShowFinishTaskButton
)
}
}
}
}
}

View File

@@ -0,0 +1,154 @@
package com.mogo.och.taxi.ui.routing
import android.content.Context
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.commons.AbsMogoApplication
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.NetworkUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
import com.mogo.och.taxi.bean.GrayLineBean
import com.mogo.och.taxi.bean.QueryGrayContrailListRsp
import com.mogo.och.taxi.bean.StartGrayAndQueryContrailRsp
import com.mogo.och.taxi.callback.ITaxiRoutingCallback
import com.mogo.och.taxi.network.TaxiRoutingServiceManager
import java.util.concurrent.ConcurrentHashMap
object TaxiRoutingModel {
private val TAG = SceneConstant.M_TAXI + TaxiRoutingModel::class.java.simpleName
private val mContext: Context
get() = AbsMogoApplication.getApp().applicationContext
private val mTaxiRoutingCallbackMap: ConcurrentHashMap<String, ITaxiRoutingCallback> =
ConcurrentHashMap()
fun addTaxiRoutingListener(tag: String, listener: ITaxiRoutingCallback) {
if (mTaxiRoutingCallbackMap.containsKey(tag)) {
return
}
mTaxiRoutingCallbackMap[tag] = listener
}
fun removeTaxiRoutingListener(tag: String) {
if (!mTaxiRoutingCallbackMap.containsKey(tag)) {
return
}
mTaxiRoutingCallbackMap.remove(tag)
}
fun queryRoutingGrayLineList() {
TaxiRoutingServiceManager.queryRoutingGrayLineList(mContext,
object : OchCommonServiceCallback<QueryGrayContrailListRsp> {
override fun onSuccess(data: QueryGrayContrailListRsp) {
CallerLogger.d(
TAG,
"queryRoutingGrayLineList onSuccess: data=${GsonUtils.toJson(data)}"
)
val result = mutableListOf<GrayLineBean>()
data.data?.also {
result.addAll(it)
}
mTaxiRoutingCallbackMap.forEach {
val listener = it.value
listener.onQueryRoutingGrayLineListSuccess(result)
}
}
override fun onFail(code: Int, msg: String?) {
CallerLogger.d(
TAG,
"queryRoutingGrayLineList onFail: code=$code, msg=$msg"
)
ToastUtils.showShort("查询灰度线路列表异常, 请稍后重试, code=$code")
mTaxiRoutingCallbackMap.forEach {
val listener = it.value
listener.onQueryRoutingGrayLineListFailed(
msg ?: "查询灰度线路列表异常, 请稍后重试"
)
}
}
override fun onError() {
super.onError()
var hintStr = ""
if (!NetworkUtils.isConnected(mContext)) {
hintStr = "网络出现异常,请稍后重试"
ToastUtils.showShort(hintStr)
} else {
hintStr = "查询灰度线路列表异常, 请稍后重试"
ToastUtils.showShort(hintStr)
}
CallerLogger.d(
TAG,
"queryRoutingGrayLineList onError, msg=$hintStr"
)
mTaxiRoutingCallbackMap.forEach {
val listener = it.value
listener.onQueryRoutingGrayLineListFailed(hintStr)
}
}
})
}
fun startGrayTaskAndQueryRoutingContrail(contrailId: Long, grayLineBean: GrayLineBean) {
TaxiRoutingServiceManager.startGrayTaskAndQueryRoutingContrail(
mContext,
sn = MoGoAiCloudClientConfig.getInstance().sn,
contrailId = contrailId,
grayLineBean = grayLineBean,
object : OchCommonServiceCallback<StartGrayAndQueryContrailRsp> {
override fun onSuccess(data: StartGrayAndQueryContrailRsp) {
CallerLogger.d(
TAG,
"startGrayTaskAndQueryRoutingContrail onSuccess: data=${
GsonUtils.toJson(
data
)
}"
)
mTaxiRoutingCallbackMap.forEach {
val listener = it.value
listener.onStartGrayTaskAndQueryContrailSuccess(data)
}
}
override fun onFail(code: Int, msg: String?) {
CallerLogger.d(
TAG,
"startGrayTaskAndQueryRoutingContrail onFail: code=$code, msg=$msg"
)
mTaxiRoutingCallbackMap.forEach {
val listener = it.value
listener.onStartGrayTaskAndQueryContrailFailed(
msg ?: "startGrayTaskAndQueryRoutingContrail onFail"
)
}
}
override fun onError() {
super.onError()
var hintStr = ""
if (!NetworkUtils.isConnected(mContext)) {
hintStr = "网络出现异常,请稍后重试"
ToastUtils.showShort(hintStr)
} else {
hintStr = "开始任务并查询轨迹详情异常, 请稍后重试"
ToastUtils.showShort(hintStr)
}
CallerLogger.d(
TAG,
"startGrayTaskAndQueryRoutingContrail onError, msg=$hintStr"
)
mTaxiRoutingCallbackMap.forEach {
val listener = it.value
listener.onStartGrayTaskAndQueryContrailFailed(hintStr)
}
}
}
)
}
}

View File

@@ -0,0 +1,26 @@
package com.mogo.och.taxi.ui.routing
import com.mogo.och.taxi.base.IUiIntent
import com.mogo.och.taxi.bean.GrayLineBean
sealed class TaxiRoutingUiIntent : IUiIntent {
//打开选择路线页面
object StartChooseLineAction : TaxiRoutingUiIntent()
//查询灰度线路列表
object QueryRoutingGrayLineList : TaxiRoutingUiIntent()
//开始一个任务并查询此任务对应的轨迹详情
data class StartTaskAndQueryContrail(val grayLineBean: GrayLineBean) : TaxiRoutingUiIntent()
//展示Routing任务信息
data class ShowRoutingTask(val routingTask: RoutingUIState.RoutingTask) :
TaxiRoutingUiIntent()
//开始任务
object StartTaskAction : TaxiRoutingUiIntent()
//展示结束任务反馈弹框
object ShowFeedbackDialog : TaxiRoutingUiIntent()
}

View File

@@ -0,0 +1,23 @@
package com.mogo.och.taxi.ui.routing
import com.mogo.och.taxi.base.IUiState
import com.mogo.och.taxi.bean.ContrailBean
import com.mogo.och.taxi.bean.GrayLineBean
data class TaxiRoutingUiState(val routingUiState: RoutingUIState) : IUiState
sealed class RoutingUIState {
object Init : RoutingUIState()
data class RoutingTask(
val grayLineBean: GrayLineBean?,
val contrailBean: ContrailBean?,
val grayId: Long?
) : RoutingUIState()
object ShowFinishTaskButton : RoutingUIState()
object ShowFeedbackDialog : RoutingUIState()
data class ShowGrayLineList(var data: MutableList<GrayLineBean>) : RoutingUIState()
}

View File

@@ -163,7 +163,7 @@ TAXI_DRIVER_VERSION=6.1.2
TAXI_PASSENGER_VERSION=5.1.0
# 出租车模式司机端版本号
TAXIUNMANNED_DRIVER_VERSION=6.1.2
TAXIUNMANNED_DRIVER_VERSION=6.2.2
# 出租车模式乘客端端版本号
TAXIUNMANNED_PASSENGER_VERSION=5.1.0