diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiFragment.kt index b378fea9e1..8f3ee0fbc9 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiFragment.kt @@ -142,12 +142,12 @@ class TaxiFragment : BaseTaxiTabFragment(), override fun onChangeOperationStatus() { super.onChangeOperationStatus() if (null == taskTabFragment || taskTabFragment!!.get() == null) return - taskTabFragment!!.get()!!.onOperationStatusChanged() + taskTabFragment!!.get()!!.onCarTakeOrderStatusChanged() } fun updateNextTaskFragment(taskAndOrder: QueryCurrentTaskRespBean.Result?) { if (null == taskTabFragment || taskTabFragment!!.get() == null) return - taskTabFragment!!.get()!!.updateOrderChanged(taskAndOrder) + taskTabFragment!!.get()!!.onTaskDataChanged(taskAndOrder) } fun switchVRFlatMode(isVRMode: Boolean) { @@ -209,7 +209,7 @@ class TaxiFragment : BaseTaxiTabFragment(), fun onNaviToEnd(isAmap: Boolean, isShow: Boolean) { if (isAmap) { if (null == taskTabFragment || taskTabFragment!!.get() == null) return - taskTabFragment!!.get()!!.onNaviToEndAMap(isShow) + taskTabFragment!!.get()!!.onNaviToEndStationByAMap(isShow) } else if (isShow) { //使用routing数据 showRoutingToStationFragment(true) } else { @@ -245,7 +245,7 @@ class TaxiFragment : BaseTaxiTabFragment(), fun onCurrentOrderDistToEndChanged(meters: Long, timeInSecond: Long) { if (null == taskTabFragment || taskTabFragment!!.get() == null) return - taskTabFragment!!.get()!!.onCurrentOrderDistToEndChanged(meters, timeInSecond) + taskTabFragment!!.get()!!.onCurrentTaskTripInfoChanged(meters, timeInSecond) } private fun testRouteInfoUpload() { diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskFragment.kt index 4d26024b3d..ea1ce280b3 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskFragment.kt @@ -5,9 +5,9 @@ import android.graphics.Color import android.graphics.drawable.GradientDrawable import android.os.Build import android.os.Bundle -import android.text.Html import android.view.View import androidx.annotation.RequiresApi +import androidx.core.content.ContextCompat import androidx.core.text.HtmlCompat import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope @@ -16,17 +16,15 @@ import com.mogo.commons.mvp.BaseFragment import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getState import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02 +import com.mogo.eagle.core.function.main.MainMoGoApplication import com.mogo.eagle.core.network.utils.GsonUtil 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.logger.scene.SceneConstant.Companion.M_TAXI -import com.mogo.eagle.core.utilcode.util.DateTimeUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.map.AmapNaviToDestinationModel import com.mogo.och.common.module.map.ICommonNaviChangedCallback -import com.mogo.och.common.module.utils.DateTimeUtil -import com.mogo.och.common.module.utils.NumberFormatUtil import com.mogo.och.common.module.wigets.OCHCommitDialog import com.mogo.och.taxi.R import com.mogo.och.taxi.bean.OrderDetail @@ -41,13 +39,14 @@ import com.mogo.och.taxi.constant.TaxiUnmannedConst.Companion.TYPE_MARKER_TAXI_O import com.mogo.och.taxi.model.TaxiModel import com.mogo.och.taxi.ui.base.TaxiFragment import com.mogo.och.taxi.ui.task.TaxiCurrentTaskViewModel -import com.mogo.och.taxi.ui.unmanned.TaskAndOrderUiState +import com.mogo.och.taxi.ui.unmanned.TaskWithOrderUIState import com.mogo.och.taxi.ui.unmanned.UnmannedIntent import com.mogo.och.taxi.utils.MapMakerManager +import com.mogo.och.taxi.utils.TaskUtils import kotlinx.android.synthetic.main.task_fragment_current.cancelOrder import kotlinx.android.synthetic.main.task_fragment_current.endPoint import kotlinx.android.synthetic.main.task_fragment_current.endStationName -import kotlinx.android.synthetic.main.task_fragment_current.mBeingOrderLayout +import kotlinx.android.synthetic.main.task_fragment_current.mCurrentTaskLayout import kotlinx.android.synthetic.main.task_fragment_current.naviToEnd import kotlinx.android.synthetic.main.task_fragment_current.naviToStart import kotlinx.android.synthetic.main.task_fragment_current.noTaskData @@ -60,9 +59,6 @@ import kotlinx.android.synthetic.main.task_fragment_current.taskStatus import kotlinx.android.synthetic.main.task_fragment_current.taskTypeTv import kotlinx.android.synthetic.main.taxi_no_data_common_view.noOrderDataTv import kotlinx.coroutines.flow.map -import java.util.Calendar -import kotlin.math.ceil -import kotlin.math.roundToInt /** * @author: wangmingjun @@ -95,7 +91,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), } override fun getTagName(): String { - return "TaxiCurrentTaskFragment" + return this.javaClass.simpleName } override fun onCreate(savedInstanceState: Bundle?) { @@ -116,7 +112,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), /** * 是否有正在进行的订单,进行UI显示 * - * @param being + * @param hasCurrentTask */ private fun initContainerView(hasCurrentTask: Boolean) { d( @@ -126,11 +122,11 @@ class TaxiCurrentTaskFragment : BaseFragment(), try { if (hasCurrentTask) { noTaskData.visibility = View.GONE - mBeingOrderLayout.visibility = View.VISIBLE + mCurrentTaskLayout.visibility = View.VISIBLE } else { noTaskData.visibility = View.VISIBLE noOrderDataTv.text = "暂无进行中订单" - mBeingOrderLayout.visibility = View.GONE + mCurrentTaskLayout.visibility = View.GONE } } catch (e: NullPointerException) { //可能会出现订单信息已经轮询回来,但进行中页面控件还未初始化完成的情况 TaxiModel.clearCurrentOCHOrder() @@ -158,17 +154,17 @@ class TaxiCurrentTaskFragment : BaseFragment(), //监听返回的数据状态 lifecycleScope.launchWhenStarted { - mViewModel.uiStateFlow.map { it.taskAndOrderUiState }.collect { taskAndOrderUiState -> + mViewModel.uiStateFlow.map { it.taskWithOrderUIState }.collect { taskAndOrderUiState -> d(TAG, "uiStateFlow-initViewModelObserver: $taskAndOrderUiState") when (taskAndOrderUiState) { - is TaskAndOrderUiState.INIT -> { + is TaskWithOrderUIState.Init -> { } - is TaskAndOrderUiState.TASKANDORDER -> { - mDriveToNearestStationTask = taskAndOrderUiState.untruthTask - mCurrentTaskWithOrder = taskAndOrderUiState.taskAndOrder + is TaskWithOrderUIState.TaskWithOrder -> { + mDriveToNearestStationTask = taskAndOrderUiState.driveToNearestStationTask + mCurrentTaskWithOrder = taskAndOrderUiState.taskWithOrder - if ((taskAndOrderUiState.untruthTask == null + if ((taskAndOrderUiState.driveToNearestStationTask == null && mCurrentTaskWithOrder != null && mCurrentTaskWithOrder!!.endSite == null) || mCurrentTaskWithOrder == null @@ -178,15 +174,15 @@ class TaxiCurrentTaskFragment : BaseFragment(), return@collect } - if (taskAndOrderUiState.untruthTask != null) { - updateDriveToNearestStationTaskView(taskAndOrderUiState.untruthTask) + if (taskAndOrderUiState.driveToNearestStationTask != null) { + updateViewByDriveToNearestStationTask(taskAndOrderUiState.driveToNearestStationTask) } else { - updateNextTaskFragment(taskAndOrderUiState.taskAndOrder) - updateCurrentTaskAndOrderStatusChanged(taskAndOrderUiState.taskAndOrder) + updateNextTaskFragment(taskAndOrderUiState.taskWithOrder) + updateViewByCurrentTaskWithOrder(taskAndOrderUiState.taskWithOrder) } } - is TaskAndOrderUiState.UPDATEORDERMILEANDDUR -> { + is TaskWithOrderUIState.UpdateTaskTripInfo -> { taskOtherInfo.text = QueryCurrentTaskRespBean.Result.getCurrentTaskTotalAndDurationHtml( taskAndOrderUiState.mileage, @@ -198,10 +194,10 @@ class TaxiCurrentTaskFragment : BaseFragment(), } } - private fun updateDriveToNearestStationTaskView(driveToNearestStationTask: StartServiceRespBean.Result?) { + private fun updateViewByDriveToNearestStationTask(driveToNearestStationTask: StartServiceRespBean.Result?) { if (driveToNearestStationTask == null) return initContainerView(true) - // DriverToNearestStationTask 更新 + // DriverToNearestStationTask 任务更新 taskStatus.visibility = View.VISIBLE taskTypeTv.visibility = View.GONE cancelOrder.visibility = View.GONE @@ -244,8 +240,8 @@ class TaxiCurrentTaskFragment : BaseFragment(), } } - fun onOperationStatusChanged() { - mViewModel.sendUiIntent(UnmannedIntent.StartOrPauseReceivingOrder) + fun onCarTakeOrderStatusChanged() { + mViewModel.sendUiIntent(UnmannedIntent.StartOrPauseTakeOrder) } private fun updateRemainDistanceAndTime(isVoicePlay: Boolean) { @@ -272,10 +268,10 @@ class TaxiCurrentTaskFragment : BaseFragment(), } /** - * 任务和订单信息 + * 更新当前任务和订单信息 */ @SuppressLint("SetTextI18n", "UseCompatLoadingForDrawables") - fun updateCurrentTaskAndOrderStatusChanged(taskAndOrder: QueryCurrentTaskRespBean.Result?) { + fun updateViewByCurrentTaskWithOrder(taskAndOrder: QueryCurrentTaskRespBean.Result?) { if (taskAndOrder == null) return if ((taskAndOrder.endSite == null || taskAndOrder.currentStatus == TaskStatusEnum.CompleteTask.code) && taskAndOrder.order == null @@ -293,15 +289,39 @@ class TaxiCurrentTaskFragment : BaseFragment(), * 当前任务是接驾任务,显示订单状态+运营单 订单显示在进行中, 任务不再显示 */ val taskType = taskAndOrder.taskType // 任务类型 - val order = taskAndOrder.order // 订单 - val startSite = taskAndOrder.startSite //进行的任务 - val endSite = taskAndOrder.endSite //进行的任务 - val currentStatus = taskAndOrder.currentStatus // 任务的状态 - - updateUIShowStatus(taskType, currentStatus, order) + val order = taskAndOrder.order // 订单信息 + val startSite = taskAndOrder.startSite // 起点 + val endSite = taskAndOrder.endSite // 终点 + val currentStatus = taskAndOrder.currentStatus // 任务的状态 0:空闲 1:获取任务 2:开始任务 3:到达目的地 when (taskType) { + TaskTypeEnum.None.code -> { + if (order != null && currentStatus == TaskStatusEnum.CompleteTask.code) { + handleOrderView(order) + } + } + TaskTypeEnum.VirtualTask.code -> { //演练任务 + cancelOrder.visibility = View.GONE + orderPhoneAndNum.visibility = View.GONE + taskClickBtn.visibility = View.GONE + + naviToStart.visibility = View.GONE + taskTypeTv.visibility = View.VISIBLE + naviToEnd.visibility = + if (currentStatus >= TaskStatusEnum.StartTask.code) View.VISIBLE else View.GONE + taskOtherInfo.visibility = + if (currentStatus == TaskStatusEnum.GetTask.code) View.GONE else View.VISIBLE + } + + TaskTypeEnum.ToOrderEndTask.code, TaskTypeEnum.ToOrderStartTask.code -> {// 接驾任务 或 送驾任务 + order.also { + handleOrderView(it) + } + } + } + + when (taskType) { TaskTypeEnum.VirtualTask.code -> {// 演练任务 if (order != null && currentStatus == TaskStatusEnum.CompleteTask.code) { updateOrderUI(order) @@ -331,7 +351,6 @@ class TaxiCurrentTaskFragment : BaseFragment(), } updateMapMarkers() - updateRemainDistanceAndTime(false) } @@ -394,14 +413,18 @@ class TaxiCurrentTaskFragment : BaseFragment(), } else { d( M_TAXI + TAG, - "CurrentTaskAndOrder == " + GsonUtil.jsonFromObject(mCurrentTaskWithOrder) + "CurrentTaskWithOrder == " + GsonUtil.jsonFromObject(mCurrentTaskWithOrder) ) } } private fun updateOrderUI(order: OrderDetail) { taskTypeTv.text = resources.getString(R.string.task_order) - taskTypeTv.background = resources.getDrawable(R.drawable.task_order_type_btn_bg, null) + taskTypeTv.background = + ContextCompat.getDrawable( + MainMoGoApplication.getApp().applicationContext, + R.drawable.task_order_type_btn_bg + ) orderPhoneAndNum.text = HtmlCompat.fromHtml( " " + order.bookingUserPhone + "" + " | " + @@ -414,24 +437,25 @@ class TaxiCurrentTaskFragment : BaseFragment(), when (order.orderStatus) { TaxiOrderStatusEnum.None.code -> { //无 initContainerView(false) + removeAllMapMarker() } TaxiOrderStatusEnum.ArriveAtEnd.code -> { //到达目的地 taskStatus.text = resources.getString(R.string.task_start_end_site) updateStartAndEndStationPointByStatus(true) - updateOrderBottomBtn( + updateTaskContainerBottomBtn( getString(R.string.module_och_taxi_order_server_end), Color.parseColor("#FFFFFF"), Color.parseColor("#FF1D5EF3"), true ) - hideNavi() + hideNaviBtns() } TaxiOrderStatusEnum.OnTheWayToEnd.code -> { //送驾中 taskStatus.text = resources.getString(R.string.task_start_end_site) updateStartAndEndStationPointByStatus(true) - updateOrderBottomBtn( + updateTaskContainerBottomBtn( getString(R.string.module_och_taxi_order_close), Color.parseColor("#FFFFFF"), Color.parseColor("#FF1D5EF3"), @@ -440,10 +464,10 @@ class TaxiCurrentTaskFragment : BaseFragment(), } TaxiOrderStatusEnum.UserArriveAtStart.code, TaxiOrderStatusEnum.ArriveAtStart.code -> { - //乘客到达上车点,验证成功 ; 到达乘客上车点 - updateStartAndEndStationPointByStatus(false) + //乘客到达上车点, 验证成功 ; 到达乘客上车点 taskStatus.text = resources.getString(R.string.arrived_start_site) - updateOrderBottomBtn( + updateStartAndEndStationPointByStatus(false) + updateTaskContainerBottomBtn( if (order.orderStatus == TaxiOrderStatusEnum.UserArriveAtStart.code) getString(R.string.module_och_taxi_order_server_start) else getString(R.string.module_och_taxi_order_server_start_wait_check), @@ -451,14 +475,14 @@ class TaxiCurrentTaskFragment : BaseFragment(), Color.parseColor("#FF1D5EF3"), true ) - updateOtherInfo() - hideNavi() + hideNaviBtns() + taskOtherInfo.text = TaskUtils.getWaitTimeHtml() } TaxiOrderStatusEnum.OnTheWayToStart.code -> { //前往上车地点 taskStatus.text = resources.getString(R.string.task_start_start_site) updateStartAndEndStationPointByStatus(false) - updateOrderBottomBtn( + updateTaskContainerBottomBtn( getString(R.string.module_och_taxi_order_server_start), Color.parseColor("#4DFFFFFF"), Color.parseColor("#4D1D5EF3"), @@ -468,60 +492,6 @@ class TaxiCurrentTaskFragment : BaseFragment(), } } - private fun updateOtherInfo() { - val currentCale = DateTimeUtils.getCurrentDateTime() - val currentDay = - DateTimeUtil.formatCalendarToString(currentCale, DateTimeUtil.yyyy_MM_dd) - - currentCale.add(Calendar.MINUTE, 10) - val strHtml13: String = if (currentDay == DateTimeUtil.formatCalendarToString( - currentCale, - DateTimeUtil.yyyy_MM_dd - ) - ) { - ("免费等待至 " - + "" + DateTimeUtil.formatCalendarToString( - currentCale, - DateTimeUtil.HH_mm - ) + "") - } else { - ("免费等待至" - + "" + DateTimeUtil.formatCalendarToString( - currentCale, - DateTimeUtil.MM_dd_HH_mm - ) + "") - } - taskOtherInfo.text = HtmlCompat.fromHtml(strHtml13, HtmlCompat.FROM_HTML_MODE_LEGACY) - } - - private fun updateUIShowStatus(taskType: Int, currentStatus: Int, order: OrderDetail?) { - when (taskType) { - TaskTypeEnum.None.code -> { - if (order != null && currentStatus == TaskStatusEnum.CompleteTask.code) { - handleOrderView(order) - } - } - - TaskTypeEnum.VirtualTask.code -> { //演练任务 - cancelOrder.visibility = View.GONE - orderPhoneAndNum.visibility = View.GONE - taskClickBtn.visibility = View.GONE -// currentStatus 0:空闲 1:获取任务 2:开始任务 3:到达目的地 - naviToStart.visibility = View.GONE - taskTypeTv.visibility = View.VISIBLE - naviToEnd.visibility = - if (currentStatus >= TaskStatusEnum.StartTask.code) View.VISIBLE else View.GONE - taskOtherInfo.visibility = - if (currentStatus == TaskStatusEnum.GetTask.code) View.GONE else View.VISIBLE - } - - TaskTypeEnum.ToOrderEndTask.code, TaskTypeEnum.ToOrderStartTask.code -> {// 运营单(接驾任务、送驾任务) - if (order == null) return - handleOrderView(order) - } - } - } - private fun handleOrderView(order: OrderDetail?) { if (order == null) return cancelOrder.visibility = View.VISIBLE @@ -542,13 +512,12 @@ class TaxiCurrentTaskFragment : BaseFragment(), } - private fun hideNavi() { + private fun hideNaviBtns() { naviToStart.visibility = View.GONE naviToEnd.visibility = View.GONE AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi() mTaxiFragment?.showAmapNaviToStationFragment(false) mTaxiFragment?.showRoutingToStationFragment(false) - requireParentFragment() } private fun startNaviToStation(isVoicePlay: Boolean, stationLat: Double, stationLng: Double) { @@ -568,40 +537,18 @@ class TaxiCurrentTaskFragment : BaseFragment(), /** * 剩余里程和剩余时间 - * @param meters m + * @param meters 米 * @param timeInSecond 秒 */ - fun updateDistanceAndTime(meters: Long, timeInSecond: Long) { -// CallerLogger.INSTANCE.d(M_TAXI + TAG,"meters = "+meters+"timeInSecond ="+timeInSecond); + fun updateCurrentTaskTripInfo(meters: Long, timeInSecond: Long) { if (mCurrentTaskWithOrder == null) return if (mCurrentTaskWithOrder!!.endSite == null && mDriveToNearestStationTask == null) return - - var dis = "0" - var disUnit = "公里" - if (meters > 0) { - if (meters / 1000 < 1) { - disUnit = "米" - dis = meters.toFloat().roundToInt().toString() - } else { - disUnit = "公里" - dis = NumberFormatUtil.formatLong(meters.toDouble() / 1000) - } - } - val min = ceil(timeInSecond.toDouble() / 60f).toInt() - val strHtml2 = - ("里程 " + "" + dis + "" + " " + disUnit + "" - + ",剩余 " + "" + min + "" + " 分钟") - - taskOtherInfo.text = HtmlCompat.fromHtml(strHtml2, HtmlCompat.FROM_HTML_MODE_LEGACY) + taskOtherInfo.text = TaskUtils.getCurrentTaskTripHtml(meters, timeInSecond) } -// private fun speekVoice200mTipsOnce() { -// showNotice(resources.getString(R.string.module_och_taxi_order_arrive_end_200m_tip)) -// } - override fun onDestroyView() { - super.onDestroyView() AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi() + super.onDestroyView() } private fun startOrEndService() { @@ -677,7 +624,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), @RequiresApi(Build.VERSION_CODES.N) override fun onCurrentNaviDistAndTimeChanged(meters: Int, timeInSecond: Long) { - updateDistanceAndTime(meters.toLong(), timeInSecond) + updateCurrentTaskTripInfo(meters.toLong(), timeInSecond) } override fun reInitNaviAmap(isPlay: Boolean, isRestart: Boolean) { @@ -710,7 +657,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), }, 3000) } - fun onNaviToEndAmap(isShow: Boolean) { + fun onNaviToEndStationByAmap(isShow: Boolean) { if (mCurrentTaskWithOrder == null) return mTaxiFragment?.showAmapNaviToStationFragment( @@ -745,7 +692,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), MapMakerManager.removeAllMapMarkerByOwner(TYPE_MARKER_TAXI_ORDER) } - private fun updateOrderBottomBtn( + private fun updateTaskContainerBottomBtn( txt: String?, txtColorId: Int, bgColorId: Int, diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt index 0e025303c0..f21feac46b 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt @@ -36,7 +36,7 @@ import com.mogo.och.taxi.network.CarServiceManager import com.mogo.och.taxi.network.CarServiceManager.cancelOrder import com.mogo.och.taxi.network.CarServiceManager.contrailList import com.mogo.och.taxi.network.CarServiceManager.queryCarOrderByOrderNo -import com.mogo.och.taxi.ui.unmanned.TaskAndOrderUiState +import com.mogo.och.taxi.ui.unmanned.TaskWithOrderUIState import com.mogo.och.taxi.ui.unmanned.UnmannedIntent import com.mogo.och.taxi.ui.unmanned.UnmannedState import io.reactivex.Observable @@ -59,7 +59,7 @@ class TaxiCurrentTaskViewModel : BaseViewModel(){ private var mContext : Context = AbsMogoApplication.getApp().applicationContext override fun initUiState(): UnmannedState { - return UnmannedState(TaskAndOrderUiState.INIT) + return UnmannedState(TaskWithOrderUIState.Init) } override fun handleIntent(intent: IUiIntent) { @@ -69,7 +69,7 @@ class TaxiCurrentTaskViewModel : BaseViewModel(){ startOrStopOrderLoop(true) } - is UnmannedIntent.StartOrPauseReceivingOrder -> {//开始、暂停接单 + is UnmannedIntent.StartOrPauseTakeOrder -> {//开始、暂停接单 updateCarStatus() } @@ -237,7 +237,7 @@ class TaxiCurrentTaskViewModel : BaseViewModel(){ sendUiState { copy( - taskAndOrderUiState = TaskAndOrderUiState.TASKANDORDER(mCurrentTaskAndOrder, + taskWithOrderUIState = TaskWithOrderUIState.TaskWithOrder(mCurrentTaskAndOrder, TaxiModel.getCurUntruthTask() ) ) @@ -249,7 +249,7 @@ class TaxiCurrentTaskViewModel : BaseViewModel(){ sendUiState { copy( - taskAndOrderUiState = TaskAndOrderUiState.TASKANDORDER(mCurrentTaskAndOrder, + taskWithOrderUIState = TaskWithOrderUIState.TaskWithOrder(mCurrentTaskAndOrder, untruthTask) ) } @@ -258,7 +258,7 @@ class TaxiCurrentTaskViewModel : BaseViewModel(){ private fun updateNoTaskAndOrderUi() { sendUiState { copy( - taskAndOrderUiState = TaskAndOrderUiState.TASKANDORDER(null, + taskWithOrderUIState = TaskWithOrderUIState.TaskWithOrder(null, TaxiModel.getCurUntruthTask() ) ) @@ -428,7 +428,7 @@ class TaxiCurrentTaskViewModel : BaseViewModel(){ sendUiState { copy( - taskAndOrderUiState = TaskAndOrderUiState.UPDATEORDERMILEANDDUR(mileage, + taskWithOrderUIState = TaskWithOrderUIState.UpdateTaskTripInfo(mileage, duration) ) } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiNextTaskFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiNextTaskFragment.kt index c9a38bb0f5..cc1817202d 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiNextTaskFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiNextTaskFragment.kt @@ -14,7 +14,7 @@ import com.mogo.och.taxi.bean.QueryCurrentTaskRespBean import com.mogo.och.taxi.constant.TaskTypeEnum import com.mogo.och.taxi.ui.base.TaxiFragment import kotlinx.android.synthetic.main.task_fragment_current.endStationName -import kotlinx.android.synthetic.main.task_fragment_current.mBeingOrderLayout +import kotlinx.android.synthetic.main.task_fragment_current.mCurrentTaskLayout import kotlinx.android.synthetic.main.task_fragment_current.naviToEnd import kotlinx.android.synthetic.main.task_fragment_current.naviToStart import kotlinx.android.synthetic.main.task_fragment_current.noTaskData @@ -111,12 +111,12 @@ class TaxiNextTaskFragment : BaseFragment() { private fun showNoOrderView() { noTaskData.visibility = View.VISIBLE - mBeingOrderLayout.visibility = View.GONE + mCurrentTaskLayout.visibility = View.GONE } private fun showOrderView() { noTaskData.visibility = View.GONE - mBeingOrderLayout.visibility = View.VISIBLE + mCurrentTaskLayout.visibility = View.VISIBLE } companion object { diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskTabFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskTabFragment.kt index eebd6b5c69..c0af97f509 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskTabFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskTabFragment.kt @@ -1,12 +1,12 @@ package com.mogo.och.taxi.ui -import android.annotation.SuppressLint import android.graphics.Color import android.graphics.Typeface import android.os.Bundle import android.util.TypedValue import android.view.View import android.widget.TextView +import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentPagerAdapter @@ -28,6 +28,8 @@ import me.jessyan.autosize.utils.AutoSizeUtils * @desc: 司机端任务fragment 容器,展示了“进行中”和“待服务”的任务信息 * 任务:可以理解为对应的是一个自动驾驶任务 * 任务类型:演练任务 / 接驾任务 / 送驾任务 + * DriveToNearestStationTask: 一种特殊任务,人工驾驶去最近的站点任务。每次 开启接单 后后端都会返回离当前最近的站点,车辆需要 + * 开到此站点后才能进入无人化接单的整体流程 * 订单:是面向C端小程序的一个概念,用户下单后产生的是一个订单,后端会将一个订单分解成 接驾任务和送驾任务 并派发到 * 车端来执行 * 任务和订单的对应:1.如果是一个演练任务,是后端自动生成的,没有和C端订单挂钩 @@ -37,6 +39,10 @@ class TaxiTaskTabFragment : BaseFragment() { companion object { const val TAG = "TaxiTaskTabFragment" + const val TAB_POSITION_CURRENT = 0 + const val TAB_POSITION_NEXT = 1 + val mTabTitles = arrayOf("进行中", "待服务") + fun newInstance(): TaxiTaskTabFragment { val args = Bundle() val fragment = TaxiTaskTabFragment() @@ -45,42 +51,42 @@ class TaxiTaskTabFragment : BaseFragment() { } } - private val mTabTitles = arrayOf("进行中", "待服务") private val mFragments: MutableList = ArrayList() private var currentTaskFragment: TaxiCurrentTaskFragment? = null private var nextTaskFragment: TaxiNextTaskFragment? = null + override fun getLayoutId(): Int { return R.layout.taxi_server_orders_panel } override fun getTagName(): String { - return "TaxiTaskTabFragment" + return this.javaClass.simpleName } override fun initViews() { - initOrderTab() + initTaskTab() } - private fun initOrderTab() { - for (i in mTabTitles.indices) { + private fun initTaskTab() { + for (position in mTabTitles.indices) { val tab = module_och_taxi_tab.newTab() tab.view.setBackgroundColor(Color.parseColor("#00000000")) val tabView = View.inflate(activity, R.layout.taxi_tab_item_custom, null) as TextView - tabView.text = mTabTitles[i] + tabView.text = mTabTitles[position] tabView.height = AutoSizeUtils.dp2px(context, 120f) tab.customView = tabView - if (0 == i) { + if (TAB_POSITION_CURRENT == position) { module_och_taxi_tab.addTab(tab, true) - changeTabLayoutTabUI(tab, true) + changeTabLayoutUI(tab, true) currentTaskFragment = TaxiCurrentTaskFragment.newInstance( parentFragment as TaxiFragment? ) mFragments.add(currentTaskFragment!!) - } else if (1 == i) { + } else if (TAB_POSITION_NEXT == position) { module_och_taxi_tab.addTab(tab) - changeTabLayoutTabUI(tab, false) + changeTabLayoutUI(tab, false) nextTaskFragment = TaxiNextTaskFragment.newInstance( activity ) @@ -92,15 +98,16 @@ class TaxiTaskTabFragment : BaseFragment() { module_och_taxi_tab.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { module_och_taxi_view_pager.currentItem = tab.position - changeTabLayoutTabUI(tab, true) + changeTabLayoutUI(tab, true) } override fun onTabUnselected(tab: TabLayout.Tab) { - changeTabLayoutTabUI(tab, false) + changeTabLayoutUI(tab, false) } override fun onTabReselected(tab: TabLayout.Tab) {} }) + module_och_taxi_view_pager.addOnPageChangeListener(object : OnPageChangeListener { override fun onPageScrolled( position: Int, @@ -115,37 +122,40 @@ class TaxiTaskTabFragment : BaseFragment() { override fun onPageScrollStateChanged(state: Int) {} }) - module_och_taxi_view_pager.adapter = OrdersFragmentAdapter( + + module_och_taxi_view_pager.adapter = TaskTabFragmentAdapter( childFragmentManager, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT ) } - @SuppressLint("UseCompatLoadingForDrawables") - private fun changeTabLayoutTabUI(tab: TabLayout.Tab, isSelected: Boolean) { + private fun changeTabLayoutUI(tab: TabLayout.Tab, isSelected: Boolean) { val textView = tab.customView!!.findViewById(R.id.tab_title) as TextView if (isSelected) { - textView.background = activity?.getDrawable(R.drawable.taxi_driver_tab_item_bg) + textView.background = + ContextCompat.getDrawable(requireContext(), R.drawable.taxi_driver_tab_item_bg) textView.setTextSize( TypedValue.COMPLEX_UNIT_PX, AutoSizeUtils.dp2px(context, 40f).toFloat() ) - d(SceneConstant.M_TAXI + TAG, "SelectTv = " + textView.text) textView.typeface = Typeface.defaultFromStyle(Typeface.BOLD) textView.setTextColor(Color.parseColor("#FFFFFF")) + + d(SceneConstant.M_TAXI + TAG, "SelectTv = " + textView.text) } else { textView.background = null textView.setTextSize( TypedValue.COMPLEX_UNIT_PX, - AutoSizeUtils.dp2px(getContext(), 36f).toFloat() + AutoSizeUtils.dp2px(context, 36f).toFloat() ) - d(SceneConstant.M_TAXI + TAG, "unSelectTv = " + textView.text) textView.typeface = Typeface.defaultFromStyle(Typeface.NORMAL) textView.setTextColor(Color.parseColor("#CCD4F5")) + + d(SceneConstant.M_TAXI + TAG, "unSelectTv = " + textView.text) } } - internal inner class OrdersFragmentAdapter( + internal inner class TaskTabFragmentAdapter( fragmentManager: FragmentManager, behavior: Int ) : @@ -171,23 +181,23 @@ class TaxiTaskTabFragment : BaseFragment() { } } - fun onNaviToEndAMap(isShow: Boolean) { + fun onNaviToEndStationByAMap(isShow: Boolean) { if (null == currentTaskFragment) return - currentTaskFragment!!.onNaviToEndAmap(isShow) + currentTaskFragment!!.onNaviToEndStationByAmap(isShow) } - fun onCurrentOrderDistToEndChanged(meters: Long, timeInSecond: Long) { + fun onCurrentTaskTripInfoChanged(meters: Long, timeInSecond: Long) { if (null == currentTaskFragment) return - currentTaskFragment!!.updateDistanceAndTime(meters, timeInSecond) + currentTaskFragment!!.updateCurrentTaskTripInfo(meters, timeInSecond) } - fun onOperationStatusChanged() { + fun onCarTakeOrderStatusChanged() { if (null == currentTaskFragment) return - currentTaskFragment!!.onOperationStatusChanged() + currentTaskFragment!!.onCarTakeOrderStatusChanged() } - fun updateOrderChanged(model: QueryCurrentTaskRespBean.Result?) { + fun onTaskDataChanged(result: QueryCurrentTaskRespBean.Result?) { if (null == nextTaskFragment) return - nextTaskFragment!!.updateOrderChanged(model) + nextTaskFragment!!.updateOrderChanged(result) } } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/unmanned/UnmannedIntent.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/unmanned/UnmannedIntent.kt index 56a0c08c24..b06d4e62b9 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/unmanned/UnmannedIntent.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/unmanned/UnmannedIntent.kt @@ -9,7 +9,7 @@ import com.mogo.och.taxi.base.IUiIntent sealed class UnmannedIntent: IUiIntent{ //开始接单 、 暂停接单 - object StartOrPauseReceivingOrder : UnmannedIntent() + object StartOrPauseTakeOrder : UnmannedIntent() object StartTaskOrOrderLooper : UnmannedIntent() diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/unmanned/UnmannedState.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/unmanned/UnmannedState.kt index e07d435ab5..a5baa5f96e 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/unmanned/UnmannedState.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/unmanned/UnmannedState.kt @@ -5,11 +5,18 @@ import com.mogo.och.taxi.bean.QueryCurrentTaskRespBean import com.mogo.och.taxi.bean.StartServiceRespBean -data class UnmannedState(val taskAndOrderUiState: TaskAndOrderUiState) : IUiState +data class UnmannedState(val taskWithOrderUIState: TaskWithOrderUIState) : IUiState -sealed class TaskAndOrderUiState { - object INIT : TaskAndOrderUiState() - data class TASKANDORDER(val taskAndOrder: QueryCurrentTaskRespBean.Result?, val untruthTask: StartServiceRespBean.Result?) : TaskAndOrderUiState()//演练任务、接驾、送驾任务 +sealed class TaskWithOrderUIState { + object Init : TaskWithOrderUIState() - data class UPDATEORDERMILEANDDUR(val mileage: Float, val duration: Int): TaskAndOrderUiState() + /** + * 演练任务、接驾任务、送驾任务 + */ + data class TaskWithOrder( + val taskWithOrder: QueryCurrentTaskRespBean.Result?, + val driveToNearestStationTask: StartServiceRespBean.Result? + ) : TaskWithOrderUIState() + + data class UpdateTaskTripInfo(val mileage: Float, val duration: Int) : TaskWithOrderUIState() } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/utils/TaskUtils.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/utils/TaskUtils.kt new file mode 100644 index 0000000000..8b209c6749 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/utils/TaskUtils.kt @@ -0,0 +1,67 @@ +package com.mogo.och.taxi.utils + +import android.text.Spanned +import androidx.core.text.HtmlCompat +import com.mogo.eagle.core.utilcode.util.DateTimeUtils +import com.mogo.och.common.module.utils.DateTimeUtil +import com.mogo.och.common.module.utils.NumberFormatUtil +import java.util.Calendar +import kotlin.math.ceil +import kotlin.math.roundToInt + +object TaskUtils { + + /** + * 剩余里程和剩余时间 html + */ + fun getCurrentTaskTripHtml(meters: Long, timeInSecond: Long): Spanned { + var dis = "0" + var disUnit = "公里" + if (meters > 0) { + if (meters / 1000 < 1) { + disUnit = "米" + dis = meters.toFloat().roundToInt().toString() + } else { + disUnit = "公里" + dis = NumberFormatUtil.formatLong(meters.toDouble() / 1000) + } + } + val min = ceil(timeInSecond.toDouble() / 60f).toInt() + val strHtml = + ("里程 " + + "" + + dis + "" + + " " + + disUnit + "" + + ",剩余 " + + "" + + min + "" + + " 分钟") + return HtmlCompat.fromHtml(strHtml, HtmlCompat.FROM_HTML_MODE_LEGACY) + } + + fun getWaitTimeHtml(): Spanned { + val currentCale = DateTimeUtils.getCurrentDateTime() + val currentDay = + DateTimeUtil.formatCalendarToString(currentCale, DateTimeUtil.yyyy_MM_dd) + currentCale.add(Calendar.MINUTE, 10) + val strHtml13: String = if (currentDay == DateTimeUtil.formatCalendarToString( + currentCale, + DateTimeUtil.yyyy_MM_dd + ) + ) { + ("免费等待至 " + + "" + DateTimeUtil.formatCalendarToString( + currentCale, + DateTimeUtil.HH_mm + ) + "") + } else { + ("免费等待至" + + "" + DateTimeUtil.formatCalendarToString( + currentCale, + DateTimeUtil.MM_dd_HH_mm + ) + "") + } + return HtmlCompat.fromHtml(strHtml13, HtmlCompat.FROM_HTML_MODE_LEGACY) + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/task_fragment_current.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/task_fragment_current.xml index ee13525556..80094058e0 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/task_fragment_current.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/layout/task_fragment_current.xml @@ -8,7 +8,7 @@ app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent">