[自主算路验证] feat: 增加接口定义及管理类,Model, ViewModel 各层次之间依赖等;
This commit is contained in:
@@ -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" />
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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;//当前是否选中
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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>
|
||||
}
|
||||
@@ -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"
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user