From ac2367386ccec27f5569d9d72a0391498e2f1079 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Fri, 18 Aug 2023 11:02:01 +0800 Subject: [PATCH 01/22] =?UTF-8?q?[6.0.0]=20=E5=90=AF=E5=8A=A8=E8=87=AA?= =?UTF-8?q?=E9=A9=BE=E6=96=87=E5=AD=97=E5=A2=9E=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/wigets/StartAutopilotAnimationView.kt | 14 ++++++++++---- .../layout/start_autopilot_animation_view.xml | 16 +++++++++------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/StartAutopilotAnimationView.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/StartAutopilotAnimationView.kt index 17e99eac1a..535e7486de 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/StartAutopilotAnimationView.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/StartAutopilotAnimationView.kt @@ -12,6 +12,7 @@ import android.view.animation.LinearInterpolator import android.widget.RelativeLayout import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI +import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.R import com.mogo.och.common.module.utils.SoundPoolHelper import kotlinx.android.synthetic.main.start_autopilot_animation_view.view.startAutopilotTip @@ -28,7 +29,7 @@ class StartAutopilotAnimationView @JvmOverloads constructor( companion object { private const val ALL_CLOSE_TIMER = 5000L - private const val TAG = "V2XWarningView" + private const val TAG = "StartAutopilotAnimationView" } private var startTimer: CountDownTimer? = null @@ -77,7 +78,6 @@ class StartAutopilotAnimationView @JvmOverloads constructor( * @see WarningDirectionEnum */ private fun showWarning(direction: DirectionEnum, time: Long = ALL_CLOSE_TIMER) { - //开始倒计时 countDownTimer() @@ -146,18 +146,24 @@ class StartAutopilotAnimationView @JvmOverloads constructor( private fun countDownTimer() { + startAutopilotTip.visibility = VISIBLE + startTimer = object : CountDownTimer(ALL_CLOSE_TIMER, 1000L) {// 5倒计时后开启自驾 @SuppressLint("SetTextI18n") override fun onTick(millisUntilFinished: Long) { // 倒计时 - startAutopilotTip.text = "${(millisUntilFinished/1000).toInt()} 车辆即将自动开启自动驾驶" + UiThreadHandler.post { + startAutopilotTip.text = "${(millisUntilFinished/1000).toInt()} 车辆即将自动开启自动驾驶" + } playDI() } override fun onFinish() { //倒计时结束了... - startAutopilotTip.text = "车辆正在自动开启自动驾驶" + UiThreadHandler.post { + startAutopilotTip.text = "车辆正在自动开启自动驾驶" + } } } diff --git a/OCH/mogo-och-common-module/src/main/res/layout/start_autopilot_animation_view.xml b/OCH/mogo-och-common-module/src/main/res/layout/start_autopilot_animation_view.xml index bf45939451..db831f47da 100644 --- a/OCH/mogo-och-common-module/src/main/res/layout/start_autopilot_animation_view.xml +++ b/OCH/mogo-och-common-module/src/main/res/layout/start_autopilot_animation_view.xml @@ -3,6 +3,15 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> + + + - \ No newline at end of file From 6dd6d8b21361564ffbe1fe4496efe2b1baa1642a Mon Sep 17 00:00:00 2001 From: yangyakun Date: Fri, 18 Aug 2023 11:21:58 +0800 Subject: [PATCH 02/22] =?UTF-8?q?[5.0.0]=20[Jenkins=E6=89=93=E5=8C=85=20gr?= =?UTF-8?q?adle=E9=99=8D=E7=BA=A7=E9=87=8D=E5=A4=8D=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=84=E7=90=86=20]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + gradle/ext.gradle | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 0d209b3094..7120f19e4a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -42,6 +42,7 @@ android { exclude 'META-INF/*' exclude "/lib/armeabi-v7a/*.so" pickFirst 'lib/arm64-v8a/libc++_shared.so' + pickFirst "META-INF/com.android.tools/proguard/coroutines.pro" } signingConfigs { diff --git a/gradle/ext.gradle b/gradle/ext.gradle index 7c2804c944..8f5714fe9b 100644 --- a/gradle/ext.gradle +++ b/gradle/ext.gradle @@ -1,5 +1,5 @@ ext { - gradle_version = '4.0.0' + gradle_version = '3.5.3' kotlin_version = '1.5.30' plugin_version = '10.0.0_mogo' hook_log_plugin_version = '1.7.2' From 920a8c5ec11de4297e507f189870e885229a3b5f Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Fri, 18 Aug 2023 12:07:30 +0800 Subject: [PATCH 03/22] =?UTF-8?q?[6.0.0]=20=E6=9F=A5=E8=AF=A2=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E6=8E=A5=E5=8F=A3=E8=BF=94=E5=9B=9E=E5=80=BC=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mogo/och/taxi/bean/UnmannedTaskBean.kt | 12 +++++++----- .../com/mogo/och/taxi/model/TaxiUnmannedViewModel.kt | 10 +++++----- gradle.properties | 4 ++-- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/UnmannedTaskBean.kt b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/UnmannedTaskBean.kt index 41b225b5d7..f9bf7dd51b 100644 --- a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/UnmannedTaskBean.kt +++ b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/UnmannedTaskBean.kt @@ -103,11 +103,13 @@ data class JumpPassengerCheckReqBean(var sn: String, var orderNo: String) data class CancelOrderReqBean(var sn: String, var orderNo: String, var cancelType: Int) data class OrderCompletedReqBean(var sn: String, var orderNo: String) data class QueryCarOrderByNoReqBean(var sn: String, var orderNo: String) -data class QueryCarOrderByNoRespBean( - var sn: String, var orderNo: String, var orderStatus: Int, - var bookingUserPhone: String, var businessType: String, - var mileage: Float,var duration: Int -): BaseData() +data class QueryCarOrderByNoRespBean(var data: Result): BaseData(){ + data class Result( + var sn: String, var orderNo: String, var orderStatus: Int, + var bookingUserPhone: String, var businessType: String, + var mileage: Float,var duration: Int,var passengerSize: Int + ) +} data class ContrailListRespBean(var data: MutableList?) //轨迹路线集合 : BaseData() { diff --git a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiUnmannedViewModel.kt b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiUnmannedViewModel.kt index 7904ca67ee..c0c6071ddb 100644 --- a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiUnmannedViewModel.kt +++ b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiUnmannedViewModel.kt @@ -367,18 +367,18 @@ class TaxiUnmannedViewModel : BaseViewModel(){ queryCarOrderByOrderNo(mContext,orderNo, object : OchCommonServiceCallback{ override fun onSuccess(data: QueryCarOrderByNoRespBean?) { - if (data != null && data.code != 0) return - if (data!!.orderStatus == TaxiOrderStatusEnum.Cancel.code){ + if (data == null || data.code != 0) return + if (data.data.orderStatus == TaxiOrderStatusEnum.Cancel.code){ VoiceNotice.showNotice("乘客已经取消") mCurrentTaskAndOrder = null updateTaskAndOrderUi() return } - if (data.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.code){//到站 - updateOrderMileAndDur(data.mileage,data.duration) + if (data.data.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.code){//到站 + updateOrderMileAndDur(data.data.mileage,data.data.duration) return } - if (data.orderStatus == TaxiOrderStatusEnum.JourneyCompleted.code){//完成 + if (data.data.orderStatus == TaxiOrderStatusEnum.JourneyCompleted.code){//完成 //获取新的任务 if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.endSite != null){ startPrepareTask(mCurrentTaskAndOrder!!.endSite!!.siteId) diff --git a/gradle.properties b/gradle.properties index abb44ecdb2..80c8496457 100644 --- a/gradle.properties +++ b/gradle.properties @@ -93,8 +93,8 @@ WEBSOCKET_VERSION=1.1.7 applicationId=com.mogo.launcer applicationName=IntelligentPilot # RoboBus司机端:2.5.1;RoboTaxi司机端:2.5.1;RoboTaxi乘客端:1.0.0 -versionCode=3030000 -versionName=3.3.0 +versionCode=6000000 +versionName=6.0.0 ################# 新架构模块Maven版本管理 ################# MOGO_CORE_FUNCTION_HMI_VERSION=0.0.58.10 From 25b3f0b90f2634e8693270a4fd6b8d3715d7188c Mon Sep 17 00:00:00 2001 From: yangyakun Date: Fri, 18 Aug 2023 15:26:23 +0800 Subject: [PATCH 04/22] =?UTF-8?q?[5.0.0]=20[=E5=88=A0=E9=99=A4fragment]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/och/charter/model/DriverM1Model.kt | 58 +- .../BusPassengerFunctionOrderPresenter.kt | 385 --------- .../BusPassengerFunctionPresenter.kt | 23 - .../BusPassengerFunctionSoftPresenter.kt | 245 ------ .../BusPassengerFunctionVideoPresenter.kt | 6 - ...CharterPassengerNoviceGuidancePresenter.kt | 2 - .../passenger/presenter/OrderInfoPresenter.kt | 79 -- .../mogo/och/bus/passenger/ui/MainFragment.kt | 17 - .../ui/dialogfragment/M1ContainFragment.kt | 322 -------- .../ui/orderinfo/OrderInfoFragment.kt | 82 -- .../ui/selectline/M1OrderLineFragment.kt | 268 ------- .../ui/selectline/SelectLineViewModel.kt | 5 - .../ui/softcontrol/M1SoftFragment.kt | 735 ------------------ .../ui/softcontrol/SoftControlView.kt | 20 +- .../bus/passenger/ui/video/M1VideoFragment.kt | 163 ---- 15 files changed, 22 insertions(+), 2388 deletions(-) delete mode 100644 OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt delete mode 100644 OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionPresenter.kt delete mode 100644 OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionSoftPresenter.kt delete mode 100644 OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionVideoPresenter.kt delete mode 100644 OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/OrderInfoPresenter.kt delete mode 100644 OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/dialogfragment/M1ContainFragment.kt delete mode 100644 OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/orderinfo/OrderInfoFragment.kt delete mode 100644 OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/selectline/M1OrderLineFragment.kt delete mode 100644 OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/softcontrol/M1SoftFragment.kt delete mode 100644 OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/video/M1VideoFragment.kt diff --git a/OCH/charter/driver/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt b/OCH/charter/driver/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt index ab9161791e..7e5b56e08a 100644 --- a/OCH/charter/driver/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt +++ b/OCH/charter/driver/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt @@ -76,8 +76,8 @@ class DriverM1Model { // 运营类型 private val VEHICLE_TYPE : Int = 10 - private var mControllerStatusCallback //Model->Presenter:VR mode等 - : IDriverM1ControllerStatusCallback? = null + //Model->Presenter:VR mode等 + private var mControllerStatusCallback: IDriverM1ControllerStatusCallback? = null private var mOrderCallback: DriverM1OrderCallback? = null @@ -110,7 +110,7 @@ class DriverM1Model { fun init(context: Context) { mContext = context // 定位监听 - CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 10,mMapLocationListener) + CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 10, mMapLocationListener) //开启自驾后 异常信息返回 OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(mAdasStartFailureListener) @@ -118,18 +118,20 @@ class DriverM1Model { // 监听运营信息 registerSocketMessageListener( OCHSocketMessageManager.msgMonitorType, - mOnSystemMessageListener) + mOnSystemMessageListener + ) //监听开门 registerSocketMessageListener( OCHSocketMessageManager.msgOperateDoorType, - mOnDoorMessageListener) + mOnDoorMessageListener + ) //监听订单结束 registerSocketMessageListener( OCHSocketMessageManager.msgOrderClosedType, - mOnOrderClosedMessageListener) - + mOnOrderClosedMessageListener + ) //监听核销乘客 - registerSocketMessageListener( //监听核销乘客 + registerSocketMessageListener( OCHSocketMessageManager.msgWriteOffPassengerType, mWriteOffPassengerOnMessageListener ) @@ -149,45 +151,7 @@ class DriverM1Model { // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃 // The exception could not be delivered to the consumer because it has already canceled/disposed // the flow or the excTeption has nowhere to go to begin with - RxJavaPlugins.setErrorHandler(object : Consumer { - override fun accept(e: Throwable?) { - var e = e - if (e is UndeliverableException) { - e = e.cause!! - d(SceneConstant.M_CHARTER_D + TAG, "UndeliverableException") - } - if (e is IOException) { // - // fine, irrelevant network problem or API that throws on cancellation - d(SceneConstant.M_CHARTER_D + TAG, "IOException") - return - } - if (e is InterruptedException) { - // fine, some blocking code was interrupted by a dispose call - d(SceneConstant.M_CHARTER_D + TAG, "InterruptedException") - return - } - if (e is NullPointerException || e is IllegalArgumentException) { - // that's likely a bug in the application - d(SceneConstant.M_CHARTER_D + TAG, "NullPointerException or IllegalArgumentException") - Thread.currentThread().uncaughtExceptionHandler.uncaughtException( - Thread.currentThread(), - e - ) - return - } - if (e is IllegalStateException) { - // that's a bug in RxJava or in a custom operator - d(SceneConstant.M_CHARTER_D + TAG, "IllegalStateException") - Thread.currentThread().uncaughtExceptionHandler.uncaughtException( - Thread.currentThread(), - e - ) - return - } - d(SceneConstant.M_CHARTER_D + TAG, "Undeliverable exception") - } - - }) + RxUtils.errCatch() } fun setChangeDestCallback(callback: ChangeDestCallback?){ diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt deleted file mode 100644 index c21f7a0707..0000000000 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt +++ /dev/null @@ -1,385 +0,0 @@ -package com.mogo.och.bus.passenger.presenter - -import androidx.lifecycle.LifecycleOwner -import com.elegant.utils.UiThreadHandler -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener -import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager -import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager -import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager -import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P -import com.mogo.eagle.core.utilcode.util.GsonUtils -import com.mogo.och.bus.passenger.utils.ToastCharterUtils -import com.mogo.och.common.module.manager.loopmanager.LoopInfo -import com.mogo.och.bus.passenger.bean.event.EventLineSites -import com.mogo.och.bus.passenger.bean.response.LineInfoListResponse -import com.mogo.och.bus.passenger.bean.response.LineInfoResponse -import com.mogo.och.bus.passenger.bean.response.SiteInfoResponse -import com.mogo.och.bus.passenger.model.CharterPassengerModel -import com.mogo.och.bus.passenger.model.IOrderStatusChangeListener -import com.mogo.och.bus.passenger.model.OrderStatusEnum -import com.mogo.och.common.module.manager.loopmanager.BizLoopManager -import com.mogo.och.bus.passenger.net.BusPassengerServiceManager -import com.mogo.och.bus.passenger.ui.selectline.M1OrderLineFragment -import com.mogo.och.common.module.bean.dpmsg.BaseDPMsg -import com.mogo.och.common.module.bean.dpmsg.ChangeDestMsg -import com.mogo.och.common.module.bean.dpmsg.DPMsgType -import com.mogo.och.common.module.bean.dpmsg.LineSite -import com.mogo.och.common.module.biz.constant.OchCommonConst -import com.mogo.och.common.module.biz.network.OchCommonServiceCallback -import com.mogo.och.common.module.manager.StopSideStatusManager -import com.mogo.och.common.module.utils.RxUtils -import io.reactivex.disposables.Disposable -import org.greenrobot.eventbus.EventBus - -class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) : - BusBasePassengerFunctionDevicePresenter(view), IOrderStatusChangeListener { - - companion object{ - const val TAGLINELOOP = "LineSiteViewLineLoop" - const val TAG = "BusPassengerFunctionOrderPresenter" - } - - // 成功提交给后台得线路 - private var checkLine: LineInfoResponse.LineInfo? = null - - // 成功提交给后台得终点站点 - private var checkSite: SiteInfoResponse.SiteInfo? = null - - // 下一个站点 - private var currentSite: SiteInfoResponse.SiteInfo? = null - - // 向司机端端提交的临时线路 - private var tempCheckLine: LineInfoResponse.LineInfo? = null - - // 向司机端临时提交的终点站点 - private var tempCheckSite: SiteInfoResponse.SiteInfo? = null - - private var subscribeSelectSite: Disposable? = null - - override fun onCreate(owner: LifecycleOwner) { - super.onCreate(owner) - CharterPassengerModel.setStatusChangeListener(TAG,this) - CallerTelematicListenerManager.addListener(TAG, msgReceived) - val currentOrderStatus = CharterPassengerModel.getCurrentOrderStatus() - needRunUI(currentOrderStatus) - extracted() - } - - private fun extracted() { - val currentOrderStatus = CharterPassengerModel.getCurrentOrderStatus() - if (currentOrderStatus == OrderStatusEnum.OrderNoLine || currentOrderStatus == OrderStatusEnum.OrdersWithLine) { - val hasSetLineAndSite = CharterPassengerModel.hasSetLineAndSite() - if (hasSetLineAndSite != null) {// 已经设置了线路和站点 - checkLine = hasSetLineAndSite.first - checkSite = hasSetLineAndSite.second - } - mView?.setEnableSiteStatus(false) - queryLineList() - } - } - - /** - * 重置数据 - */ - fun resetData() { - tempCheckLine = null - tempCheckSite = null - if(checkLine==null){// 没有提交线路 - queryLineList() - mView?.setEnableSiteStatus(true) - }else{ - checkLine?.let { - mView?.setEnableSiteStatus(false) - mView?.lineAdapterSubmit(it) - querySitesByLineId(it) - } - } - } - - private fun querySitesByLineId(checkLine: LineInfoResponse.LineInfo) { - context?.let { - BusPassengerServiceManager.queryLineSiteList( - context, - checkLine.lineId.toString(), - object : OchCommonServiceCallback { - override fun onSuccess(data: SiteInfoResponse?) { - if (data?.data == null) return - val siteInfos = data.data - EventBus.getDefault().post(EventLineSites(checkLine,siteInfos,false)) - if (siteInfos.isNotEmpty()) { - // 计算当前站点是那个 - val calculateCurrentSite = - CharterPassengerModel.calculateCurrentSite(siteInfos) - val first = calculateCurrentSite.first// 可用站点 - if(first<0){ - // 所有站点不可用 - currentSite = siteInfos[siteInfos.size-1] - currentSite!!.isNear = calculateCurrentSite.second - mView?.siteAdapterEnableIndex(siteInfos.size-1) - }else{ - // - val index = if(first==0) { - 0 - }else if (first <= siteInfos.size-1) { - first-1 - } else { - siteInfos.size - 1 - } - currentSite = siteInfos[index] - currentSite!!.isNear = calculateCurrentSite.second - mView?.siteAdapterEnableIndex(index) - } - siteInfos.forEach { - if (it.siteId == checkSite?.siteId) { - it.isCheck = true - return@forEach - } - } - } - mView?.siteAdapterSetData(siteInfos) - } - - override fun onFail(code: Int, msg: String?) { - ToastCharterUtils.showShort("查询站点失败") - mView?.setVisableByTrun(showNetError = true) - } - - override fun onError() { - super.onError() - ToastCharterUtils.showShort("查询站点失败") - mView?.setVisableByTrun(showNetError = true) - } - }) - } - } - - private fun queryLineList() { - mView?.setVisableByTrun(showLoading = true) - context?.let { - BusPassengerServiceManager.queryLineList(it, object : - OchCommonServiceCallback { - override fun onSuccess(data: LineInfoListResponse?) { - if (data?.data == null) return - mView?.setVisableByTrun(showBiz = true) - mView?.lineAdapterSetData(data.data,checkLine) - } - - override fun onFail(code: Int, msg: String) { - ToastCharterUtils.showShort("查询线路失败") - mView?.setVisableByTrun(showNetError = true) - } - - override fun onError() { - super.onError() - mView?.setVisableByTrun(showNetError = true) - } - }) - } - } - - override fun onResume(owner: LifecycleOwner) { - super.onResume(owner) - } - - override fun onDestroy(owner: LifecycleOwner) { - super.onDestroy(owner) - CallerLogger.d(M_BUS_P + TAG, "onDestroy") - RxUtils.disposeSubscribe(subscribeSelectSite) - BizLoopManager.removeLoopFunction(TAGLINELOOP) - CharterPassengerModel.setStatusChangeListener(TAG,null) - CallerTelematicListenerManager.removeListener(TAG) - } - - /** - * 接收司机屏反馈信息 - */ - private val msgReceived = object : IReceivedMsgListener { - override fun onReceivedMsg(type: Int, byteArray: ByteArray) { - UiThreadHandler.post { - if (type == OchCommonConst.BUSINESS_STRING) { - val msg = GsonUtils.fromJson( - String(byteArray), - BaseDPMsg::class.java - ) as BaseDPMsg - if (msg.type == DPMsgType.TYPE_CHANGE_DEST.type) { - val msg = GsonUtils.fromJson( - String(byteArray), - ChangeDestMsg::class.java - ) as ChangeDestMsg - CallerLogger.d(M_BUS_P + BaseDPMsg.TAG, "接受数据:切换站点${msg}") - if (msg.isConfirmed) { - if(msg.arriveStatus==2){ - return@post - } - ToastCharterUtils.showShort("站点确定") - mView?.setEnableSiteStatus(true) - checkLine = tempCheckLine - checkSite = tempCheckSite - tempCheckLine = null - tempCheckSite = null - checkLine?.let { - mView?.lineAdapterSubmit(it) - } - mView?.hideDataDriverAgree() - CharterPassengerModel.cleanbroadcastListInfo(checkSite) - CharterPassengerModel.queryOrder() - } else { - ToastCharterUtils.showShort("司机端拒绝请重新选择") - mView?.hideDataDriverRefuse() - } - RxUtils.disposeSubscribe(subscribeSelectSite) - BizLoopManager.removeLoopFunction(TAGLINELOOP) - } - } - } - } - } - - fun changeSites(siteList: MutableList){ - if (!CallerTelematicManager.getClientConnStatus()) { - ToastCharterUtils.showLong("乘客屏无法连接司机屏请联系安全员") - return - } - val sentDataSite: MutableList = mutableListOf() - siteList.forEach { - sentDataSite.add(it.copy2Mas()) - } - - tempCheckSite?.let { siteInfo -> - val orderNo = CharterPassengerModel.getCurrentOrderInfo()?.orderNo ?: "" - val msg = ChangeDestMsg( - orderNo, - siteInfo.lineId!!.toInt(), - siteInfo.lineName!!, - currentSite!!.siteId!!.toInt(), - currentSite!!.siteName!!, - siteInfo.siteId!!.toInt(), - siteInfo.siteName!!, - false, - 1, - 0, - sentDataSite - ) - CallerTelematicManager.sendMsgToServer( - OchCommonConst.BUSINESS_STRING, - GsonUtils.toJson(msg).toByteArray() - ) - CallerLogger.d(M_BUS_P + BaseDPMsg.TAG, "发送数据:切换站点${msg}") - } - mView?.hideDataWaitDriverMsg() - // 启动查看和司机端链接 - BizLoopManager.setLoopFunction( - TAGLINELOOP, - LoopInfo(3, ::checkServerStatus) - ) - - RxUtils.disposeSubscribe(subscribeSelectSite) - subscribeSelectSite = RxUtils.createSubscribe(120_000){ - ToastCharterUtils.showShort("请联系安全员确认") - mView?.hideDataDriverRefuse() - } - } - private fun checkServerStatus() { - if (!CallerTelematicManager.getClientConnStatus()) { - ToastCharterUtils.showShort("断开和司机端连接、请联系安全员") - BizLoopManager.removeLoopFunction(TAGLINELOOP) - mView?.hideDataDriverRefuse() - CallerLogger.d(M_BUS_P + TAG, "endAni666") - } - } - - override fun onStatusChange(currentStatus: OrderStatusEnum) { - UiThreadHandler.post { - needRunUI(currentStatus) - } - } - - private fun needRunUI(currentStatus: OrderStatusEnum){ - when (currentStatus) { - OrderStatusEnum.OrderNoLine -> { - mView?.setVisableByTrun(showBiz = true) - extracted() - } - OrderStatusEnum.OrdersWithLine ->{ - mView?.setVisableByTrun(showBiz = true) - } - else ->{ - mView?.setVisableByTrun(showNorOrder = true) - } - } - } - - fun canSwitchLine():Boolean { - val gnssSpeed = - CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().gnssSpeed - if (gnssSpeed < 0.5) { - when (CallerAutoPilotStatusListenerManager.getState()) { - IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> {// 不可自动驾驶 - return true - } - IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE -> {// - return true - } - IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> { - // 自动驾驶中 - return when (StopSideStatusManager.stopSiteStatus) { - StopSideStatusManager.Status.EndingSuccess -> { - true - } - else ->{ - ToastCharterUtils.showShort("自动驾驶中无法切换线路") - false - } - } - } - IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING -> { - ToastCharterUtils.showShort("因车辆正在平行驾驶中无法切换线路") - return false - } - else -> {} - } - } else { - ToastCharterUtils.showShort("请停车后再修改目的地~") - return false - } - return true - } - - fun checkLineClick(lineInfo: LineInfoResponse.LineInfo) { - checkLine4View() - tempCheckLine = lineInfo - querySitesByLineId(lineInfo) - } - - private fun checkLine4View(){ - tempCheckSite = null - mView?.setEnableSiteStatus(false) - } - - fun checkSiteClick(siteInfo: SiteInfoResponse.SiteInfo?) { - tempCheckSite = siteInfo - if(checkSite!=null){ - checkSite?.let { - if (it.siteId == siteInfo?.siteId) {// 站点相同 隐藏所有提交按钮 - mView?.setEnableSiteStatus(false) - } else { - if(it.lineId == siteInfo?.lineId){// 线路相同显示单独提交 - mView?.setEnableSiteStatus(true) - }else{ - if(siteInfo==null){//没有选站点隐藏所有提交 - mView?.setEnableSiteStatus(false) - }else { - mView?.setEnableSiteStatus(true) - } - } - } - } - }else{ - mView?.setEnableSiteStatus(true) - } - } - -} \ No newline at end of file diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionPresenter.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionPresenter.kt deleted file mode 100644 index a1668f7b62..0000000000 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionPresenter.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.mogo.och.bus.passenger.presenter - -import androidx.lifecycle.LifecycleOwner -import com.mogo.och.bus.passenger.model.CharterPassengerModel -import com.mogo.och.bus.passenger.ui.dialogfragment.M1ContainFragment - -class BusPassengerFunctionPresenter(view: M1ContainFragment?) : - BusBasePassengerFunctionDevicePresenter(view) { - companion object{ - private const val TAG = "BusPassengerFunctionPresenter" - } - override fun onCreate(owner: LifecycleOwner) { - super.onCreate(owner) - } - - override fun onDestroy(owner: LifecycleOwner) { - super.onDestroy(owner) - } - - fun haveOrder(): Boolean { - return CharterPassengerModel.hasOrder() - } -} \ No newline at end of file diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionSoftPresenter.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionSoftPresenter.kt deleted file mode 100644 index 02c063dd99..0000000000 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionSoftPresenter.kt +++ /dev/null @@ -1,245 +0,0 @@ -package com.mogo.och.bus.passenger.presenter - -import androidx.lifecycle.LifecycleOwner -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant -import com.mogo.eagle.core.utilcode.util.UiThreadHandler -import com.mogo.och.bus.passenger.ui.softcontrol.M1SoftFragment -import com.mogo.och.bus.passenger.utils.ToastCharterUtils -import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorCallback -import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorStatusManager -import com.mogo.och.common.module.manager.devicemanage.data.AirconditionStatus -import com.mogo.och.common.module.manager.devicemanage.data.HeaterStatue -import com.mogo.och.common.module.manager.devicemanage.data.LightStatus -import io.reactivex.disposables.Disposable - -class BusPassengerFunctionSoftPresenter(view: M1SoftFragment?) : - BusBasePassengerFunctionDevicePresenter(view), - LightAirconditionDoorCallback { - companion object { - private const val TAG = "BusPassengerFunctionSoftPresenter" - } - - private var subscribeLightTop1: Disposable?=null - private var subscribeLightTop2: Disposable?=null - private var subscribeLightAtmosphere: Disposable?=null - - private var airconditionDisposable: Disposable?=null - private var heaterDisposable: Disposable?=null - - override fun onCreate(owner: LifecycleOwner) { - super.onCreate(owner) - LightAirconditionDoorStatusManager.addListener(TAG, this) - } - - override fun onDestroy(owner: LifecycleOwner) { - super.onDestroy(owner) - LightAirconditionDoorStatusManager.removeListener(TAG) - } - - /** - * 空调状态变化 - */ - override fun onAirconditionStatusCallback(heaterIsOpen: Boolean, airconditionStatus: AirconditionStatus, isFirst: Boolean) { - CallerLogger.d(SceneConstant.M_BUS_P + TAG, - "回写--空调开关:${LightAirconditionDoorStatusManager.airconditionStatus.isOpen}、" + - "空调温度:${LightAirconditionDoorStatusManager.airconditionStatus.temperature}" + - "空调模式:${LightAirconditionDoorStatusManager.airconditionStatus.pattert}" + - "空调风速:${LightAirconditionDoorStatusManager.airconditionStatus.windSpeed}") - UiThreadHandler.post { - if(airconditionStatus.isOpen){ - mView?.setAirconditionHeaterView( - airconditionStatus.isOpen, - heaterIsOpen, - airconditionStatus.temperature, - airconditionStatus.pattert, - airconditionStatus.windSpeed - ) - }else{ - mView?.setAirconditionHeaterView( - airconditionStatus.isOpen, - heaterIsOpen, - airconditionStatus.temperature, - 0, - 0 - ) - } - } - } - /** - * 暖风机状态变化 - */ - override fun onHeaterStatusCallback(airconditionIsOpen:Boolean, heaterStatue: HeaterStatue, isFirst: Boolean) { - CallerLogger.d(SceneConstant.M_BUS_P + TAG, - "回写--暖风机开关:${heaterStatue.isOpen}、" + - "风速:${heaterStatue.windSpeed}") - UiThreadHandler.post { - if(heaterStatue.isOpen) { - mView?.setAirconditionHeaterView( - airconditionIsOpen, - heaterStatue.isOpen, - 0, - 0, - heaterStatue.windSpeed - ) - }else{ - mView?.setAirconditionHeaterView( - airconditionIsOpen, - heaterStatue.isOpen, - 0, - 0, - 0 - ) - } - } - } - /** - * 灯状态变化 - */ - override fun onLightTop1Callback(lightStatus: LightStatus, isFirst: Boolean) { - CallerLogger.d(SceneConstant.M_BUS_P + TAG, - "回写--顶灯1开关:${lightStatus.isOpenLight1}、" + - "顶灯2开关:${lightStatus.isOpenLight2}、" + - "氛围灯开关:${lightStatus.isOpenatmosphere}、") - UiThreadHandler.post { - mView?.setLightTop1View(lightStatus.isOpenLight1,isFirst) - } - } - /** - * 灯状态变化 - */ - override fun onLightTop2Callback(lightStatus: LightStatus, isFirst: Boolean) { - CallerLogger.d(SceneConstant.M_BUS_P + TAG, - "回写--顶灯1开关:${lightStatus.isOpenLight1}、" + - "顶灯2开关:${lightStatus.isOpenLight2}、" + - "氛围灯开关:${lightStatus.isOpenatmosphere}、") - UiThreadHandler.post { - mView?.setLightTop2View(lightStatus.isOpenLight2,isFirst) - mView?.setLightView(lightStatus.isOpenLight1,lightStatus.isOpenLight2) - } - } - /** - * 灯状态变化 - */ - override fun onLightAtmosphereCallback(lightStatus: LightStatus, isFirst: Boolean) { - CallerLogger.d(SceneConstant.M_BUS_P + TAG, - "回写--顶灯1开关:${lightStatus.isOpenLight1}、" + - "顶灯2开关:${lightStatus.isOpenLight2}、" + - "氛围灯开关:${lightStatus.isOpenatmosphere}、") - UiThreadHandler.post { - mView?.setLightAtmosphereView(lightStatus.isOpenatmosphere,isFirst) - } - } - - /** - * 设置空调 - */ - fun openAndSetAircondition(modeCmd: Int, windSpeedCmd: Int, temperatureCmd: Int) { - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "" + - "打开空调,模式$modeCmd--档位${windSpeedCmd}--温度:$temperatureCmd") - CallerAutoPilotControlManager.sendRoboBusJinlvM1AirConditionerCmd(1,modeCmd,windSpeedCmd,temperatureCmd) - disposeSubscribe(airconditionDisposable) - airconditionDisposable = createSubscribe(10000){ - if (!LightAirconditionDoorStatusManager.airconditionStatus.isOpen&& - LightAirconditionDoorStatusManager.airconditionStatus.windSpeed!=windSpeedCmd&& - LightAirconditionDoorStatusManager.airconditionStatus.temperature!=temperatureCmd&& - LightAirconditionDoorStatusManager.airconditionStatus.pattert!=modeCmd) { - ToastCharterUtils.showShort("控制系统繁忙,请稍后再试") - } - } - } - fun closeAircondition(modeCmd: Int, windSpeedCmd: Int, temperatureCmd: Int) { - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "关闭空调") - CallerAutoPilotControlManager.sendRoboBusJinlvM1AirConditionerCmd(2,modeCmd,windSpeedCmd,temperatureCmd) - disposeSubscribe(airconditionDisposable) - airconditionDisposable = createSubscribe(10000){ - if (LightAirconditionDoorStatusManager.airconditionStatus.isOpen) { - ToastCharterUtils.showShort("控制系统繁忙,请稍后再试") - } - } - } - /** - * 设置暖风 - */ - fun openAndSetHeader(windSpeedCmd: Int) { - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "打开暖风机、档位${windSpeedCmd}") - CallerAutoPilotControlManager.sendRoboBusJinlvM1HeaderCmd(1,windSpeedCmd) - disposeSubscribe(heaterDisposable) - heaterDisposable = createSubscribe(10000){ - if (!LightAirconditionDoorStatusManager.heaterStatue.isOpen&& - LightAirconditionDoorStatusManager.heaterStatue.windSpeed!=windSpeedCmd) { - ToastCharterUtils.showShort("暖风机操作未生效,请稍后重试吧~") - } - } - } - - fun closeHeader(){ - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "关闭暖风机") - CallerAutoPilotControlManager.sendRoboBusJinlvM1HeaderCmd(2,0) - disposeSubscribe(heaterDisposable) - heaterDisposable = createSubscribe(10000){ - if (LightAirconditionDoorStatusManager.heaterStatue.isOpen) { - ToastCharterUtils.showShort("暖风机操作未生效,请稍后重试吧~")//还是开着的 - } - } - } - - fun setLightData1(leftLight: Boolean){ - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "顶灯2:$leftLight") - disposeSubscribe(subscribeLightTop1) - if(leftLight){ - CallerAutoPilotControlManager.sendRoboBusJinlvM1MainLamp1Cmd(1) - subscribeLightTop1 = createSubscribe{ - if (!LightAirconditionDoorStatusManager.lightStatus.isOpenLight1) { - ToastCharterUtils.showShort("控制系统繁忙,请稍后再试") - } - } - }else{ - CallerAutoPilotControlManager.sendRoboBusJinlvM1MainLamp1Cmd(2) - subscribeLightTop1 = createSubscribe{ - if (LightAirconditionDoorStatusManager.lightStatus.isOpenLight1) { - ToastCharterUtils.showShort("控制系统繁忙,请稍后再试") - } - } - } - } - fun setLightData2(rightLight: Boolean){ - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "顶灯1:$rightLight") - disposeSubscribe(subscribeLightTop2) - if(rightLight){ - CallerAutoPilotControlManager.sendRoboBusJinlvM1MainLamp2Cmd(1) - subscribeLightTop2 = createSubscribe{ - if (!LightAirconditionDoorStatusManager.lightStatus.isOpenLight2) { - ToastCharterUtils.showShort("控制系统繁忙,请稍后再试") - } - } - }else{ - CallerAutoPilotControlManager.sendRoboBusJinlvM1MainLamp2Cmd(2) - subscribeLightTop2 = createSubscribe{ - if (LightAirconditionDoorStatusManager.lightStatus.isOpenLight2) { - ToastCharterUtils.showShort("控制系统繁忙,请稍后再试") - } - } - } - } - fun setAtmosphereLightData2(atmosphereLight: Boolean){ - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "氛围灯:$atmosphereLight") - disposeSubscribe(subscribeLightAtmosphere) - if (atmosphereLight) { - CallerAutoPilotControlManager.sendRoboBusJinlvM1SmallLampCmd(1) - subscribeLightAtmosphere = createSubscribe{ - if (!LightAirconditionDoorStatusManager.lightStatus.isOpenatmosphere) { - ToastCharterUtils.showShort("控制系统繁忙,请稍后再试") - } - } - } else { - CallerAutoPilotControlManager.sendRoboBusJinlvM1SmallLampCmd(2) - subscribeLightAtmosphere = createSubscribe{ - if (LightAirconditionDoorStatusManager.lightStatus.isOpenatmosphere) { - ToastCharterUtils.showShort("控制系统繁忙,请稍后再试") - } - } - } - } -} \ No newline at end of file diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionVideoPresenter.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionVideoPresenter.kt deleted file mode 100644 index 48a1e275b9..0000000000 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionVideoPresenter.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.mogo.och.bus.passenger.presenter - -import com.mogo.och.bus.passenger.ui.video.M1VideoFragment - -class BusPassengerFunctionVideoPresenter(view: M1VideoFragment?) : - BusBasePassengerFunctionDevicePresenter(view) \ No newline at end of file diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/CharterPassengerNoviceGuidancePresenter.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/CharterPassengerNoviceGuidancePresenter.kt index c29775333b..da3e5d9d26 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/CharterPassengerNoviceGuidancePresenter.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/CharterPassengerNoviceGuidancePresenter.kt @@ -1,10 +1,8 @@ package com.mogo.och.bus.passenger.presenter import androidx.lifecycle.LifecycleOwner -import com.mogo.och.bus.passenger.R import com.mogo.och.bus.passenger.bean.response.OrderInfoResponse import com.mogo.och.bus.passenger.model.CharterPassengerModel -import com.mogo.och.bus.passenger.ui.dialogfragment.M1ContainFragment import com.mogo.och.bus.passenger.ui.dialogfragment.NoviceGuidanceFragment import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.common.module.utils.RxUtils diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/OrderInfoPresenter.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/OrderInfoPresenter.kt deleted file mode 100644 index b17d1dd43d..0000000000 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/presenter/OrderInfoPresenter.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.mogo.och.bus.passenger.presenter - -import androidx.lifecycle.LifecycleOwner -import com.mogo.eagle.core.data.BaseData -import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P -import com.mogo.eagle.core.utilcode.util.GsonUtils -import com.mogo.och.bus.passenger.utils.ToastCharterUtils -import com.mogo.och.bus.passenger.callback.ITimeCallback -import com.mogo.och.bus.passenger.model.CharterPassengerModel -import com.mogo.och.bus.passenger.ui.orderinfo.OrderInfoFragment -import com.mogo.och.common.module.bean.dpmsg.BaseDPMsg -import com.mogo.och.common.module.bean.dpmsg.EndOrderMsg -import com.mogo.och.common.module.biz.constant.OchCommonConst -import com.mogo.och.common.module.biz.network.OchCommonServiceCallback -import com.mogo.och.common.module.utils.DateTimeUtil - -class OrderInfoPresenter(view: OrderInfoFragment?) : - BusBasePassengerFunctionDevicePresenter(view), ITimeCallback { - companion object{ - private const val TAG = "OrderInfoPresenter" - } - override fun onCreate(owner: LifecycleOwner) { - super.onCreate(owner) - CharterPassengerModel.setOrderLeftTimeListeners(TAG,this) - getDataInfo() - } - - private fun getDataInfo() { - val currentOrderInfo = CharterPassengerModel.getCurrentOrderInfo() - currentOrderInfo?.let { - mView?.setPhone(it.passengerPhone?:"") - try { - mView?.setStartTimeAndEndTime( - DateTimeUtil.formatLongToString(it.startTime!!, DateTimeUtil.HH_mm), - DateTimeUtil.formatLongToString(it.endTime!!, DateTimeUtil.HH_mm)) - }catch (e:Exception){ - e.printStackTrace() - } - } - } - - override fun onDestroy(owner: LifecycleOwner) { - super.onDestroy(owner) - CharterPassengerModel.setOrderLeftTimeListeners(TAG,null) - } - - override fun setOrderTimeCallBack(timeInSecond: Long) { - val leftTime = DateTimeUtil.second2Time(timeInSecond) - mView?.setLeftTime(leftTime) - } - - fun endOrder() { - CharterPassengerModel.endOrder(object : OchCommonServiceCallback { - override fun onSuccess(data: BaseData?) { - if (null != data && 0 == data.code) { - ToastCharterUtils.showShort("结束成功") - CharterPassengerModel.setEndOrderStatus() - mView?.closeDialogContaion() - val msg = EndOrderMsg( - CharterPassengerModel.getCurrentOrderInfo()?.orderNo?:"", - ) - CallerTelematicManager.sendMsgToServer( - OchCommonConst.BUSINESS_STRING, - GsonUtils.toJson(msg).toByteArray() - ) - CallerLogger.d(M_BUS_P + BaseDPMsg.TAG, "发送数据:结束订单${msg}") - } - } - - override fun onFail(code: Int, msg: String) { - ToastCharterUtils.showShort("$code:$msg") - } - }) - } - - -} \ No newline at end of file diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/MainFragment.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/MainFragment.kt index 3d81be6386..ef56945ea5 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/MainFragment.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/MainFragment.kt @@ -23,7 +23,6 @@ import com.mogo.och.bus.passenger.presenter.BusPassengerPresenter import com.mogo.och.bus.passenger.ui.bottom.BottomBar import com.mogo.och.bus.passenger.ui.bottom.BottomClickView import com.mogo.och.bus.passenger.ui.dialogfragment.M1CarUserNoOrderFragment -import com.mogo.och.bus.passenger.ui.dialogfragment.M1ContainFragment import com.mogo.och.bus.passenger.ui.dialogfragment.NoviceGuidanceFragment import com.mogo.och.bus.passenger.utils.ToastCharterUtils import com.mogo.och.common.module.biz.constant.LoginStatusManager @@ -40,7 +39,6 @@ import java.lang.ref.WeakReference class MainFragment : MvpFragment() { - private var bpFunctionGroupDialogFragment: WeakReference? = null private var m1CarUserNoOrderFragment: WeakReference? = null private var noviceGuidanceFragment: WeakReference? = null @@ -179,19 +177,6 @@ class MainFragment : } } - private fun openSettingPage(tab: String) { - if (bpFunctionGroupDialogFragment?.get() == null) { - bpFunctionGroupDialogFragment = WeakReference(M1ContainFragment.newInstance()) - } - val bpFunctionGroup = bpFunctionGroupDialogFragment?.get() - M1ContainFragment.openSettingPage( - childFragmentManager, - parentFragmentManager, - bpFunctionGroup, - tab - ) - } - fun setCarModle(rawInfo: Int) { getMapUIController()?.changeCurrentIcon(rawInfo) HdMapBuildConfig.currentCarVrIconRes = rawInfo @@ -250,8 +235,6 @@ class MainFragment : } fun showOpenAndCloseDoor() { - val bpFunctionGroup = bpFunctionGroupDialogFragment?.get() - bpFunctionGroup?.dismissAllowingStateLoss() val noviceGuidanceFragment = noviceGuidanceFragment?.get() noviceGuidanceFragment?.dismissAllowingStateLoss() diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/dialogfragment/M1ContainFragment.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/dialogfragment/M1ContainFragment.kt deleted file mode 100644 index 08d9af1fe0..0000000000 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/dialogfragment/M1ContainFragment.kt +++ /dev/null @@ -1,322 +0,0 @@ -package com.mogo.och.bus.passenger.ui.dialogfragment - -import android.content.DialogInterface -import android.os.Bundle -import android.util.Log -import android.view.View -import android.view.WindowManager -import androidx.fragment.app.DialogFragment -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentTransaction -import com.mogo.commons.AbsMogoApplication -import com.mogo.commons.mvp.MvpDialogFragment -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P -import com.mogo.eagle.core.utilcode.util.* -import com.mogo.och.bus.passenger.R -import com.mogo.och.bus.passenger.bean.event.EventLineSites -import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionPresenter -import com.mogo.och.bus.passenger.ui.selectline.M1OrderLineFragment -import com.mogo.och.bus.passenger.ui.softcontrol.M1SoftFragment -import com.mogo.och.bus.passenger.ui.video.M1VideoFragment -import com.mogo.och.bus.passenger.ui.orderinfo.OrderInfoFragment -import com.mogo.och.bus.passenger.ui.bottom.BottomBar -import com.mogo.och.bus.passenger.ui.bottom.BottomClickView -import com.mogo.och.bus.passenger.utils.ToastCharterUtils -import com.mogo.och.common.module.biz.constant.LoginStatusManager -import com.mogo.och.common.module.manager.debug.DebugViewWatchDogFragment -import kotlinx.android.synthetic.main.m1_contain_fragment.* -import org.greenrobot.eventbus.EventBus - -/** - * @author: yangyakun - * @date: 2023/1/28 - */ -class M1ContainFragment : - MvpDialogFragment() { - - var tab: String = VIDEOTAB - var fragmentTag: String = M1VideoFragment.TAG - var fragment: Fragment? = null - - var closeThis:ContainDismiss = object :ContainDismiss{ - override fun closeDialog() { - dismissAllowingStateLoss() - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - CallerLogger.d(M_BUS_P+ TAG, "onCreate") - super.onCreate(savedInstanceState) - arguments?.let { - tab = it.getString(SELECTTAB, VIDEOTAB) - } - savedInstanceState?.let { - tab = it.getString(SELECTTAB, tab) - } - setStyle(STYLE_NO_TITLE, R.style.DialogFullScreen) //dialog全屏 - } - - private fun setCheckView() { //todo yakun 优化 - CallerLogger.d(M_BUS_P+ TAG, "setCheckView") - when (tab) { - VIDEOTAB -> { - fragment =childFragmentManager.findFragmentByTag(M1VideoFragment.TAG) - ?: M1VideoFragment.newInstance() - bb_bottom_bar.setCheckIndex(BottomBar.SelectView.VIDEO) - cl_container.setBackgroundResource(R.drawable.m1_function_bg) - fragmentTag = M1VideoFragment.TAG - } - SETTINGSOFTTAB -> { - fragment =childFragmentManager.findFragmentByTag(M1SoftFragment.TAG) - ?: M1SoftFragment.newInstance() - bb_bottom_bar.setCheckIndex(BottomBar.SelectView.SETTING) - cl_container.setBackgroundResource(R.drawable.m1_function_bg) - fragmentTag = M1SoftFragment.TAG - } - ORDERINFO -> { - fragment =childFragmentManager.findFragmentByTag(OrderInfoFragment.TAG) - ?: OrderInfoFragment.newInstance(closeThis) - bb_bottom_bar.setCheckIndex(BottomBar.SelectView.ORDERINFO) - cl_container.background = null - fragmentTag = OrderInfoFragment.TAG - } - SELECTLINE ->{ - fragment =childFragmentManager.findFragmentByTag(M1OrderLineFragment.TAG) - ?: M1OrderLineFragment.newInstance(closeThis) - bb_bottom_bar.setCheckIndex(BottomBar.SelectView.LINE) - cl_container.background = null - fragmentTag = M1OrderLineFragment.TAG - } - else -> {} - } - CallerLogger.d(M_BUS_P+ TAG, "fragment:$fragment") - - fragment?.let { - val beginTransaction = childFragmentManager.beginTransaction() - beginTransaction - .replace(R.id.fl_function_group, it, fragmentTag) - .commitNow() - } - - } - - override fun getLayoutId(): Int = R.layout.m1_contain_fragment - - override fun getTagName(): String = TAG - - override fun initViews() { - - //dialog?.setCancelable(false) - CallerLogger.d(M_BUS_P+ TAG, "initViews") - setCheckView() - cl_container.setOnClickListener { - dismissAllowingStateLoss() - } -// bb_bottom_bar.setSettingClickListener{ -// CallerLogger.d(M_BUS_P+ TAG, "initViews---$tab") -// if(tab==SETTINGSOFTTAB) { -// dismissAllowingStateLoss() -// }else{ -// tab = SETTINGSOFTTAB -// setCheckView() -// } -// } -// bb_bottom_bar.setLineClickListener{ -// CallerLogger.d(M_BUS_P+ TAG, "initViews---$tab") -// if(tab==SELECTLINE) { -// dismissAllowingStateLoss() -// }else{ -// tab = SELECTLINE -// setCheckView() -// } -// } -// bb_bottom_bar.setOrderInfoClickListener{ -// if (LoginStatusManager.isLogin()) { -// if(mPresenter?.haveOrder()==true){ -// -// }else{ -// ToastCharterUtils.showShort("请确认订单") -// return@setOrderInfoClickListener -// } -// }else{ -// ToastCharterUtils.showShort(AbsMogoApplication.getApp().getString(R.string.m1_please_login_driver)) -// return@setOrderInfoClickListener -// } -// -// CallerLogger.d(M_BUS_P+ TAG, "initViews---$tab") -// if(tab==ORDERINFO) { -// dismissAllowingStateLoss() -// }else{ -// tab = ORDERINFO -// setCheckView() -// } -// } - bb_bottom_bar.setApplyClickListener(object : BottomClickView.ApplyClickLintener{ - override fun onApplyClick() { - dismissAllowingStateLoss() - } - }) - } - - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - CallerLogger.d(M_BUS_P+ TAG, "onViewCreated") - dialog?.window?.let { - BarUtils.hideStatusBarAndSticky(it) - it.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) - dialog?.setOnShowListener { _ -> - it.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) - BarUtils.hideStatusBarAndSticky(it) - } - } - } - - override fun onDismiss(dialog: DialogInterface) { - super.onDismiss(dialog) - EventBus.getDefault().post(EventLineSites(null,null,true)) - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - CallerLogger.d(M_BUS_P+ TAG, "onSaveInstanceState") - context?.let { - SharedPrefs.getInstance(it).putString(SELECTTAB, tab) - } - } - - override fun createPresenter(): BusPassengerFunctionPresenter = - BusPassengerFunctionPresenter(this) - - /** - * 重写父类show()方法 - * 避免出现java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState - */ - override fun show(manager: FragmentManager, tag: String?) { - try { - var cls = this.javaClass.superclass ?: return - while (true) { - if (cls.name == "java.lang.Object") { - break - } - cls = cls.superclass!! - if (cls == DialogFragment::class.java) { - break - } - } - val mDismissed = cls.getDeclaredField("mDismissed") - val mShownByMe = cls.getDeclaredField("mShownByMe") - mDismissed.isAccessible = true - mShownByMe.isAccessible = true - mDismissed.setBoolean(this, false) - mShownByMe.setBoolean(this, true) - if (isAdded) { - return - } - val ft: FragmentTransaction = manager.beginTransaction() - ft.add(this, tag) - ft.commitAllowingStateLoss() - } catch (e: Exception) { - Log.e("DialogFragment", "show", e.fillInStackTrace()) - } - } - - override fun onViewStateRestored(savedInstanceState: Bundle?) { - CallerLogger.d(M_BUS_P+ TAG, "onViewStateRestored") - when (tab) { - VIDEOTAB -> { - - } - SETTINGSOFTTAB -> {} - ORDERINFO -> {} - SELECTLINE -> {} - else -> {} - } - super.onViewStateRestored(savedInstanceState) - } - - companion object { - const val TAG = "M1ContainFragment" - - /** - * 娱乐视频 - */ - const val VIDEOTAB = "VideoTab" - - /** - * 空调、暖风、灯和剩余设置 - */ - const val SETTINGSOFTTAB = "SettingSoftTab" - - /** - * 订单信息 - */ - const val ORDERINFO = "OrderInfo" - - /** - * 选择线路 - */ - const val SELECTLINE = "SelectLine" - - - - const val SELECTTAB = "SELECTTAB" - - @JvmStatic - fun newInstance(): M1ContainFragment { - val args = Bundle() - val fragment = M1ContainFragment() - CallerLogger.d(M_BUS_P + TAG, "创建新的Fragment") - fragment.arguments = args - return fragment - } - - - fun openSettingPage( - childFragmentManager: FragmentManager, - parentFragmentManager: FragmentManager, - bpFunctionGroup: M1ContainFragment?, - tab: String - ) { - val fragmentByTag: Fragment? = childFragmentManager.findFragmentByTag(TAG) - if (fragmentByTag is DialogFragment) { - if (fragmentByTag.dialog != null && fragmentByTag.dialog!!.isShowing) { - CallerLogger.d(M_BUS_P + TAG, "正在展示") - return - } - if (fragmentByTag.dialog != null && fragmentByTag.isAdded) { - if (AppStateManager.currentActivity() == null) { // 没有在当前应用内 在启动页面关闭应用 - CallerLogger.d(M_BUS_P + TAG, "权限验证") - return - } - } - } - bpFunctionGroup?.arguments?.putString(SELECTTAB, tab) - if (bpFunctionGroup != null) { - if (bpFunctionGroup.dialog != null && bpFunctionGroup.dialog!!.isShowing) { - CallerLogger.d(M_BUS_P + DebugViewWatchDogFragment.TAG, "正在展示") - return - } - if (ClickUtils.isFastClick()) { - if (bpFunctionGroup.isAdded) { - CallerLogger.d(M_BUS_P + DebugViewWatchDogFragment.TAG, "已经添加") - return - } - bpFunctionGroup.show(parentFragmentManager, TAG) - CallerLogger.d(M_BUS_P + TAG, "展示$tab---$bpFunctionGroup") - } else { - CallerLogger.d(M_BUS_P + TAG, "dialog 1s内执行一次") - } - } - } - } - - interface ContainDismiss{ - fun closeDialog() - } - interface ChangeCheck{ - fun changeChange() - } -} \ No newline at end of file diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/orderinfo/OrderInfoFragment.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/orderinfo/OrderInfoFragment.kt deleted file mode 100644 index 6985d281ee..0000000000 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/orderinfo/OrderInfoFragment.kt +++ /dev/null @@ -1,82 +0,0 @@ -package com.mogo.och.bus.passenger.ui.orderinfo - -import android.os.Bundle -import android.view.View -import com.mogo.commons.mvp.MvpFragment -import com.mogo.och.bus.passenger.R -import com.mogo.och.bus.passenger.presenter.OrderInfoPresenter -import com.mogo.och.bus.passenger.ui.dialogfragment.M1ContainFragment -import kotlinx.android.synthetic.main.m1_devices_fragment.* - -/** - * @author: yangyakun - * @date: 2023/1/28 - */ -class OrderInfoFragment : - MvpFragment() { - - private var dismiss: M1ContainFragment.ContainDismiss?=null - - override fun getLayoutId(): Int = R.layout.m1_devices_fragment - - override fun getTagName(): String = TAG - - override fun initViews() { - initListener() - } - - private fun initListener() { - actv_end_order_submit.setOnClickListener { - mPresenter?.endOrder() - } - actv_contain_order.setOnClickListener { - this.dismiss?.closeDialog() - } - actv_end_order.setOnClickListener { - cl_order_info.visibility = View.GONE - cl_order_info_endorder_comfit.visibility = View.VISIBLE - } - } - - fun setStartTimeAndEndTime(startTime:String,endTime:String){ - actv_order_times.text = "$startTime-$endTime" - } - fun setPhone(phone:String){ - if(phone.length>8) { - //截取电话号码前三位 - val phoneNumPre = phone.substring(0, 3); - //截取电话号码后四位 - val phoneNumFix = phone.substring(7); - actv_order_phone.text = "$phoneNumPre****$phoneNumFix" - }else{ - actv_order_phone.text = phone - } - } - - fun setLeftTime(leftTime:String){ - actv_left_time.text = "剩余时间 $leftTime" - } - - fun setContainDismiss(dismiss: M1ContainFragment.ContainDismiss) { - this.dismiss = dismiss - } - - fun closeDialogContaion(){ - this.dismiss?.closeDialog() - } - - override fun createPresenter(): OrderInfoPresenter = - OrderInfoPresenter(this) - - companion object { - const val TAG = "OrderInfoFragment" - @JvmStatic - fun newInstance(dismiss: M1ContainFragment.ContainDismiss): OrderInfoFragment { - val args = Bundle() - val fragment = OrderInfoFragment() - fragment.arguments = args - fragment.setContainDismiss(dismiss) - return fragment - } - } -} \ No newline at end of file diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/selectline/M1OrderLineFragment.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/selectline/M1OrderLineFragment.kt deleted file mode 100644 index 31a90cb044..0000000000 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/selectline/M1OrderLineFragment.kt +++ /dev/null @@ -1,268 +0,0 @@ -package com.mogo.och.bus.passenger.ui.selectline - -import android.animation.ObjectAnimator -import android.graphics.drawable.AnimationDrawable -import android.os.Bundle -import android.view.View -import android.view.animation.LinearInterpolator -import androidx.recyclerview.widget.LinearLayoutManager -import com.elegant.utils.UiThreadHandler -import com.mogo.commons.mvp.MvpFragment -import com.mogo.eagle.core.utilcode.kotlin.onClick -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant -import com.mogo.och.bus.passenger.utils.ToastCharterUtils -import com.mogo.och.bus.passenger.R -import com.mogo.och.bus.passenger.bean.response.LineInfoResponse -import com.mogo.och.bus.passenger.bean.response.SiteInfoResponse -import com.mogo.och.bus.passenger.model.CharterPassengerModel -import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionOrderPresenter -import com.mogo.och.bus.passenger.ui.selectline.adapter.OrderLineItemAdapter -import com.mogo.och.bus.passenger.ui.selectline.adapter.OrderSiteItemAdapter -import com.mogo.och.bus.passenger.ui.dialogfragment.M1ContainFragment -import com.mogo.och.bus.passenger.ui.selectline.layoutmanage.BottomDecoration -import com.mogo.och.common.module.utils.RxUtils -import io.reactivex.disposables.Disposable -import kotlinx.android.synthetic.main.m1_order_fragment.* -import kotlinx.android.synthetic.main.m1_order_loading.iv_loading_wait_ent -import me.jessyan.autosize.utils.AutoSizeUtils - -/** - * @author: yangyakun - * @date: 2023/1/28 - */ -class M1OrderLineFragment : - MvpFragment() { - - private var dismiss: M1ContainFragment.ContainDismiss? = null - - - private lateinit var lineAdapter: OrderLineItemAdapter - private lateinit var siteAdapter: OrderSiteItemAdapter - - val lineList = mutableListOf() - val siteList = mutableListOf() - - private var subscribeDirverAgree: Disposable? = null - private var subscribeDirverRefuse: Disposable? = null - - private val loadingAni = - ObjectAnimator.ofFloat(iv_loading_wait_ent, "rotation", 0f, 90f, 180f, 270f, 360f) - .apply { - repeatCount = -1 - interpolator = LinearInterpolator() - duration = 1000 - } - - - override fun getLayoutId(): Int { - return R.layout.m1_order_fragment - } - - override fun getTagName(): String { - return TAG - } - - override fun initViews() { - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "initViews") - lineAdapter = OrderLineItemAdapter(requireContext(), lineList) - siteAdapter = OrderSiteItemAdapter(requireContext(), siteList) - loadingAni.target = iv_loading_wait_ent - rlv_line_list.layoutManager = - LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) - rlv_line_list.addItemDecoration( - BottomDecoration( - AutoSizeUtils.dp2px(context, 60f) - ) - ) - rlv_line_list.adapter = lineAdapter - - rv_site_list.layoutManager = - LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) - rv_site_list.addItemDecoration( - BottomDecoration( - AutoSizeUtils.dp2px(context, 90f) - ) - ) - rv_site_list.adapter = siteAdapter - - initListener() - - } - - private fun initListener() { - lineAdapter.checkChangeListener = object : OrderLineItemAdapter.CheckListener { - override fun canSwitchLine(): Boolean { - return true - } - - override fun onCheckListener(lineInfo: LineInfoResponse.LineInfo) { - mPresenter?.checkLineClick(lineInfo) - siteAdapter.clearCheck() - } - } - siteAdapter.checkChangeListener = object : OrderSiteItemAdapter.CheckListener { - override fun canSwitchLine(): Boolean { - return mPresenter?.canSwitchLine()?:true - } - - override fun onCheckListener(siteInfo: SiteInfoResponse.SiteInfo?) { - // 设置临时选中的 - mPresenter?.checkSiteClick(siteInfo) - } - - } - tv_site_cancle.onClick { - mPresenter?.resetData() - } - tv_site_submit.onClick { - mPresenter?.changeSites(siteList) - } - - } - - - /** - * 设置是否可用选择站点 - */ - fun setEnableSiteStatus(cancleAndSubmit: Boolean) { - if (cancleAndSubmit) { - g_side_cancle_submit_group?.visibility = View.VISIBLE - } else { - g_side_cancle_submit_group?.visibility = View.GONE - } - } - - fun hideDataWaitDriverMsg() { - g_lines_sites_data?.visibility = View.GONE - g_loading_group?.visibility = View.VISIBLE - iv_loading_wait_driver?.let { - val animationDrawable = it.drawable as AnimationDrawable - animationDrawable.start() - } - } - - fun showSelectData() { - UiThreadHandler.post { - g_lines_sites_data?.visibility = View.VISIBLE - g_loading_group?.visibility = View.GONE - group_driver_agrenn_line?.visibility = View.GONE - aciv_driver_refuse_group?.visibility = View.GONE - } - } - - fun hideDataDriverAgree(){ - group_driver_agrenn_line?.visibility = View.VISIBLE - aciv_driver_refuse_group?.visibility = View.GONE - g_loading_group?.visibility = View.GONE - g_lines_sites_data?.let { - it.visibility = View.GONE - subscribeDirverAgree = RxUtils.createSubscribe(3_000) { - dismiss?.closeDialog() - } - } - } - fun hideDataDriverRefuse(){ - group_driver_agrenn_line?.visibility = View.GONE - aciv_driver_refuse_group?.visibility = View.VISIBLE - g_loading_group?.visibility = View.GONE - g_lines_sites_data?.let { - it.visibility = View.GONE - subscribeDirverRefuse = RxUtils.createSubscribe(3_000) { - showSelectData() - } - } - } - - fun setVisableByTrun( - showBiz: Boolean = false, - showNetError: Boolean = false, - showNorOrder: Boolean = false, - showLoading: Boolean = false - ) { - if(showBiz){ - // 选择线路页面 - m1_order_noorder?.visibility = View.GONE - m1_order_neterror?.visibility = View.GONE - lsv_line_site?.visibility = View.VISIBLE - m1_order_loading?.visibility = View.GONE - return - } - if(showNetError){ - m1_order_noorder?.visibility = View.GONE - m1_order_neterror?.visibility = View.VISIBLE - lsv_line_site?.visibility = View.GONE - m1_order_loading?.visibility = View.GONE - return - } - if(showNorOrder){ - m1_order_noorder?.visibility = View.VISIBLE - m1_order_neterror?.visibility = View.GONE - lsv_line_site?.visibility = View.GONE - m1_order_loading?.visibility = View.GONE - return - } - if(showLoading){ - m1_order_noorder?.visibility = View.GONE - m1_order_neterror?.visibility = View.GONE - lsv_line_site?.visibility = View.GONE - m1_order_loading?.visibility = View.VISIBLE - if (!loadingAni.isRunning) { - loadingAni.start() - } - } - } - - - fun go2StartCar() { - dismiss?.closeDialog() - } - - override fun createPresenter(): BusPassengerFunctionOrderPresenter { - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "createPresenter") - return BusPassengerFunctionOrderPresenter(this) - } - - override fun onDestroyView() { - super.onDestroyView() - loadingAni.cancel() - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "onDestroyView") - RxUtils.disposeSubscribe(subscribeDirverAgree) - RxUtils.disposeSubscribe(subscribeDirverRefuse) - } - - fun lineAdapterSubmit(lineInfo: LineInfoResponse.LineInfo) { - lineAdapter.submitLine(lineInfo) - } - - fun lineAdapterSetData( - lineInfo: List, - checkLine: LineInfoResponse.LineInfo? - ) { - lineAdapter.setDataList(lineInfo,checkLine) - } - - fun siteAdapterSetData(siteInfo: List) { - siteAdapter.setDataList(siteInfo) - } - fun siteAdapterEnableIndex(index: Int) { - siteAdapter.setEnableIndex(index) - } - - fun setContainDismiss(dismiss: M1ContainFragment.ContainDismiss) { - this.dismiss = dismiss - } - - companion object { - const val TAG = "M1OrderLineFragment" - - @JvmStatic - fun newInstance(dismiss: M1ContainFragment.ContainDismiss): M1OrderLineFragment { - val args = Bundle() - val fragment = M1OrderLineFragment() - fragment.arguments = args - fragment.setContainDismiss(dismiss) - return fragment - } - } -} \ No newline at end of file diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/selectline/SelectLineViewModel.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/selectline/SelectLineViewModel.kt index 54024fc9d1..c6c318859e 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/selectline/SelectLineViewModel.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/selectline/SelectLineViewModel.kt @@ -3,7 +3,6 @@ package com.mogo.och.bus.passenger.ui.selectline import androidx.lifecycle.ViewModel import com.elegant.utils.UiThreadHandler import com.mogo.commons.AbsMogoApplication -import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager @@ -17,24 +16,20 @@ import com.mogo.och.bus.passenger.bean.event.EventLineSites import com.mogo.och.bus.passenger.bean.response.LineInfoListResponse import com.mogo.och.bus.passenger.bean.response.LineInfoResponse import com.mogo.och.bus.passenger.bean.response.SiteInfoResponse -import com.mogo.och.bus.passenger.callback.ITimeCallback import com.mogo.och.bus.passenger.model.CharterPassengerModel import com.mogo.och.bus.passenger.model.IOrderStatusChangeListener import com.mogo.och.bus.passenger.model.OrderStatusEnum import com.mogo.och.bus.passenger.net.BusPassengerServiceManager -import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionOrderPresenter import com.mogo.och.bus.passenger.utils.ToastCharterUtils import com.mogo.och.common.module.bean.dpmsg.BaseDPMsg import com.mogo.och.common.module.bean.dpmsg.ChangeDestMsg import com.mogo.och.common.module.bean.dpmsg.DPMsgType -import com.mogo.och.common.module.bean.dpmsg.EndOrderMsg import com.mogo.och.common.module.bean.dpmsg.LineSite import com.mogo.och.common.module.biz.constant.OchCommonConst import com.mogo.och.common.module.biz.network.OchCommonServiceCallback import com.mogo.och.common.module.manager.StopSideStatusManager import com.mogo.och.common.module.manager.loopmanager.BizLoopManager import com.mogo.och.common.module.manager.loopmanager.LoopInfo -import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.common.module.utils.RxUtils import io.reactivex.disposables.Disposable import org.greenrobot.eventbus.EventBus diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/softcontrol/M1SoftFragment.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/softcontrol/M1SoftFragment.kt deleted file mode 100644 index 29b352dc9e..0000000000 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/softcontrol/M1SoftFragment.kt +++ /dev/null @@ -1,735 +0,0 @@ -package com.mogo.och.bus.passenger.ui.softcontrol - -import android.animation.ObjectAnimator -import android.animation.ValueAnimator -import android.annotation.SuppressLint -import android.content.Context -import android.graphics.BitmapFactory -import android.graphics.drawable.ClipDrawable -import android.graphics.drawable.LayerDrawable -import android.media.AudioManager -import android.os.Bundle -import android.view.Gravity -import android.view.View -import android.view.animation.LinearInterpolator -import android.widget.RadioButton -import android.widget.SeekBar -import android.widget.SeekBar.OnSeekBarChangeListener -import android.widget.TextView -import androidx.core.content.ContextCompat -import com.mogo.commons.mvp.MvpFragment -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant -import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr -import com.mogo.eagle.core.utilcode.util.ClickUtils -import com.mogo.och.bus.passenger.utils.ToastCharterUtils -import com.mogo.eagle.core.utilcode.util.UiThreadHandler -import com.mogo.och.bus.passenger.R -import com.mogo.och.bus.passenger.bean.Temperature -import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionSoftPresenter -import com.mogo.och.bus.passenger.ui.softcontrol.adapter.TemperatureAdapter -import com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage.PagerCenterSnapHelper -import com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage.HorizontalDecoration -import com.mogo.och.bus.passenger.ui.selectline.layoutmanage.PickerLayoutManager -import com.mogo.och.common.module.utils.SoundPoolHelper -import com.mogo.och.common.module.wigets.MineGradientDrawable -import io.reactivex.Observable -import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.disposables.Disposable -import kotlinx.android.synthetic.main.m1_soft_fragment.* -import me.jessyan.autosize.utils.AutoSizeUtils -import java.util.concurrent.TimeUnit - - -/** - * @author: yangyakun - * @date: 2023/1/28 - */ -class M1SoftFragment : - MvpFragment() { - - override fun getLayoutId(): Int = R.layout.m1_soft_fragment - - override fun getTagName(): String = TAG - - private var currentTemperature: Temperature? = null - - private var subscribeAir: Disposable? = null - private var subscribeLightTop1: Disposable? = null - private var subscribeLightTop2: Disposable? = null - private var subscribeAtmosphere: Disposable? = null - private var subscribeAnimator: Disposable? = null - - private var animator1: ObjectAnimator? = null - private val loadingAni = ObjectAnimator.ofFloat(iv_loading, "rotation", 0f, 90f ,180f, 270f, 360f).apply { - repeatCount = -1 - interpolator = LinearInterpolator() - duration = 1000 - } - - - override fun initViews() { - rg_select_function.setOnCheckedChangeListener { group, checkedId -> - when (checkedId) { - R.id.tv_setting_aircondition -> { - g_light_setting.visibility = View.GONE - g_voice_setting.visibility = View.GONE - if(loadingAni.isRunning){ - iv_loading.visibility = View.VISIBLE - g_aircondition_setting.visibility = View.GONE - }else{ - g_aircondition_setting.visibility = View.VISIBLE - } - } - R.id.tv_setting_lighting -> { - g_light_setting.visibility = View.VISIBLE - g_voice_setting.visibility = View.GONE - g_aircondition_setting.visibility = View.GONE - iv_loading.visibility = View.GONE - } - R.id.tv_setting_voice -> { - g_voice_setting.visibility = View.VISIBLE - g_aircondition_setting.visibility = View.GONE - g_light_setting.visibility = View.GONE - iv_loading.visibility = View.GONE - } - else -> {} - } - if(rb_pattern_heating.isChecked){ - iv_temperature_select.visibility = View.GONE - } - } - rg_select_function.check(R.id.tv_setting_aircondition) - setAirconditionListener() - setAirConditionAni() - setLightListener() - setVoiceInfo() - } - - private fun setAirConditionAni() { - dbv_wind.post { - dbv_wind?.let { - val measuredHeight = it.measuredHeight - animator1 = ObjectAnimator.ofInt(it, "showHeight", 0, measuredHeight).apply { - duration = 1000 - repeatCount = ValueAnimator.INFINITE - if(rg_setting_windspeed.checkedRadioButtonId!=0&&tv_aircondition_switch.isChecked){ - start() - } - } - } - } - } - - fun showAni(){ - iv_loading.visibility = View.VISIBLE - loadingAni.target = iv_loading - loadingAni.start() - g_aircondition_setting.visibility = View.GONE - subscribeAnimator = Observable.timer(10000, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - loadingAni.cancel() - iv_loading.visibility = View.GONE - if(tv_setting_aircondition.isChecked){ - g_aircondition_setting.visibility = View.VISIBLE - if(rb_pattern_heating.isChecked){ - iv_temperature_select.visibility = View.GONE - } - } - } - } - private fun setAirconditionListener() { - // 开关空调或暖风机 - tv_aircondition_switch.setOnCheckedChangeListener { buttonView, isChecked -> - if(!buttonView.isPressed){ - return@setOnCheckedChangeListener - } - SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di) - if(isChecked){//打开 - tv_aircondition_switch.setText("关闭空调") - if (rg_setting_pattern.checkedRadioButtonId == R.id.rb_pattern_heating) { - openHeater()// 打开暖风机 - } else { - openAircondition()// 打开空调 - } - showAni() - }else{// 关闭 - tv_aircondition_switch.setText("打开空调") - closeHeater()// 关闭暖风机 - closeAircondition()//关闭空调 - } - } - // 模式调节 - rg_setting_pattern.setOnCheckedChangeListener { group, checkedId -> - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "调节模式") - when (checkedId) { - R.id.rb_pattern_heating -> { - if(!rb_pattern_heating.isPressed){ - return@setOnCheckedChangeListener - } - SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di) - openHeater() - } - R.id.rb_pattern_automatic->{ - if(!rb_pattern_automatic.isPressed){ - return@setOnCheckedChangeListener - } - SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di) - openAircondition() - } - R.id.rb_pattern_refrigeration->{ - if(!rb_pattern_refrigeration.isPressed){ - return@setOnCheckedChangeListener - } - SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di) - openAircondition() - } - R.id.rb_pattern_ventilate->{ - if(!rb_pattern_ventilate.isPressed){ - return@setOnCheckedChangeListener - } - SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di) - openAircondition() - } - else -> { - openAircondition() - } - } - if(tv_aircondition_switch.isChecked) { - showAni() - } - } - - // 风速调节 - rg_setting_windspeed.setOnCheckedChangeListener { group, checkedId -> - when (checkedId) { - R.id.rb_wind_speed_low-> { - if(!rb_wind_speed_low.isPressed){ - return@setOnCheckedChangeListener - } - } - R.id.rb_wind_speed_middle-> { - if(!rb_wind_speed_middle.isPressed){ - return@setOnCheckedChangeListener - } - } - R.id.rb_wind_speed_high-> { - if(!rb_wind_speed_high.isPressed){ - return@setOnCheckedChangeListener - } - } - else -> {} - } - SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di) - if (rg_setting_pattern.checkedRadioButtonId == R.id.rb_pattern_heating) {//暖风机 - openHeater() - } else { - openAircondition() - } - } - val pickerLayoutManager = - PickerLayoutManager( - requireContext(), - PickerLayoutManager.HORIZONTAL, - false - ) - pickerLayoutManager.isChangeAlpha = true - pickerLayoutManager.scaleDownBy = 0.29f - pickerLayoutManager.scaleDownDistance = 0.8f - - val data = getData() - val adapter = TemperatureAdapter(requireContext(), data, rv_aircondition_temperature) - val snapHelper = PagerCenterSnapHelper() - snapHelper.attachToRecyclerView(rv_aircondition_temperature) - rv_aircondition_temperature.layoutManager = pickerLayoutManager - rv_aircondition_temperature.adapter = adapter - HorizontalDecoration.distance = SharedPrefsMgr.getInstance(requireContext()).getInt( - HorizontalDecoration.distancekey,0) - val space = AutoSizeUtils.dp2px(context, 15f) - rv_aircondition_temperature.addItemDecoration( - HorizontalDecoration( - space, - data.size - 1 - ) - ) - - pickerLayoutManager.setOnScrollStopListener { view -> - if (view is TextView) { - // 未拖到中点、自动滚动到中点会短时间触发两次 - val tag = view.tag - if (tag is Temperature) { - mPresenter?.disposeSubscribe(subscribeAir) - if(tag.index==0||tag.index==adapter.data.size-1){ - subscribeAir = Observable.timer(200, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - setCheckAir(adapter,tag) - } - }else { - if (ClickUtils.isClickTooFrequent(rv_aircondition_temperature)) { - return@setOnScrollStopListener - } - setCheckAir(adapter,tag) - } - } - - } - } - if(HorizontalDecoration.distance!=0){ - rv_aircondition_temperature.scrollToPosition(data.size-1) - adapter.setCheckIndex(data.size-1) - } - } - - private fun setCheckAir(adapter: TemperatureAdapter, tag:Temperature){ - adapter.setCheckIndex(tag.index) - currentTemperature = tag - if (rv_aircondition_temperature.tag == touchTag) { - rv_aircondition_temperature.tag = null - return - } else { - SoundPoolHelper.getSoundPoolHelper() - .playSoundWithRedId(context, R.raw.bus_di) - } - openAircondition() - } - - private fun getData(): MutableList { - val mutableListOf = mutableListOf() - mutableListOf.add(Temperature(0, 16, "16°")) - mutableListOf.add(Temperature(1, 17, "17°")) - mutableListOf.add(Temperature(2, 18, "18°")) - mutableListOf.add(Temperature(3, 19, "19°")) - mutableListOf.add(Temperature(4, 20, "20°")) - mutableListOf.add(Temperature(5, 21, "21°")) - mutableListOf.add(Temperature(6, 22, "22°")) - mutableListOf.add(Temperature(7, 23, "23°")) - mutableListOf.add(Temperature(8, 24, "24°")) - mutableListOf.add(Temperature(9, 25, "25°")) - mutableListOf.add(Temperature(10, 26, "26°")) - return mutableListOf - } - - /** - * 关闭空调 - */ - private fun closeAircondition() { - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "关闭空调") - var modeCmd = 0 - var windSpeedCmd = 0 - val temperatureCmd = currentTemperature?.value ?: 26 - closeHeater()//关闭暖风 - when (rg_setting_pattern.checkedRadioButtonId) { - R.id.rb_pattern_automatic -> modeCmd = 1 // 自动 - R.id.rb_pattern_refrigeration -> modeCmd = 2 // 制冷 - R.id.rb_pattern_ventilate -> modeCmd = 3 // 通风 - else -> {} - } - when (rg_setting_windspeed.checkedRadioButtonId) { - R.id.rb_wind_speed_low -> windSpeedCmd = 1 // 1档 - R.id.rb_wind_speed_middle -> windSpeedCmd = 2 // 2档 - R.id.rb_wind_speed_high -> windSpeedCmd = 3 // 3档 - else -> {} - } - mPresenter?.closeAircondition(modeCmd, windSpeedCmd, temperatureCmd) - } - - /** - * 开启空调 - */ - private fun openAircondition() { - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "打开空调") - var modeCmd = 0 - var windSpeedCmd = 0 - val temperatureCmd = currentTemperature?.value ?: 26 - closeHeater()//关闭暖风 - when (rg_setting_pattern.checkedRadioButtonId) { - R.id.rb_pattern_automatic -> modeCmd = 1 // 自动 - R.id.rb_pattern_refrigeration -> modeCmd = 2 // 制冷 - R.id.rb_pattern_ventilate -> modeCmd = 3 // 通风 - else -> {} - } - when (rg_setting_windspeed.checkedRadioButtonId) { - R.id.rb_wind_speed_low -> windSpeedCmd = 1 // 1档 - R.id.rb_wind_speed_middle -> windSpeedCmd = 2 // 2档 - R.id.rb_wind_speed_high -> windSpeedCmd = 3 // 3档 - else -> {} - } - if (!tv_aircondition_switch.isChecked) { - return - } - mPresenter?.openAndSetAircondition(modeCmd, windSpeedCmd, temperatureCmd) - } - - /** - * 根据车的状态会写页面状态 - */ - fun setAirconditionHeaterView( - airIsOpen: Boolean, - heaterIsOpen: Boolean, - temperatureCmd: Int, - pattern: Int, - windSpeed: Int - ) { - tv_aircondition_switch?.let { - if (!airIsOpen && !heaterIsOpen) { - tv_aircondition_switch.text = "打开空调" - tv_aircondition_switch.isChecked = false - dbv_wind.visibility = View.GONE - } else { - tv_aircondition_switch.text = "关闭空调" - tv_aircondition_switch.isChecked = true - dbv_wind.visibility = View.VISIBLE - } - if (airIsOpen) { - val adapter = rv_aircondition_temperature.adapter - if (adapter is TemperatureAdapter) { - adapter.data.forEach { - if (it.value == temperatureCmd) { - rv_aircondition_temperature.tag = touchTag - UiThreadHandler.postDelayed({ - rv_aircondition_temperature?.smoothScrollToPosition(it.index) - },500) - } - } - } - when (pattern) {//1: 自动模式, 2: 制冷模式, 3: 通风模式(仅送风,无温度) - 1 -> {rb_pattern_automatic.isChecked = true} - 2 -> {rb_pattern_refrigeration.isChecked = true} - 3 -> {rb_pattern_ventilate.isChecked = true} - else -> {} - } - heaterAirEnable(true) - when (windSpeed) {//1: 1档,2: 2档,3:3档 - 1 -> { - setWind(rb_wind_speed_low,R.drawable.bus_pm1_aircondition_wind_low) - } - 2 -> { - setWind(rb_wind_speed_middle,R.drawable.bus_pm1_aircondition_wind_middle) - } - 3 -> { - setWind(rb_wind_speed_high,R.drawable.bus_pm1_aircondition_wind_high) - } - else -> {} - } - } - if (heaterIsOpen) { - rb_pattern_heating.isChecked = true - heaterAirEnable(false) - when (windSpeed) {//1: 1档,2: 2档 - 1 -> { - setWind(rb_wind_speed_middle,R.drawable.bus_pm1_warm_wind_middle) - } - 2 -> { - setWind(rb_wind_speed_high,R.drawable.bus_pm1_warm_wind_high) - } - else -> {} - } - } - } - } - fun setWind(check: RadioButton,resource:Int){ - check.isChecked = true - dbv_wind.setDrawableImage(BitmapFactory.decodeResource(resources,resource)) - } - - /** - * 关闭暖风机 - */ - private fun closeHeater() { - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "关闭暖风") - heaterAirEnable(true) - mPresenter?.closeHeader() - } - - private fun heaterAirEnable(enable: Boolean) { - tv_temperature_title.isEnabled = enable - rv_aircondition_temperature.isEnabled = enable - val layoutManager = rv_aircondition_temperature.layoutManager - if (layoutManager is PickerLayoutManager) { - layoutManager.setHorizontallyScroll(enable) - } - val adapter = rv_aircondition_temperature.adapter as TemperatureAdapter - if(enable){ - adapter.setEnable(true) - if(tv_setting_aircondition.isChecked) { - if(iv_loading.visibility==View.GONE){ - iv_temperature_select.visibility = View.VISIBLE - } - } - rb_wind_speed_low.setTextColor(ContextCompat.getColorStateList(requireContext(),R.color.bus_p_function_airconditon_pattern_text_color_selector)) - }else{ - adapter.setEnable(false) - iv_temperature_select.visibility = View.GONE - rb_wind_speed_low.setTextColor(ContextCompat.getColor(requireContext(),R.color.bus_p_m1_6647576e)) - } - } - - /** - * 开启暖风机 - */ - private fun openHeater() { - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "打开暖风") - heaterAirEnable(false) - closeAircondition()//关闭空调 - val switch: Int - when (rg_setting_windspeed.checkedRadioButtonId) { - R.id.rb_wind_speed_low -> { - rb_wind_speed_middle.tag = touchTag - rb_wind_speed_middle.toggle() - switch = 1 - } - R.id.rb_wind_speed_middle -> { - switch = 1 - } - R.id.rb_wind_speed_high -> { - switch = 2 - } - else -> { - rb_wind_speed_middle.tag = touchTag - rb_wind_speed_middle.toggle() - switch = 1 - } - } - if (!tv_aircondition_switch.isChecked) { - return - } - mPresenter?.openAndSetHeader(switch) - } - - - // region 灯 - private fun setLightListener() { - tv_light_top_01.setOnCheckedChangeListener { buttonView, isChecked -> - if(!buttonView.isPressed){ - return@setOnCheckedChangeListener - } - tv_light_top_01.isEnabled = false - subscribeLightTop1 = Observable.timer(2000, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - tv_light_top_01.isEnabled = true - } - SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di) - mPresenter?.setLightData1(isChecked) - setLightTop1View(isChecked,true) - setLightView(isChecked,tv_light_top_02.isChecked) - } - tv_light_top_02.setOnCheckedChangeListener { buttonView, isChecked -> - if(!buttonView.isPressed){ - return@setOnCheckedChangeListener - } - tv_light_top_02.isEnabled = false - subscribeLightTop2 = Observable.timer(2000, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - tv_light_top_02.isEnabled = true - } - SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di) - mPresenter?.setLightData2(isChecked) - setLightTop2View(isChecked,true) - setLightView(tv_light_top_01.isChecked,isChecked) - } - tv_light_atmosphere.setOnCheckedChangeListener { buttonView, isChecked -> - if(!buttonView.isPressed){ - return@setOnCheckedChangeListener - } - tv_light_atmosphere.isEnabled = false - subscribeAtmosphere = Observable.timer(2000, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - tv_light_atmosphere.isEnabled = true - } - SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di) - mPresenter?.setAtmosphereLightData2(isChecked) - setLightAtmosphereView(isChecked,true) - } - } - - fun setLightTop1View(leftLight: Boolean, isFirst: Boolean){ - tv_light_top_01?.let { - if (leftLight) { - tv_light_top_01.text = requireContext().getString(R.string.bus_p_m1_close_light1) - tv_light_top_01.isChecked = true - if(!isFirst) ToastCharterUtils.showShort("打开顶灯1") - } else { - tv_light_top_01.text = requireContext().getString(R.string.bus_p_m1_open_light1) - tv_light_top_01.isChecked = false - if(!isFirst) ToastCharterUtils.showShort("关闭顶灯1") - } - } - } - fun setLightTop2View(rightLight: Boolean, isFirst: Boolean){ - tv_light_top_02?.let { - if (rightLight) { - tv_light_top_02.text = requireContext().getString(R.string.bus_p_m1_close_light2) - tv_light_top_02.isChecked = true - if(!isFirst) ToastCharterUtils.showShort("打开顶灯2") - } else { - tv_light_top_02.text = requireContext().getString(R.string.bus_p_m1_open_light2) - tv_light_top_02.isChecked = false - if(!isFirst) ToastCharterUtils.showShort("关闭顶灯2") - } - } - } - fun setLightAtmosphereView(atmosphereLight: Boolean, isFirst: Boolean){ - tv_light_atmosphere?.let { - if (atmosphereLight) { - tv_light_atmosphere.text = requireContext().getString(R.string.bus_p_m1_close_atmosphere) - tv_light_atmosphere.isChecked = true - iv_bottom_light_setting.setImageResource(R.drawable.bus_p_function_atmosphere_select) - if(!isFirst) ToastCharterUtils.showShort("打开氛围灯") - } else { - tv_light_atmosphere.text = requireContext().getString(R.string.bus_p_m1_open_atmosphere) - tv_light_atmosphere.isChecked = false - iv_bottom_light_setting.setImageResource(R.drawable.bus_p_function_atmosphere_nor) - if(!isFirst) ToastCharterUtils.showShort("关闭氛围灯") - } - } - } - - /** - * 灯的UI发生变化 - */ - fun setLightView(leftLight: Boolean, rightLight: Boolean) { - iv_top_light_setting?.let { - if (leftLight && rightLight) { - iv_top_light_setting.setImageResource(R.drawable.bus_p_function_light_middle_selected)// 都打开 - } else if (!leftLight && !rightLight) { - iv_top_light_setting.setImageResource(R.drawable.bus_p_function_light_nor)// 都关闭 - } else { - if (leftLight) { - iv_top_light_setting.setImageResource(R.drawable.bus_p_function_light_select_left)// 左面开 - } - if (rightLight) { - iv_top_light_setting.setImageResource(R.drawable.bus_p_function_light_select_right)// 左面开 - } - } - } - } - // endregion - - // region 声音 - private var mAudioManager: AudioManager? = null - private var mMaxVolume: Int? = 100 - - - @SuppressLint("NewApi") - private fun setVoiceInfo() { - val dp2px = AutoSizeUtils.dp2px(context, 26f)//进度条高度 - val color2CBFFC = ContextCompat.getColor(requireContext(), R.color.bus_p_m1_2cbffc) - val color1060FF = ContextCompat.getColor(requireContext(), R.color.bus_p_m1_1060ff) - val color96A5C2 = ContextCompat.getColor(requireContext(), R.color.bus_p_m1_96a5c2) - val temp03 = MineGradientDrawable(color2CBFFC, color1060FF, dp2px) - val scaleDrawable3 = ClipDrawable(temp03, Gravity.START, ClipDrawable.HORIZONTAL) - val temp01 = MineGradientDrawable(color96A5C2, color96A5C2, dp2px) - val arr = arrayOf(temp01, scaleDrawable3) - val ld = LayerDrawable(arr) - ld.setDrawableByLayerId(android.R.id.background, temp01) - ld.setDrawableByLayerId(android.R.id.progress, scaleDrawable3) - sb_voice_bar.setProgressDrawableTiled(ld) - sb_voice_bar.max = 100 - sb_voice_bar.min = 5 - sb_voice_bar.setOnSeekBarChangeListener(object : OnSeekBarChangeListener { - override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { - tv_current_voice_value.text = "$progress%" - if (fromUser) { - mMaxVolume?.let { - var currnetValue = ((progress.toFloat() / 100) * it).toInt() - if (currnetValue <= 0) { - currnetValue = 1 - } - mAudioManager?.setStreamVolume( - AudioManager.STREAM_MUSIC, - currnetValue, - AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE - ) - } - } - if (progress == 0) { - iv_voice.setImageResource(R.drawable.bus_p_function_voice_middle_select) - iv_end_voice.setImageResource(R.drawable.bus_p_function_voice_min) - } else { - iv_voice.setImageResource(R.drawable.bus_p_function_voice_middle_selected) - iv_end_voice.setImageResource(R.drawable.bus_p_function_voice_max) - } - - } - - override fun onStartTrackingTouch(seekBar: SeekBar?) {} - override fun onStopTrackingTouch(seekBar: SeekBar?) {} - }) - - context?.let { - mAudioManager = it.getSystemService(Context.AUDIO_SERVICE) as AudioManager - mMaxVolume = mAudioManager?.getStreamMaxVolume(AudioManager.STREAM_MUSIC) - val mCurrentVolume = mAudioManager?.getStreamVolume(AudioManager.STREAM_MUSIC) - mMaxVolume?.let { max -> - mCurrentVolume?.let { current -> - if (current == 1) { - sb_voice_bar.progress = 5 - tv_current_voice_value.text = "5%" - } else { - val fl = current.toFloat() / max * 100 - sb_voice_bar.progress = fl.toInt() - tv_current_voice_value.text = "${fl.toInt()}%" - } - } - } - - } - } - // endregion - - override fun createPresenter(): BusPassengerFunctionSoftPresenter = - BusPassengerFunctionSoftPresenter(this) - - override fun onDestroy() { - mPresenter?.disposeSubscribe(subscribeLightTop1) - mPresenter?.disposeSubscribe(subscribeLightTop2) - mPresenter?.disposeSubscribe(subscribeAtmosphere) - mPresenter?.disposeSubscribe(subscribeAnimator) - - super.onDestroy() - } - - override fun onResume() { - super.onResume() - if(rg_setting_windspeed.checkedRadioButtonId!=0&&tv_aircondition_switch.isChecked){ - animator1?.start() - } - } - - override fun onPause() { - super.onPause() - animator1?.let { - if(it.isRunning){ - it.pause() - } - } - } - - override fun onDetach() { - super.onDetach() - animator1?.let { - if(it.isRunning){ - it.end() - } - } - } - - companion object { - const val TAG = "M1SoftFragment" - const val touchTagKey = 2 - const val touchTag = 2 - - @JvmStatic - fun newInstance(): M1SoftFragment { - val args = Bundle() - val fragment = M1SoftFragment() - fragment.arguments = args - return fragment - } - } -} \ No newline at end of file diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/softcontrol/SoftControlView.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/softcontrol/SoftControlView.kt index bd297fb31b..2cde65d6b2 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/softcontrol/SoftControlView.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/softcontrol/SoftControlView.kt @@ -76,6 +76,8 @@ class SoftControlView : ConstraintLayout, SoftControlViewModel.SoftControlCallba private val TAG = "OrderInfoView" + private val touchTag = 2 + private var viewModel: SoftControlViewModel? = null constructor(context: Context) : super(context) @@ -177,7 +179,7 @@ class SoftControlView : ConstraintLayout, SoftControlViewModel.SoftControlCallba * 关闭暖风机 */ private fun closeHeater() { - CallerLogger.d(SceneConstant.M_BUS_P + M1SoftFragment.TAG, "关闭暖风") + CallerLogger.d(SceneConstant.M_BUS_P + TAG, "关闭暖风") heaterAirEnable(true) viewModel?.closeHeader() } @@ -219,13 +221,13 @@ class SoftControlView : ConstraintLayout, SoftControlViewModel.SoftControlCallba * 开启暖风机 */ private fun openHeater() { - CallerLogger.d(SceneConstant.M_BUS_P + M1SoftFragment.TAG, "打开暖风") + CallerLogger.d(SceneConstant.M_BUS_P + TAG, "打开暖风") heaterAirEnable(false) closeAircondition()//关闭空调 val switch: Int when (rg_setting_windspeed.checkedRadioButtonId) { R.id.rb_wind_speed_low -> { - rb_wind_speed_middle.tag = M1SoftFragment.touchTag + rb_wind_speed_middle.tag = touchTag rb_wind_speed_middle.toggle() switch = 1 } @@ -239,7 +241,7 @@ class SoftControlView : ConstraintLayout, SoftControlViewModel.SoftControlCallba } else -> { - rb_wind_speed_middle.tag = M1SoftFragment.touchTag + rb_wind_speed_middle.tag = touchTag rb_wind_speed_middle.toggle() switch = 1 } @@ -254,7 +256,7 @@ class SoftControlView : ConstraintLayout, SoftControlViewModel.SoftControlCallba * 关闭空调 */ private fun closeAircondition() { - CallerLogger.d(SceneConstant.M_BUS_P + M1SoftFragment.TAG, "关闭空调") + CallerLogger.d(SceneConstant.M_BUS_P + TAG, "关闭空调") var modeCmd = 0 var windSpeedCmd = 0 val temperatureCmd = currentTemperature?.value ?: 26 @@ -297,7 +299,7 @@ class SoftControlView : ConstraintLayout, SoftControlViewModel.SoftControlCallba * 开启空调 */ private fun openAircondition() { - CallerLogger.d(SceneConstant.M_BUS_P + M1SoftFragment.TAG, "打开空调") + CallerLogger.d(SceneConstant.M_BUS_P + TAG, "打开空调") var modeCmd = 0 var windSpeedCmd = 0 val temperatureCmd = currentTemperature?.value ?: 26 @@ -323,7 +325,7 @@ class SoftControlView : ConstraintLayout, SoftControlViewModel.SoftControlCallba private fun setCheckAir(adapter: TemperatureAdapter, tag: Temperature) { adapter.setCheckIndex(tag.index) currentTemperature = tag - if (rv_aircondition_temperature.tag == M1SoftFragment.touchTag) { + if (rv_aircondition_temperature.tag == touchTag) { rv_aircondition_temperature.tag = null return } else { @@ -554,7 +556,7 @@ class SoftControlView : ConstraintLayout, SoftControlViewModel.SoftControlCallba } // 模式调节 rg_setting_pattern.setOnCheckedChangeListener { group, checkedId -> - CallerLogger.d(SceneConstant.M_BUS_P + M1SoftFragment.TAG, "调节模式") + CallerLogger.d(SceneConstant.M_BUS_P + TAG, "调节模式") when (checkedId) { R.id.rb_pattern_heating -> { if (!rb_pattern_heating.isPressed) { @@ -723,7 +725,7 @@ class SoftControlView : ConstraintLayout, SoftControlViewModel.SoftControlCallba if (adapter is TemperatureAdapter) { adapter.data.forEach { if (it.value == temperatureCmd) { - rv_aircondition_temperature.tag = M1SoftFragment.touchTag + rv_aircondition_temperature.tag = touchTag UiThreadHandler.postDelayed({ rv_aircondition_temperature?.smoothScrollToPosition(it.index) }, 500) diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/video/M1VideoFragment.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/video/M1VideoFragment.kt deleted file mode 100644 index 746548ad23..0000000000 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/video/M1VideoFragment.kt +++ /dev/null @@ -1,163 +0,0 @@ -package com.mogo.och.bus.passenger.ui.video - -import android.os.Bundle -import android.view.View -import androidx.recyclerview.widget.RecyclerView -import com.mogo.commons.mvp.MvpFragment -import com.mogo.och.bus.passenger.R -import com.mogo.och.bus.passenger.bean.TaxiPassengerVideoPlay -import com.mogo.och.bus.passenger.presenter.BusPassengerFunctionVideoPresenter -import com.mogo.och.bus.passenger.ui.video.adapter.RecyclerVideoAdapter -import com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage.CarouselLayoutManager -import com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage.CarouselZoomPostLayoutListener -import com.mogo.och.bus.passenger.ui.softcontrol.layoutmanage.CenterScrollListener -import com.shuyu.gsyvideoplayer.video.base.GSYVideoView -import kotlinx.android.synthetic.main.m1_video_fragment.* -import kotlin.math.floor - -/** - * @author: yangyakun - * @date: 2023/1/28 - */ -class M1VideoFragment : - MvpFragment() { - - private val arrayListOf = ArrayList() - - override fun getLayoutId(): Int { - return R.layout.m1_video_fragment - } - - override fun getTagName(): String { - return TAG - } - - override fun initViews() { - initConsultData() - val carouselLayoutManager = - CarouselLayoutManager( - CarouselLayoutManager.HORIZONTAL, - true - ) - carouselLayoutManager.setPostLayoutListener(CarouselZoomPostLayoutListener()) - carouselLayoutManager.maxVisibleItems = 1 - rvVideoPlaylist.addOnScrollListener(object : CenterScrollListener() { - var prePlayerPosition = 0 - override fun pageSelect(recyclerView: RecyclerView?, newState: Int) { - //播放视频 - val (centerItemPosition: kotlin.Int, player) = getPlayer(carouselLayoutManager) - if (player is ConsultVideoPlayer) { - if (prePlayerPosition != centerItemPosition) { - if (player.currentState == GSYVideoView.CURRENT_STATE_PAUSE) { - player.onVideoReset() - } - val playerHolder = - carouselLayoutManager.findViewByPosition(prePlayerPosition) - val prePlayer = - playerHolder?.findViewById(R.id.video_item_player) - prePlayer?.onVideoReset() - val taxiPassengerVideoPlay = arrayListOf[centerItemPosition] - setBackageAndPlayNext(taxiPassengerVideoPlay) - } else { - player.onVideoResume(false) - } - } - prePlayerPosition = centerItemPosition - } - - override fun pageStop() { - val (_, player) = getPlayer(carouselLayoutManager) - if (player is ConsultVideoPlayer) { - player.onVideoPause() - } - } - - }) - carouselLayoutManager.addOnDargAutoDiffListener { adapterPosition, currentPosition -> - val fl = adapterPosition - floor(adapterPosition) - var currentIndex = currentPosition - if (fl > 0.5) { - if (currentPosition == 0) { - currentIndex = rvVideoPlaylist?.adapter!!.itemCount - 1 - } else { - currentIndex -= 1 - } - } - } - val recyclerVideoAdapter = - RecyclerVideoAdapter( - requireContext(), - arrayListOf, - rvVideoPlaylist - ) - recyclerVideoAdapter.setOnThumbImageClilckListener { - val (_, player) = getPlayer(carouselLayoutManager) - if (player is ConsultVideoPlayer) { - player.onVideoReset() - player.thumbImageViewLayout.visibility = View.VISIBLE - } - rvVideoPlaylist?.smoothScrollToPosition(it) - } - rvVideoPlaylist?.layoutManager = carouselLayoutManager - rvVideoPlaylist?.setHasFixedSize(true) - rvVideoPlaylist?.adapter = recyclerVideoAdapter - } - - private fun getPlayer(carouselLayoutManager: CarouselLayoutManager): Pair { - val centerItemPosition: Int = carouselLayoutManager.centerItemPosition - val playerHolder = carouselLayoutManager.findViewByPosition(centerItemPosition) - val player = playerHolder?.findViewById(R.id.video_item_player) - return Pair(centerItemPosition, player) - } - - private fun setBackageAndPlayNext(taxiPassengerVideoPlay: TaxiPassengerVideoPlay) { - // 设置背景图片 - } - - private fun initConsultData() { - arrayListOf.clear() - arrayListOf.add( - TaxiPassengerVideoPlay( - "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708596763/全车型混剪增加红旗车队.m4v", - "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969511280/车队.png", - "蘑菇车联覆盖生活的方方面面" - ) - ) - arrayListOf.add( - TaxiPassengerVideoPlay( - "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708554279/红旗车队.m4v", - "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969553174/红旗重新排版.png", - "蘑菇车联之红旗车队" - ) - ) - arrayListOf.add( - TaxiPassengerVideoPlay( - "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v", - "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969536177/大运会.png", - "蘑菇车联牵手成都大运会" - ) - ) - arrayListOf.add( - TaxiPassengerVideoPlay( - "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708409810/20210610重新排版3屏.m4v", - "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969579713/三屏.png", - "多视角体验蘑菇车联自动驾驶" - ) - ) - } - - override fun createPresenter(): BusPassengerFunctionVideoPresenter { - return BusPassengerFunctionVideoPresenter(this) - } - - companion object { - const val TAG = "M1VideoFragment" - @JvmStatic - fun newInstance(): M1VideoFragment { - val args = Bundle() - val fragment = M1VideoFragment() - fragment.arguments = args - return fragment - } - } -} \ No newline at end of file From 06151317da32a9a56c73ec37e1846c7e228cb907 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Fri, 18 Aug 2023 15:31:53 +0800 Subject: [PATCH 05/22] =?UTF-8?q?[6.0.0]=20=E6=9C=8D=E5=8A=A1=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E8=BF=94=E5=9B=9E=E5=80=BC=E4=BF=AE=E6=94=B9,=20?= =?UTF-8?q?=E5=BC=80=E5=A7=8B=E4=BB=BB=E5=8A=A1=E9=80=BB=E8=BE=91=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mogo/och/taxi/base/BaseTaxiTabFragment.kt | 2 -- .../main/java/com/mogo/och/taxi/bean/UnmannedTaskBean.kt | 2 +- .../src/main/java/com/mogo/och/taxi/model/TaxiModel.kt | 9 ++++++++- .../com/mogo/och/taxi/model/TaxiUnmannedViewModel.kt | 4 +++- .../java/com/mogo/och/taxi/network/CarServiceManager.kt | 2 +- .../java/com/mogo/och/taxi/ui/TaxiBeingTaskFragment.kt | 2 +- .../com/mogo/och/taxi/ui/TaxiReserveOrderFragment.kt | 2 +- .../src/main/res/values/strings.xml | 1 - 8 files changed, 15 insertions(+), 9 deletions(-) diff --git a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseTaxiTabFragment.kt b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseTaxiTabFragment.kt index 7803ac53f6..2d349303d9 100644 --- a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseTaxiTabFragment.kt +++ b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseTaxiTabFragment.kt @@ -193,8 +193,6 @@ abstract class BaseTaxiTabFragment> : MvpFragment= TaxiOrderStatusEnum.ArriveAtStart.code) + it.order!!.orderLine + else + it.lineId + ) } } /** diff --git a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiUnmannedViewModel.kt b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiUnmannedViewModel.kt index c0c6071ddb..83a5b22ee8 100644 --- a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiUnmannedViewModel.kt +++ b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiUnmannedViewModel.kt @@ -367,6 +367,8 @@ class TaxiUnmannedViewModel : BaseViewModel(){ queryCarOrderByOrderNo(mContext,orderNo, object : OchCommonServiceCallback{ override fun onSuccess(data: QueryCarOrderByNoRespBean?) { + d(SceneConstant.M_TAXI + TAG, "queryCurrentOrderStatusByNo data = " + + GsonUtil.jsonFromObject(data)) if (data == null || data.code != 0) return if (data.data.orderStatus == TaxiOrderStatusEnum.Cancel.code){ VoiceNotice.showNotice("乘客已经取消") @@ -375,7 +377,7 @@ class TaxiUnmannedViewModel : BaseViewModel(){ return } if (data.data.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.code){//到站 - updateOrderMileAndDur(data.data.mileage,data.data.duration) + updateOrderMileAndDur(data.data.mileage,data.data.duration.toInt()) return } if (data.data.orderStatus == TaxiOrderStatusEnum.JourneyCompleted.code){//完成 diff --git a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/CarServiceManager.kt b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/CarServiceManager.kt index eb0a4e845e..b4f332339f 100644 --- a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/CarServiceManager.kt +++ b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/CarServiceManager.kt @@ -128,7 +128,7 @@ object CarServiceManager { mOCHTaxiServiceApi.queryCarOrderByOrderNo( data = QueryCarOrderByNoReqBean(MoGoAiCloudClientConfig.getInstance().sn, orderNo) ).transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "jumpPassengerCheck")) + .subscribe(OchCommonSubscribeImpl(context, callback, "queryCarOrderByOrderNo")) } /** diff --git a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiBeingTaskFragment.kt b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiBeingTaskFragment.kt index d8a462e25a..1281083b59 100644 --- a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiBeingTaskFragment.kt +++ b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiBeingTaskFragment.kt @@ -296,7 +296,7 @@ class TaxiBeingTaskFragment : BaseFragment(), taskTypeTv.text = resources.getString(R.string.task_order) taskTypeTv.background = resources.getDrawable(R.drawable.task_order_type_btn_bg,null) orderPhoneAndNum.text = Html.fromHtml(" " + order.bookingUserPhone + "" + - " | " + + " | " + "" + order.passengerSize + "人" + "",Html.FROM_HTML_MODE_LEGACY) startStationName.text = order.orderStartSite?.siteName endStationName.text = order.orderEndSite?.siteName diff --git a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiReserveOrderFragment.kt b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiReserveOrderFragment.kt index c24b62bbe8..16ae878dec 100644 --- a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiReserveOrderFragment.kt +++ b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiReserveOrderFragment.kt @@ -75,7 +75,7 @@ class TaxiReserveOrderFragment : BaseFragment() { naviToEnd.visibility = View.GONE orderPhoneAndNum.text = Html.fromHtml(" " + order.bookingUserPhone + "" + - " | " + + " | " + "" + order.passengerSize + "人" + "",Html.FROM_HTML_MODE_LEGACY) diff --git a/OCH/taxi/mogo-och-taxi-unmanned/src/main/res/values/strings.xml b/OCH/taxi/mogo-och-taxi-unmanned/src/main/res/values/strings.xml index f6de06a0e7..ef01af0987 100644 --- a/OCH/taxi/mogo-och-taxi-unmanned/src/main/res/values/strings.xml +++ b/OCH/taxi/mogo-och-taxi-unmanned/src/main/res/values/strings.xml @@ -30,7 +30,6 @@ 自动驾驶状态为0不可用 - 司机端未确认可以开启自动驾驶 网络异常,请稍后重试 请求出现异常,请稍后重试 From 9b914b27c239f7d063037a7dd0e96bada2bac5d3 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Fri, 18 Aug 2023 17:00:56 +0800 Subject: [PATCH 06/22] =?UTF-8?q?[6.0.0]=20[=E4=BF=AE=E6=94=B9=E7=BA=BF?= =?UTF-8?q?=E8=B7=AF]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/CharterTrajectoryManager.kt | 17 +++++++++++ .../mogo/och/charter/model/DriverM1Model.kt | 29 ++++++++++++++----- .../passenger/model/CharterPassengerModel.kt | 10 +++++++ 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/OCH/charter/driver/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterTrajectoryManager.kt b/OCH/charter/driver/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterTrajectoryManager.kt index 40c9647688..8a87dae3aa 100644 --- a/OCH/charter/driver/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterTrajectoryManager.kt +++ b/OCH/charter/driver/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterTrajectoryManager.kt @@ -1,14 +1,21 @@ package com.magic.mogo.och.charter.manager +import com.magic.mogo.och.charter.R import com.magic.mogo.och.charter.constant.CharterConst import com.magic.mogo.och.charter.model.DriverM1Model.Companion.get import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLine +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.OperationMsg import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.sendTrajectoryDownloadReq +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.util.ActivityUtils import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.och.common.module.biz.constant.LoginStatusManager +import com.mogo.och.common.module.utils.SoundPoolHelper import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable @@ -80,6 +87,16 @@ object CharterTrajectoryManager { // 5. 轨迹管理_轨迹下载超时 d(SceneConstant.M_CHARTER_D + TAG, "onAutopilotGuardian() 轨迹下载超时") // ToastUtils.showShort("轨迹下载超时"); + } else if ("IMAP_TRA_LOADED" == guardianInfo.getCode()) { + CallerMsgBoxManager.saveMsgBox( + MsgBoxBean( + MsgBoxType.OPERATION, + OperationMsg( + System.currentTimeMillis(), "请尽快操作车辆至适当位置掉头!", -1 + ) + ) + ) + SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(ActivityUtils.getTopActivity(), R.raw.startautopilot) } else if ("ISSM_FUNC_AUTO_PILOT_READY" == guardianInfo.getCode()) { // 收到ssm的自动驾驶变为ready,再次下发轨迹下载.解决:域控重启,或者102域控启动太早,107节点初始化未完成导致的轨迹未进行下载。 d(SceneConstant.M_CHARTER_D + TAG, "onAutopilotGuardian() ssm ready,再次发起下载") diff --git a/OCH/charter/driver/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt b/OCH/charter/driver/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt index 7e5b56e08a..0348fab89c 100644 --- a/OCH/charter/driver/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt +++ b/OCH/charter/driver/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt @@ -23,12 +23,16 @@ import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.OperationMsg import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.startAutoPilot import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager.sendMsgToAllClients import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -231,18 +235,18 @@ class DriverM1Model { private fun showChangerDestCommitDialog(changeDestMsg: ChangeDestMsg) { if (!TextUtils.isEmpty(changeDestMsg.destSiteName) && !TextUtils.isEmpty(changeDestMsg.lineName)){ - if (changeDestMsg.lineId == currentChangeDestMsg?.lineId){//同一条路线切换站点不需要再确认 + //if (changeDestMsg.lineId == currentChangeDestMsg?.lineId){//同一条路线切换站点不需要再确认 currentChangeDestMsg = changeDestMsg changeDest() return - } + //} 不用司机端确认直接保存 - currentChangeDestMsg = changeDestMsg +// currentChangeDestMsg = changeDestMsg - UiThreadHandler.post{ - mChangeDestCallback?.showCommitDialog("确认路线站点", - "请确认是否前往 "+ changeDestMsg.lineName+ changeDestMsg.destSiteName + " 站点") - } +// UiThreadHandler.post{ +// mChangeDestCallback?.showCommitDialog("确认路线站点", +// "请确认是否前往 "+ changeDestMsg.lineName+ changeDestMsg.destSiteName + " 站点") +// } } } @@ -783,6 +787,17 @@ class DriverM1Model { CallerAutoPilotControlManager.cancelAutoPilot() queryCurrentServiceStatus() sendCommitMsgToClient(true,writeVersion) + CallerMsgBoxManager.saveMsgBox( + MsgBoxBean( + MsgBoxType.OPERATION, + OperationMsg( + System.currentTimeMillis(), + "即将前往路线${currentChangeDestMsg!!.lineName}、站点${currentChangeDestMsg!!.destSiteName};如需掉头请尽快操作车辆至适当位置!", + -1 + ) + ) + ) + SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(ActivityUtils.getTopActivity(), R.raw.startautopilot) } } diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt index c4c92b5708..9bc7c5cf5d 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt @@ -53,6 +53,7 @@ import io.reactivex.Observable import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers import mogo.telematics.pad.MessagePad +import mogo_msg.MogoReportMsg import java.util.* import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.TimeUnit @@ -222,6 +223,15 @@ object CharterPassengerModel { } } + override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) { + super.onAutopilotGuardian(guardianInfo) + guardianInfo?.let { + if (it.code=="IMAP_TRA_LOADED") { + ToastCharterUtils.showShort("请等待车辆完成掉头后再出发吧~") + } + } + } + override fun onAutopilotArriveAtStation(arrivalNotification: MessagePad.ArrivalNotification?) { d(M_BUS_P + TAG, "底盘给到站信息") arriveDest() From f538b35b70f372dcaa283371bfcc04a0132cd6e6 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Fri, 18 Aug 2023 18:49:06 +0800 Subject: [PATCH 07/22] [6.0.0] update log version to fix crash --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 80c8496457..b7bd13f2bf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -63,7 +63,7 @@ BIZCONFIG_VERSION=1.3.2 SERVICE_BIZ_VERSION=1.2.4 ################ 外部依赖引用 ################ # loglib -LOGLIB_VERSION=1.8.1 +LOGLIB_VERSION=1.8.2 ######## MogoAiCloudSDK Version ######## # 网络请求LOGLIB_VERSION MOGO_NETWORK_VERSION=1.4.7.12 From bf43597dc59c164a409b8cb93c58c9aed6897a0c Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Fri, 18 Aug 2023 18:52:04 +0800 Subject: [PATCH 08/22] =?UTF-8?q?[6.0.0]=E5=8E=BB=E9=99=A4=E5=B7=A6?= =?UTF-8?q?=E4=B8=8B=E8=A7=92=E9=9A=90=E8=97=8F=E7=BE=8E=E5=8C=96=E5=BC=80?= =?UTF-8?q?=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/res/layout/charter_base_fragment.xml | 10 ---------- .../src/main/res/layout/bus_base_fragment.xml | 10 ---------- .../src/main/res/layout/och_noop_fragment_hmi.xml | 10 ---------- .../src/main/res/layout/bus_base_fragment.xml | 10 ---------- .../src/main/res/layout/taxi_base_fragment.xml | 9 --------- .../src/main/res/layout/taxi_base_fragment.xml | 8 -------- 6 files changed, 57 deletions(-) diff --git a/OCH/charter/driver/src/main/res/layout/charter_base_fragment.xml b/OCH/charter/driver/src/main/res/layout/charter_base_fragment.xml index 08318efc67..6a13691666 100644 --- a/OCH/charter/driver/src/main/res/layout/charter_base_fragment.xml +++ b/OCH/charter/driver/src/main/res/layout/charter_base_fragment.xml @@ -159,16 +159,6 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> - - - - - - - - - - - - - - - - - Date: Fri, 18 Aug 2023 19:06:59 +0800 Subject: [PATCH 09/22] =?UTF-8?q?[6.0.0]=201=E3=80=81=E5=BD=93=E6=8E=A5?= =?UTF-8?q?=E9=A9=BE=E4=BB=BB=E5=8A=A1=E7=BB=93=E6=9D=9F=E5=90=8E,=20?= =?UTF-8?q?=E7=AB=8B=E9=A9=AC=E8=8E=B7=E5=8F=96=E4=B8=8B=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1,=20=E4=B8=8D=E7=AD=89=E5=BE=8530s=20=20=20?= =?UTF-8?q?=20=202=E3=80=81UI=E8=B5=B0=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../layout/start_autopilot_animation_view.xml | 4 +- .../java/com/mogo/och/taxi/model/TaxiModel.kt | 10 --- .../och/taxi/model/TaxiUnmannedViewModel.kt | 67 ++++++++++++------- .../mogo/och/taxi/ui/TaxiBeingTaskFragment.kt | 22 +++++- .../och/taxi/ui/TaxiReserveOrderFragment.kt | 2 +- .../main/res/layout/taxi_base_fragment.xml | 21 +++--- .../main/res/layout/unmanned_being_order.xml | 38 +++++------ 7 files changed, 95 insertions(+), 69 deletions(-) diff --git a/OCH/mogo-och-common-module/src/main/res/layout/start_autopilot_animation_view.xml b/OCH/mogo-och-common-module/src/main/res/layout/start_autopilot_animation_view.xml index db831f47da..e32fc060b1 100644 --- a/OCH/mogo-och-common-module/src/main/res/layout/start_autopilot_animation_view.xml +++ b/OCH/mogo-och-common-module/src/main/res/layout/start_autopilot_animation_view.xml @@ -17,8 +17,10 @@ android:id="@+id/startAutopilotTip" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginTop="@dimen/dp_20" android:layout_gravity="center_horizontal" android:visibility="gone" - android:textSize="@dimen/dp_34" + android:textStyle="bold" + android:textSize="@dimen/dp_42" android:textColor="@android:color/white"/> \ No newline at end of file diff --git a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModel.kt b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModel.kt index c371b56039..1f760907e1 100644 --- a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModel.kt +++ b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModel.kt @@ -720,16 +720,6 @@ object TaxiModel { } arriveSite(mUntruthTask!!.siteId, false) } - /** - * 订单流转debug START - */ - fun setArriveAtStartStation() { - if (!checkCurrentTask()) { - ToastUtils.showShort("订单状态不匹配该操作!") - return - } - arriveSite(mCurrentTaskAndOrder?.startSite!!.siteId, false) - } fun setArriveAtEndStation() { if (!checkCurrentTask()) { diff --git a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiUnmannedViewModel.kt b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiUnmannedViewModel.kt index 83a5b22ee8..0f84c2eb06 100644 --- a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiUnmannedViewModel.kt +++ b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiUnmannedViewModel.kt @@ -270,6 +270,7 @@ class TaxiUnmannedViewModel : BaseViewModel(){ } private fun queryCurrentTaskOnce(){ + if (!LoginStatusManager.isLogin()) return // 未登陆则不去查询 CarServiceManager.queryCurrentTask(AbsMogoApplication.getApp().applicationContext, object : OchCommonServiceCallback { override fun onSuccess(data: QueryCurrentTaskRespBean?) { @@ -287,13 +288,14 @@ class TaxiUnmannedViewModel : BaseViewModel(){ if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order!= null && result != null && result.order == null) { //本地根据订单 orderNo 去查询下(乘客取消订单) + d(TAG, "queryCurrentTaskOnce1 = result order is empty, query order by orderNo!") queryCurrentOrderStatusByNo(mCurrentTaskAndOrder!!.order!!.orderNo) return } //订单或者伪任务更新, 都去刷新下界面 if (mCurrentTaskAndOrder == null || !mCurrentTaskAndOrder!!.equals(result)){ - + d(TAG, "queryCurrentTaskOnce1 = mCurrentTaskAndOrder update " ) if (result == null) return if (result.endSite == null && result.order == null){ @@ -302,32 +304,45 @@ class TaxiUnmannedViewModel : BaseViewModel(){ TaxiModel.updateCurrentTaskAndOrder(null) } + //当前任务完成且订单状态到达乘客上车点, 则立马去拉取任务 不再等30s,否则送驾任务要等30s后才能去执行 if (result.currentStatus == TaskStatusEnum.CompleteTask.code){ - startPrepareTask(result.endSite!!.siteId) + if (result.order != null && result.order!!.orderStatus + == TaxiOrderStatusEnum.ArriveAtStart.code){ + pullTask(result.endSite!!.siteId) + d(TAG, "queryCurrentTaskOnce1 = pullTask" ) + + }else{ + startPrepareTask30S(result.endSite!!.siteId) + d(TAG, "queryCurrentTaskOnce1 = startPrepareTask30S" ) + + } } mCurrentTaskAndOrder = result TaxiModel.updateCurrentTaskAndOrder(result) TaxiModel.updateStation() updateTaskAndOrderUi() - if (result.order != null && result.order!!.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.code){ - queryCurrentOrderStatusByNo(mCurrentTaskAndOrder!!.order!!.orderNo) //查询全程里程和用时,更新 + d(TAG, "queryCurrentTaskOnce1 = ArriveAtEnd query mileage and duration") + queryCurrentOrderStatusByNo(result.order!!.orderNo) //查询全程里程和用时,更新 } //根据lineId集合去查轨迹集合, 返回的只是接驾任务的line集合,没有送驾任务 if (result.order != null && result.order!!.orderStatus <= TaxiOrderStatusEnum.OnTheWayToEnd.code){ var lines = result.order!!.planningLines - lines[lines.size] = result.order!!.orderLine + lines = lines.plus(result.order!!.orderLine) + d(TAG, "queryCurrentTaskOnce1 = by lineIds query Contrails" ) queryOrderPickUpContrails(lines) } if (result.currentStatus <= TaskStatusEnum.StartTask.code){//任务执行中, 去加载下轨迹 + d(TAG, "queryCurrentTaskOnce1 = by lineId query Contrail" ) TaxiModel.queryTaskContrail(Array(1) {result.lineId}) } if (result.taskType <= TaskTypeEnum.ToOrderStartTask.code && result.currentStatus == TaskStatusEnum.GetTask.code){//自动去启动自驾 + d(TAG, "queryCurrentTaskOnce1 = autoStartDriving" ) TaxiModel.autoStartDriving() } } @@ -383,7 +398,7 @@ class TaxiUnmannedViewModel : BaseViewModel(){ if (data.data.orderStatus == TaxiOrderStatusEnum.JourneyCompleted.code){//完成 //获取新的任务 if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.endSite != null){ - startPrepareTask(mCurrentTaskAndOrder!!.endSite!!.siteId) + startPrepareTask30S(mCurrentTaskAndOrder!!.endSite!!.siteId) } mCurrentTaskAndOrder = null updateNoTaskAndOrderUi() @@ -409,28 +424,32 @@ class TaxiUnmannedViewModel : BaseViewModel(){ } } - private fun startPrepareTask(siteId: Long) { + private fun startPrepareTask30S(siteId: Long) { UiThreadHandler.postDelayed({ - CarServiceManager.prepareTask( - mContext, - siteId, - object : OchCommonServiceCallback { - override fun onSuccess(data: PrepareTaskRespBean?) { - d(SceneConstant.M_TAXI + TAG, "prepareTask = " + GsonUtil.jsonFromObject(data)) - if (data == null || data.code != 0) return - //去下载轨迹, 下发给工控机下载 - TaxiModel.queryTaskContrail(Array(1) {data.data.lineId}) - } - - override fun onFail(code: Int, msg: String?) { - d(SceneConstant.M_TAXI + TAG, "$code $msg") - startPrepareTask(siteId) //失败后30s再次调用获取下一任务 - } - - }) + pullTask(siteId) }, TaxiUnmannedConst.TIMER_PREPARE_TASK_INTERVAL) } + private fun pullTask(siteId: Long) { + CarServiceManager.prepareTask( + mContext, + siteId, + object : OchCommonServiceCallback { + override fun onSuccess(data: PrepareTaskRespBean?) { + d(SceneConstant.M_TAXI + TAG, "prepareTask = " + GsonUtil.jsonFromObject(data)) + if (data == null || data.code != 0) return + //去下载轨迹, 下发给工控机下载 + TaxiModel.queryTaskContrail(Array(1) {data.data.lineId}) + } + + override fun onFail(code: Int, msg: String?) { + d(SceneConstant.M_TAXI + TAG, "$code $msg") + startPrepareTask30S(siteId) //失败后30s再次调用获取下一任务 + } + + }) + } + private fun startInAndWaitCurrentTaskLoop() { if (mInAndWaitServiceDisposable != null && !mInAndWaitServiceDisposable!!.isDisposed) { diff --git a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiBeingTaskFragment.kt b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiBeingTaskFragment.kt index 1281083b59..75991a9fec 100644 --- a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiBeingTaskFragment.kt +++ b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiBeingTaskFragment.kt @@ -49,12 +49,14 @@ import com.mogo.och.taxi.ui.unmanned.TaskAndOrderUiState import com.mogo.och.taxi.ui.unmanned.UnmannedIntent import kotlinx.android.synthetic.main.taxi_no_data_common_view.noOrderDataTv import kotlinx.android.synthetic.main.unmanned_being_order.cancelOrder +import kotlinx.android.synthetic.main.unmanned_being_order.endPoint import kotlinx.android.synthetic.main.unmanned_being_order.endStationName import kotlinx.android.synthetic.main.unmanned_being_order.mBeingOrderLayout import kotlinx.android.synthetic.main.unmanned_being_order.naviToEnd import kotlinx.android.synthetic.main.unmanned_being_order.naviToStart import kotlinx.android.synthetic.main.unmanned_being_order.noTaskData import kotlinx.android.synthetic.main.unmanned_being_order.orderPhoneAndNum +import kotlinx.android.synthetic.main.unmanned_being_order.startPoint import kotlinx.android.synthetic.main.unmanned_being_order.startStationName import kotlinx.android.synthetic.main.unmanned_being_order.taskClickBtn import kotlinx.android.synthetic.main.unmanned_being_order.taskOtherInfo @@ -183,6 +185,17 @@ class TaxiBeingTaskFragment : BaseFragment(), taskStatus.text = resources.getString(R.string.task_start_to_virtual_site) startStationName.text = resources.getString(R.string.task_current_loc) endStationName.text = siteName + setPointBlueGreen() + } + + private fun setPointBlueGreen(){ + startPoint.setImageResource(R.drawable.taxi_driver_circle_blue_big) + endPoint.setImageResource(R.drawable.taxi_driver_circle_green_big) + } + + private fun setPointGreenBlue(){ + startPoint.setImageResource(R.drawable.taxi_driver_circle_green_big) + endPoint.setImageResource(R.drawable.taxi_driver_circle_blue_big) } private fun updateUntruthTaskView() { @@ -275,6 +288,7 @@ class TaxiBeingTaskFragment : BaseFragment(), taskTypeTv.text = resources.getString(R.string.task_exercise) startStationName.text = startSite.siteName endStationName.text = endSite.siteName + setPointBlueGreen() } TaskTypeEnum.ToOrderEndTask.code,TaskTypeEnum.ToOrderStartTask.code -> {// 送驾/接驾任务任务 if (order == null) return @@ -296,7 +310,7 @@ class TaxiBeingTaskFragment : BaseFragment(), taskTypeTv.text = resources.getString(R.string.task_order) taskTypeTv.background = resources.getDrawable(R.drawable.task_order_type_btn_bg,null) orderPhoneAndNum.text = Html.fromHtml(" " + order.bookingUserPhone + "" + - " | " + + " | " + "" + order.passengerSize + "人" + "",Html.FROM_HTML_MODE_LEGACY) startStationName.text = order.orderStartSite?.siteName endStationName.text = order.orderEndSite?.siteName @@ -322,7 +336,7 @@ class TaxiBeingTaskFragment : BaseFragment(), TaxiOrderStatusEnum.ArriveAtEnd.code -> { //到达目的地 taskStatus.text = resources.getString(R.string.task_start_end_site) - + setPointBlueGreen() updateOrderBottomBtn( getString(R.string.module_och_taxi_order_server_end), Color.parseColor("#FFFFFF"), @@ -352,6 +366,7 @@ class TaxiBeingTaskFragment : BaseFragment(), } TaxiOrderStatusEnum.OnTheWayToEnd.code -> { //送驾中 taskStatus.text = resources.getString(R.string.task_start_end_site) + setPointBlueGreen() updateOrderBottomBtn( getString(R.string.module_och_taxi_order_close), Color.parseColor("#FFFFFF"), @@ -381,7 +396,7 @@ class TaxiBeingTaskFragment : BaseFragment(), } TaxiOrderStatusEnum.UserArriveAtStart.code,TaxiOrderStatusEnum.ArriveAtStart.code -> { //乘客到达上车点,验证成功 ; 到达乘客上车点 - + setPointGreenBlue() taskStatus.text = resources.getString(R.string.arrived_start_site) updateOrderBottomBtn( if (order.orderStatus == TaxiOrderStatusEnum.UserArriveAtStart.code) @@ -417,6 +432,7 @@ class TaxiBeingTaskFragment : BaseFragment(), TaxiOrderStatusEnum.OnTheWayToStart.code -> { //前往上车地点 taskStatus.text = resources.getString(R.string.task_start_start_site) + setPointGreenBlue() updateOrderBottomBtn( getString(R.string.module_och_taxi_order_server_start), Color.parseColor("#4DFFFFFF"), diff --git a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiReserveOrderFragment.kt b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiReserveOrderFragment.kt index 16ae878dec..173f299c0b 100644 --- a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiReserveOrderFragment.kt +++ b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiReserveOrderFragment.kt @@ -75,7 +75,7 @@ class TaxiReserveOrderFragment : BaseFragment() { naviToEnd.visibility = View.GONE orderPhoneAndNum.text = Html.fromHtml(" " + order.bookingUserPhone + "" + - " | " + + " | " + "" + order.passengerSize + "人" + "",Html.FROM_HTML_MODE_LEGACY) diff --git a/OCH/taxi/mogo-och-taxi-unmanned/src/main/res/layout/taxi_base_fragment.xml b/OCH/taxi/mogo-och-taxi-unmanned/src/main/res/layout/taxi_base_fragment.xml index eee53a8c73..b9f8361710 100644 --- a/OCH/taxi/mogo-och-taxi-unmanned/src/main/res/layout/taxi_base_fragment.xml +++ b/OCH/taxi/mogo-och-taxi-unmanned/src/main/res/layout/taxi_base_fragment.xml @@ -5,12 +5,21 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="@dimen/dp_72"> - + + + - - - + app:layout_constraintTop_toBottomOf="@+id/startPoint" + app:layout_constraintBottom_toTopOf="@+id/endPoint" + app:layout_constraintLeft_toLeftOf="@+id/startPoint" + app:layout_constraintRight_toRightOf="@+id/startPoint"/> - + - Date: Fri, 18 Aug 2023 19:14:00 +0800 Subject: [PATCH 10/22] [5.0.0] [statusbar bg ] --- .../passenger/provider/StatusViewManager.java | 5 ++-- .../mogo/och/bus/passenger/ui/MainFragment.kt | 23 +++++++++++++++--- .../passenger/ui/statusbar/StatusBarView.kt | 5 ++++ .../drawable-nodpi/charter_p_car_light.png | Bin 0 -> 68857 bytes .../src/main/res/layout/m1_main_fragment.xml | 1 + .../passenger/src/main/res/values/color.xml | 1 + 6 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 OCH/charter/passenger/src/main/res/drawable-nodpi/charter_p_car_light.png diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/provider/StatusViewManager.java b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/provider/StatusViewManager.java index 34a11778aa..90f569d3af 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/provider/StatusViewManager.java +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/provider/StatusViewManager.java @@ -20,15 +20,16 @@ import com.mogo.eagle.core.function.api.hmi.view.IStatusViewLayout; @Route( path = MogoServicePaths.PATH_STATUS_VIEW_MANAGER ) public class StatusViewManager implements IStatusViewLayout { + private StatusBarView statusBarView; @NonNull @Override public View getStatusView(Context context) { - return new StatusBarView(context); + return statusBarView; } @Override public void init(Context context) { - + statusBarView = new StatusBarView(context); } } diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/MainFragment.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/MainFragment.kt index ef56945ea5..4203fac99b 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/MainFragment.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/MainFragment.kt @@ -5,10 +5,13 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import com.alibaba.android.arouter.launcher.ARouter import com.amap.api.maps.model.LatLng import com.mogo.commons.AbsMogoApplication import com.mogo.commons.mvp.MvpFragment import com.mogo.eagle.core.data.config.HdMapBuildConfig +import com.mogo.eagle.core.data.constants.MogoServicePaths +import com.mogo.eagle.core.function.api.hmi.view.IStatusViewLayout import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getMapUIController import com.mogo.eagle.core.function.hmi.ui.msgbox.MMsgBoxButtonView import com.mogo.eagle.core.function.view.SiteMarkerBean @@ -24,6 +27,7 @@ import com.mogo.och.bus.passenger.ui.bottom.BottomBar import com.mogo.och.bus.passenger.ui.bottom.BottomClickView import com.mogo.och.bus.passenger.ui.dialogfragment.M1CarUserNoOrderFragment import com.mogo.och.bus.passenger.ui.dialogfragment.NoviceGuidanceFragment +import com.mogo.och.bus.passenger.ui.statusbar.StatusBarView import com.mogo.och.bus.passenger.utils.ToastCharterUtils import com.mogo.och.common.module.biz.constant.LoginStatusManager import kotlinx.android.synthetic.main.m1_main_fragment.* @@ -36,8 +40,7 @@ import java.lang.ref.WeakReference * @author: wangmingjun * @date: 2022/4/12 */ -class MainFragment : - MvpFragment() { +class MainFragment : MvpFragment() { private var m1CarUserNoOrderFragment: WeakReference? = null private var noviceGuidanceFragment: WeakReference? = null @@ -59,7 +62,16 @@ class MainFragment : } } + private var statusBarView: StatusBarView? = null + override fun getLayoutId(): Int { + (ARouter.getInstance().build(MogoServicePaths.PATH_STATUS_VIEW_MANAGER) + .navigation() as? IStatusViewLayout)?.apply { + val statusView = getStatusView(requireContext()) + if (statusView is StatusBarView) { + statusBarView = statusView + } + } return R.layout.m1_main_fragment } @@ -115,6 +127,7 @@ class MainFragment : BottomBar.SelectView.VIDEO -> showBizView(showVideo = true) else -> { showBizView() + statusBarView?.setBackgroudColor(R.color.bus_p_m1_80ffffff) } } return false @@ -157,21 +170,25 @@ class MainFragment : ) { if (orderinfo) { biz_orderinfo.visibility = View.VISIBLE + statusBarView?.setBackgroudColor(R.color.bus_p_m1_80ffffff) } else { biz_orderinfo.visibility = View.GONE } if (softControl) { biz_softcontrol.visibility = View.VISIBLE + statusBarView?.setBackgroudColor(R.color.bus_p_m1_40ffffff) } else { biz_softcontrol.visibility = View.GONE } if (selectLine) { biz_selectline.visibility = View.VISIBLE + statusBarView?.setBackgroudColor(R.color.bus_p_m1_80ffffff) } else { biz_selectline.visibility = View.GONE } if (showVideo) { biz_video.visibility = View.VISIBLE + statusBarView?.setBackgroudColor(R.color.bus_p_m1_40ffffff) } else { biz_video.visibility = View.GONE } @@ -208,7 +225,7 @@ class MainFragment : omvOverMap.onResume() UiThreadHandler.postDelayed({ getMapUIController()?.setAllGesturesEnabled(false) - },200) + }, 200) } override fun onSaveInstanceState(outState: Bundle) { diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/statusbar/StatusBarView.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/statusbar/StatusBarView.kt index 3da32a8467..633bbf8290 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/statusbar/StatusBarView.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/statusbar/StatusBarView.kt @@ -6,6 +6,7 @@ import android.os.SystemClock import android.util.AttributeSet import android.view.LayoutInflater import android.view.ViewGroup +import androidx.annotation.ColorRes import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import chassis.ChassisStatesOuterClass @@ -64,6 +65,10 @@ class StatusBarView @JvmOverloads constructor( isFocusable = true } + fun setBackgroudColor(@ColorRes color:Int){ + setBackgroundColor(ContextCompat.getColor(context,color)) + } + override fun onAttachedToWindow() { super.onAttachedToWindow() post { diff --git a/OCH/charter/passenger/src/main/res/drawable-nodpi/charter_p_car_light.png b/OCH/charter/passenger/src/main/res/drawable-nodpi/charter_p_car_light.png new file mode 100644 index 0000000000000000000000000000000000000000..3d4acc9951fbdabed1772c11423399c0d7b41c36 GIT binary patch literal 68857 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

Pqv$_Co1K3WANn)H!t)r|5?)cA-s=@Zm=A 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 #CCFFFFFF #80FFFFFF + #40FFFFFF #F0E0EFFF #66000000 \ No newline at end of file From a1a7dfcb37d80dd3feca1d43e9956d3727382b32 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Mon, 21 Aug 2023 11:13:15 +0800 Subject: [PATCH 11/22] [6.0.0] update chain sdk --- gradle/ext.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gradle/ext.gradle b/gradle/ext.gradle index 8f5714fe9b..82757c80ee 100644 --- a/gradle/ext.gradle +++ b/gradle/ext.gradle @@ -2,7 +2,6 @@ ext { gradle_version = '3.5.3' kotlin_version = '1.5.30' plugin_version = '10.0.0_mogo' - hook_log_plugin_version = '1.7.2' - service_chain_version = '5.2.10' + service_chain_version = '5.3.1' lancetx_plugin_version = '10.0.4_mogo' } \ No newline at end of file From 1364b55a6925ee13bb3cebb1f77fd5aab5e8f196 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Mon, 21 Aug 2023 11:23:50 +0800 Subject: [PATCH 12/22] [6.0.0] close the trace node debug --- app/src/main/java/com/mogo/launcher/MogoApplication.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index 1c46d04e73..5679a80c0e 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -23,7 +23,7 @@ public class MogoApplication extends MainMoGoApplication { @Override public void onCreate() { - TraceNodeCore.Companion.getTraceNodeCore().setDebugMode(true); //todo +// TraceNodeCore.Companion.getTraceNodeCore().setDebugMode(false); //todo ARouterStartUp.init(this); ConfigStartUp.init(this); tryEnableStrictMode(); From b2da76af753ba59f1017673a633704e698e1342f Mon Sep 17 00:00:00 2001 From: yangyakun Date: Mon, 21 Aug 2023 11:27:41 +0800 Subject: [PATCH 13/22] [5.0.0] [move setting] --- .../taxi/passenger/ui/{ => systemsetting}/TaxiPSettingView.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) rename OCH/taxi/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/{ => systemsetting}/TaxiPSettingView.kt (98%) diff --git a/OCH/taxi/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPSettingView.kt b/OCH/taxi/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/systemsetting/TaxiPSettingView.kt similarity index 98% rename from OCH/taxi/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPSettingView.kt rename to OCH/taxi/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/systemsetting/TaxiPSettingView.kt index 957ed9cb2f..7baaf6247b 100644 --- a/OCH/taxi/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPSettingView.kt +++ b/OCH/taxi/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/systemsetting/TaxiPSettingView.kt @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.passenger.ui +package com.mogo.och.taxi.passenger.ui.systemsetting import android.annotation.SuppressLint import android.content.Context @@ -10,14 +10,12 @@ import android.media.AudioManager import android.provider.Settings import android.text.TextUtils import android.util.AttributeSet -import android.util.Log import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.widget.SeekBar import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat -import androidx.core.view.isVisible import com.mogo.commons.module.intent.IMogoIntentListener import com.mogo.commons.module.intent.IntentManager import com.mogo.commons.module.receiver.MogoReceiver From 0bd04a0da4ce91dff5c860cc7c0ca57710d79767 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Mon, 21 Aug 2023 11:54:11 +0800 Subject: [PATCH 14/22] [6.0.0] reset log version --- gradle.properties | 5 ----- gradle/ext.gradle | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/gradle.properties b/gradle.properties index b7bd13f2bf..cdcef9560e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -56,11 +56,6 @@ bytex.forbidUseLenientMutationDuringGetArtifact=true bytex.verifyProguardConfigurationChanged=false bytex.ASM_API=ASM7 -HOOK_LOG_VERSION=1.6.1 -SERVICE_CHAIN_VERSION=1.1.0 - -BIZCONFIG_VERSION=1.3.2 -SERVICE_BIZ_VERSION=1.2.4 ################ 外部依赖引用 ################ # loglib LOGLIB_VERSION=1.8.2 diff --git a/gradle/ext.gradle b/gradle/ext.gradle index 82757c80ee..76d6fb0e8a 100644 --- a/gradle/ext.gradle +++ b/gradle/ext.gradle @@ -2,6 +2,6 @@ ext { gradle_version = '3.5.3' kotlin_version = '1.5.30' plugin_version = '10.0.0_mogo' - service_chain_version = '5.3.1' + service_chain_version = '5.2.10' lancetx_plugin_version = '10.0.4_mogo' } \ No newline at end of file From 417a3aa0210c54faa43f06cf60739441af1dfcca Mon Sep 17 00:00:00 2001 From: zhongchao Date: Mon, 21 Aug 2023 14:01:00 +0800 Subject: [PATCH 15/22] [6.0.0] fix json obj in fw write --- gradle.properties | 2 +- gradle/ext.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index cdcef9560e..e9b5e60d54 100644 --- a/gradle.properties +++ b/gradle.properties @@ -58,7 +58,7 @@ bytex.ASM_API=ASM7 ################ 外部依赖引用 ################ # loglib -LOGLIB_VERSION=1.8.2 +LOGLIB_VERSION=1.9.0 ######## MogoAiCloudSDK Version ######## # 网络请求LOGLIB_VERSION MOGO_NETWORK_VERSION=1.4.7.12 diff --git a/gradle/ext.gradle b/gradle/ext.gradle index 76d6fb0e8a..9e74ffd3f1 100644 --- a/gradle/ext.gradle +++ b/gradle/ext.gradle @@ -2,6 +2,6 @@ ext { gradle_version = '3.5.3' kotlin_version = '1.5.30' plugin_version = '10.0.0_mogo' - service_chain_version = '5.2.10' + service_chain_version = '5.3.5' lancetx_plugin_version = '10.0.4_mogo' } \ No newline at end of file From 319a0f9ff054152c8b012955d76ce48d1fd81ed9 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Mon, 21 Aug 2023 14:02:56 +0800 Subject: [PATCH 16/22] =?UTF-8?q?[6.0.0]=201=E3=80=81=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E9=A2=84=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mogo/och/taxi/ui/TaxiFragment.kt | 3 ++- .../och/taxi/utils/TaxiTrajectoryManager.java | 27 +++++++++++-------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.kt b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.kt index 060cdd644d..b2049c0ace 100644 --- a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.kt +++ b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.kt @@ -295,7 +295,8 @@ class TaxiFragment : BaseTaxiTabFragment(), orderInfo.text = "订单信息: 开始: " + order?.orderStartSite?.siteName + ", 结束: "+ order?.orderEndSite?.siteName + ", orderStatus: "+ order?.orderStatus - orderToStartLines.text = "接驾任务的lineId集合: " + GsonUtil.jsonFromObject(order?.planningLines) + orderToStartLines.text = "接驾任务的lineId集合: " + GsonUtil.jsonFromObject(order?.planningLines) + + ", 送驾任务lineId: " + order?.orderLine val curContrail = TaxiModel.getCurTaskContrail() testCurTrajMd5!!.text = "TMd5:" + curContrail?.csvFileMd5 diff --git a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/TaxiTrajectoryManager.java b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/TaxiTrajectoryManager.java index 8845d37e68..ef3287ad56 100644 --- a/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/TaxiTrajectoryManager.java +++ b/OCH/taxi/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/TaxiTrajectoryManager.java @@ -133,9 +133,6 @@ public class TaxiTrajectoryManager { if (curTaskContrail == null) return; long curLineId = taskAndOrder.getLineId(); - final List orderContrails = TaxiModel.INSTANCE.getCurOrderContrails(); - final OrderDetail orderDetail = taskAndOrder.getOrder(); - ContrailListRespBean.Result preloadContrail = null; //预加载的轨迹 if (mAutoPilotLine == null) { mAutoPilotLine = new AutopilotControlParameters.AutoPilotLine(curTaskContrail.getLineId(), curTaskContrail.getLineName(), @@ -144,7 +141,7 @@ public class TaxiTrajectoryManager { curTaskContrail.getCsvFileUrlDPQP(), curTaskContrail.getCsvFileMd5DPQP(), curTaskContrail.getTxtFileUrlDPQP(), curTaskContrail.getTxtFileMd5DPQP(), curTaskContrail.getContrailSaveTimeDPQP()); } else { - mAutoPilotLine.setLineId(taskAndOrder.getLineId()); + mAutoPilotLine.setLineId(curTaskContrail.getLineId()); mAutoPilotLine.setLineName(curTaskContrail.getLineName()); mAutoPilotLine.setTrajUrl(curTaskContrail.getCsvFileUrl()); mAutoPilotLine.setTrajMd5(curTaskContrail.getCsvFileMd5()); @@ -159,13 +156,21 @@ public class TaxiTrajectoryManager { mAutoPilotLine.setTimestamp_dpqp(curTaskContrail.getContrailSaveTimeDPQP()); } + final OrderDetail orderDetail = taskAndOrder.getOrder(); + ContrailListRespBean.Result preloadContrail = null; //预加载的轨迹 + final List orderContrails = TaxiModel.INSTANCE.getCurOrderContrails(); + if (orderDetail != null && orderContrails != null && orderContrails.size() != 0 ){ - if (orderContrails.contains(curLineId)){ //预加载轨迹是curLineId索引的下一个 - int index = orderContrails.indexOf(curLineId); - if (orderContrails.size()-1 >= index){ - preloadContrail = orderContrails.get(index); + for (int i = 0; i< orderContrails.size() ; i++){ + if (orderContrails.get(i).getLineId() == curLineId){ //预加载轨迹是curLineId索引的下一个 + int index = i + 1; + if (orderContrails.size()-1 >= index){ + preloadContrail = orderContrails.get(index); + } } - }else {//预加载轨迹直接是集合第一个 + } + if (preloadContrail == null){ + //不包含预加载轨迹直接是集合第一个 preloadContrail = orderContrails.get(0); } } @@ -179,7 +184,7 @@ public class TaxiTrajectoryManager { preloadContrail.getCsvFileUrlDPQP(), preloadContrail.getCsvFileMd5DPQP(), preloadContrail.getTxtFileUrlDPQP(), preloadContrail.getTxtFileMd5DPQP(), preloadContrail.getContrailSaveTimeDPQP()); } else { - mPreAutoPilotLine.setLineId(taskAndOrder.getLineId()); + mPreAutoPilotLine.setLineId(preloadContrail.getLineId()); mPreAutoPilotLine.setLineName(preloadContrail.getLineName()); mPreAutoPilotLine.setTrajUrl(preloadContrail.getCsvFileUrl()); mPreAutoPilotLine.setTrajMd5(preloadContrail.getCsvFileMd5()); @@ -275,6 +280,6 @@ public class TaxiTrajectoryManager { } CallerLogger.INSTANCE.d(M_TAXI + TAG, "sendTrajectoryReq(): common_load = " - + GsonUtils.toJson(mAutoPilotLine) + "pre_load" + GsonUtils.toJson(mPreAutoPilotLine)); + + GsonUtils.toJson(mAutoPilotLine) + ", pre_load" + GsonUtils.toJson(mPreAutoPilotLine)); } } From 486542872e43769cdbe1c0628e415d98d3e74e47 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Mon, 21 Aug 2023 15:17:25 +0800 Subject: [PATCH 17/22] [6.0.0] fix chain log param without gson,which has impl gson func --- .../scene/road/V2XRoadEventScenario.java | 2 +- .../provider/MoGoUpgradeProviderImpl.kt | 44 +++++------ .../business/ai/AiCloudIdentifyDataManager.kt | 79 ++++++++----------- .../startup/stageone/HttpDnsStartUp.kt | 6 +- 4 files changed, 58 insertions(+), 73 deletions(-) diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java index 283bc5baed..ab653f43cc 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java @@ -48,7 +48,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp @Override public void init(V2XMessageEntity v2XMessageEntity) { try { - V2XBizTrace.Companion.onAck("v2XMessageEntity",GsonUtil.jsonFromObject(v2XMessageEntity)); + V2XBizTrace.Companion.onAck("v2XMessageEntity",v2XMessageEntity); V2XRoadEventEntity v2XRoadEventEntity = v2XMessageEntity.getContent(); if (v2XRoadEventEntity != null) { if (!isSameScenario(v2XMessageEntity)) { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/MoGoUpgradeProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/MoGoUpgradeProviderImpl.kt index 483e2a083c..5f9bff95c3 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/MoGoUpgradeProviderImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/MoGoUpgradeProviderImpl.kt @@ -28,7 +28,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = Record(AppUtils.getAppVersionName(), sn, mac, type, isSupportPatch, time = System.currentTimeMillis()) UpgradeDbHelper.insertRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_start" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_start" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -38,7 +38,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = CheckRecord(AppUtils.getAppVersionName(), START, time = System.currentTimeMillis()) UpgradeDbHelper.insertCheckRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_request_start" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_request_start" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -48,7 +48,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = CheckRecord(AppUtils.getAppVersionName(), SUCCESS, response, time = System.currentTimeMillis()) UpgradeDbHelper.insertCheckRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_request_success" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_request_success" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -67,7 +67,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = UpgradeRecord(fromVersionName = AppUtils.getAppVersionName(), toVersionName = newVersionName, fromMd5 = AppUtils.getAppApkMd5(), toMD5 = newMd5, type = getType(type), time = System.currentTimeMillis()) UpgradeDbHelper.insertUpgradeRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_record" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_record" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -77,7 +77,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = DownloadRecord(versionName = AppUtils.getAppVersionName(), status = DownloadStart, downloadUrl = downloadUrl, time = System.currentTimeMillis()) UpgradeDbHelper.insertDownloadRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_download_start" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_download_start" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -87,7 +87,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = DownloadRecord(versionName = AppUtils.getAppVersionName(), status = DownloadPause, downloadUrl = downloadUrl, time = System.currentTimeMillis()) UpgradeDbHelper.insertDownloadRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_download_pause" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_download_pause" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -97,7 +97,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = DownloadRecord(versionName = AppUtils.getAppVersionName(), status = DownloadFailed, failReason = error, downloadUrl = downloadUrl, time = System.currentTimeMillis()) UpgradeDbHelper.insertDownloadRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_download_failed" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_download_failed" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -107,7 +107,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = DownloadRecord(versionName = AppUtils.getAppVersionName(), status = DownloadComplete, downloadUrl = downloadUrl, time = System.currentTimeMillis()) UpgradeDbHelper.insertDownloadRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_download_success" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_download_success" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -117,7 +117,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = InstallRecord(version = AppUtils.getAppVersionName(), status = InstallStart, time = System.currentTimeMillis()) UpgradeDbHelper.insertInstallRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_install_start" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_install_start" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -127,7 +127,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = InstallRecord(version = AppUtils.getAppVersionName(), status = SourceMd5CheckStart, time = System.currentTimeMillis()) UpgradeDbHelper.insertInstallRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_check_source_md5_start" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_check_source_md5_start" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -137,7 +137,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = InstallRecord(version = AppUtils.getAppVersionName(), status = SourceMd5CheckFailed, failReason = error, time = System.currentTimeMillis()) UpgradeDbHelper.insertInstallRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_check_source_md5_failed" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_check_source_md5_failed" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -147,7 +147,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = InstallRecord(version = AppUtils.getAppVersionName(), status = SourceMd5CheckSuccess, time = System.currentTimeMillis()) UpgradeDbHelper.insertInstallRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_check_source_md5_success" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_check_source_md5_success" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -157,7 +157,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = InstallRecord(version = AppUtils.getAppVersionName(), status = ApplyPatchStart, time = System.currentTimeMillis()) UpgradeDbHelper.insertInstallRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_apply_patch_start" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_apply_patch_start" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -167,7 +167,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = InstallRecord(version = AppUtils.getAppVersionName(), status = ApplyPatchFailed, failReason = error, time = System.currentTimeMillis()) UpgradeDbHelper.insertInstallRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_apply_patch_failed" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_apply_patch_failed" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -177,7 +177,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = InstallRecord(version = AppUtils.getAppVersionName(), status = ApplyPatchSuccess, time = System.currentTimeMillis()) UpgradeDbHelper.insertInstallRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_apply_patch_success" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_apply_patch_success" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -187,7 +187,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = InstallRecord(version = AppUtils.getAppVersionName(), status = TargetMd5CheckStart, time = System.currentTimeMillis()) UpgradeDbHelper.insertInstallRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_check_target_md5_start" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_check_target_md5_start" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -197,7 +197,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = InstallRecord(version = AppUtils.getAppVersionName(), status = TargetMd5CheckFailed, failReason = error, time = System.currentTimeMillis()) UpgradeDbHelper.insertInstallRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_check_target_md5_failed" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_check_target_md5_failed" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -207,7 +207,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = InstallRecord(version = AppUtils.getAppVersionName(), status = TargetMd5CheckSuccess, time = System.currentTimeMillis()) UpgradeDbHelper.insertInstallRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_check_target_md5_success" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_check_target_md5_success" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -217,7 +217,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { val record = InstallRecord(version = AppUtils.getAppVersionName(), status = InstallFailed, code = code, failReason = error, time = System.currentTimeMillis()) UpgradeDbHelper.insertInstallRecord(record) try { - onUpgradeRecordLinkLog(mapOf("upgrade_install_failed" to GsonUtils.toJson(record))) + onUpgradeRecordLinkLog(mapOf("upgrade_install_failed" to record)) } catch (t: Throwable) { t.printStackTrace() } @@ -249,7 +249,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { itx["step_3"] = all.downloads?.sortedBy { it.status.ordinal }?.mapIndexed { index, r -> "$index" to GsonUtils.toJson(r) } ?: emptyList() itx["step_4"] = all.installs?.let { ArrayList(it) + InstallRecord(success.versionName, InstallSuccess, 0) }?.sortedBy { it.status.ordinal }?.mapIndexed { index, r -> "$index" to GsonUtils.toJson(r) } ?: emptyList() try { - onUpgradeRecordLinkLog(mapOf("upgrade_success" to GsonUtils.toJson(all))) + onUpgradeRecordLinkLog(mapOf("upgrade_success" to all)) } catch (t: Throwable) { t.printStackTrace() } @@ -265,7 +265,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { itx["step_3"] = all.downloads?.sortedBy { it.status.ordinal }?.mapIndexed { index, r -> "$index" to GsonUtils.toJson(r) } ?: emptyList() itx["step_4"] = all.installs?.sortedBy { it.status.ordinal }?.mapIndexed { index, r -> "$index" to GsonUtils.toJson(r) } ?: emptyList() try { - onUpgradeRecordLinkLog(mapOf("upgrade_failed" to GsonUtils.toJson(all))) + onUpgradeRecordLinkLog(mapOf("upgrade_failed" to all)) } catch (t: Throwable) { t.printStackTrace() } @@ -301,5 +301,5 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { nodeAliasCode = ChainConstant.CHAIN_CODE_UPGRADE_APP, paramIndexes = [0] ) - private fun onUpgradeRecordLinkLog(extra: Map) {} + private fun onUpgradeRecordLinkLog(extra: Map) {} } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudIdentifyDataManager.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudIdentifyDataManager.kt index 79881fcaf7..f737add6d8 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudIdentifyDataManager.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudIdentifyDataManager.kt @@ -34,7 +34,6 @@ import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.updateLongSightLevel import com.mogo.eagle.core.function.utils.MapBizTrace import com.mogo.eagle.core.function.utils.MapBizTrace.Companion.getCurrentCNode -import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.map.MogoMapUIController import com.mogo.map.uicontroller.VisualAngleMode @@ -73,30 +72,27 @@ class AiCloudIdentifyDataManager : IMoGoPlanningRottingListener, if (it.what == H_ERROR_CLOUD) { if (!aiCloudDataChange.get()) { MapBizTrace.log( - CHAIN_CODE_ROMA_MAP_START, CHAIN_CODE_ROMA_CLOUD_ERROR, TAG, GsonUtils.toJson( - mutableMapOf( - "msg" to "云端 $H_DELAY_TIME 秒内无感知数据下发", - "socketStatus" to MogoStatusManager.getInstance().isSocketOnLine, - "cityCode" to CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().cityCode - ) + CHAIN_CODE_ROMA_MAP_START, CHAIN_CODE_ROMA_CLOUD_ERROR, TAG, + mutableMapOf( + "msg" to "云端 $H_DELAY_TIME 秒内无感知数据下发", + "socketStatus" to MogoStatusManager.getInstance().isSocketOnLine, + "cityCode" to CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().cityCode ) ) } else { MapBizTrace.log( - CHAIN_CODE_ROMA_MAP_START, CHAIN_CODE_ROMA_CLOUD_PUSH, TAG, GsonUtils.toJson( - mutableMapOf( - "msg" to "延迟 $H_DELAY_TIME 秒内获取云端下发感知数据大小", - "cloudDataSize" to cloudDataSize - ) + CHAIN_CODE_ROMA_MAP_START, CHAIN_CODE_ROMA_CLOUD_PUSH, TAG, + mutableMapOf( + "msg" to "延迟 $H_DELAY_TIME 秒内获取云端下发感知数据大小", + "cloudDataSize" to cloudDataSize ) ) } } if (it.what == H_ERROR_MAP) { MapBizTrace.log( - CHAIN_CODE_ROMA_MAP_START, CHAIN_CODE_ROMA_MAP_ERROR, TAG, GsonUtils.toJson( - mutableMapOf("msg" to "地图漫游模式启动失败,原因:${it.obj}") - ) + CHAIN_CODE_ROMA_MAP_START, CHAIN_CODE_ROMA_MAP_ERROR, TAG, + mutableMapOf("msg" to "地图漫游模式启动失败,原因:${it.obj}") ) if (DebugConfig.isDebug()) { ToastUtils.showShort("进入漫游模式失败, code:${it.obj}") @@ -153,7 +149,7 @@ class AiCloudIdentifyDataManager : IMoGoPlanningRottingListener, "", CHAIN_CODE_ROMA_CLICK, TAG, - GsonUtils.toJson(mutableMapOf("trigger" to true)) + mutableMapOf("trigger" to true) ) openRoma() } else { @@ -186,15 +182,13 @@ class AiCloudIdentifyDataManager : IMoGoPlanningRottingListener, // false,改变父节点信息 MapBizTrace.log( if (dataReceive) CHAIN_CODE_ROMA_CLICK else "", CHAIN_CODE_ROMA_REQUEST, TAG, - GsonUtils.toJson( - mutableMapOf( - "dataReceive" to dataReceive, - "lon" to gnss.longitude, - "lat" to gnss.latitude, - "heading" to gnss.heading, - "socketStatus" to MogoStatusManager.getInstance().isSocketOnLine, - "cityCode" to CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().cityCode - ) + mutableMapOf( + "dataReceive" to dataReceive, + "lon" to gnss.longitude, + "lat" to gnss.latitude, + "heading" to gnss.heading, + "socketStatus" to MogoStatusManager.getInstance().isSocketOnLine, + "cityCode" to CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().cityCode ), !dataReceive ) aiCloudIdentifyNetWorkModel.requestIdentifyRange( @@ -207,12 +201,10 @@ class AiCloudIdentifyDataManager : IMoGoPlanningRottingListener, if (dataReceive) CHAIN_CODE_ROMA_REQUEST else "", CHAIN_CODE_ROMA_REQUEST_OK, TAG, - GsonUtils.toJson( - mutableMapOf( - "dataResult" to dataReceive, - "startRange" to START_METRE, - "endRange" to END_METRE, - ) + mutableMapOf( + "dataResult" to dataReceive, + "startRange" to START_METRE, + "endRange" to END_METRE, ), !dataReceive ) if (dataReceive) { @@ -226,13 +218,11 @@ class AiCloudIdentifyDataManager : IMoGoPlanningRottingListener, if (dataReceive) CHAIN_CODE_ROMA_REQUEST else "", CHAIN_CODE_ROMA_REQUEST_ERROR, TAG, - GsonUtils.toJson( - mutableMapOf( - "errorMsg" to errorMsg, - "dataResult" to dataReceive, - "startRange" to START_METRE, - "endRange" to END_METRE - ) + mutableMapOf( + "errorMsg" to errorMsg, + "dataResult" to dataReceive, + "startRange" to START_METRE, + "endRange" to END_METRE ), true ) updateLongSightLevel(false) @@ -252,7 +242,7 @@ class AiCloudIdentifyDataManager : IMoGoPlanningRottingListener, CHAIN_CODE_ROMA_REQUEST_OK, CHAIN_CODE_ROMA_MAP_START, TAG, - GsonUtils.toJson(mutableMapOf("romaStart" to "地图开始漫游")) + mutableMapOf("romaStart" to "地图开始漫游") ) showAiCloud.set(true) FunctionBuildConfig.isDrawIdentifyData = false @@ -270,9 +260,8 @@ class AiCloudIdentifyDataManager : IMoGoPlanningRottingListener, } 2 -> { // 地图自动漫游结束,重置状态,调用close通知服务端 MapBizTrace.log( - CHAIN_CODE_ROMA_MAP_START, CHAIN_CODE_ROMA_MAP_END, TAG, GsonUtils.toJson( - mutableMapOf("romaEnd" to "地图结束回调,状态:$status") - ), true + CHAIN_CODE_ROMA_MAP_START, CHAIN_CODE_ROMA_MAP_END, TAG, + mutableMapOf("romaEnd" to "地图结束回调,状态:$status"), true ) reset() } @@ -280,11 +269,7 @@ class AiCloudIdentifyDataManager : IMoGoPlanningRottingListener, MapBizTrace.log( CHAIN_CODE_ROMA_CLOSE_CLICK, CHAIN_CODE_ROMA_MAP_CHANGE_END, - TAG, - GsonUtils.toJson( - mutableMapOf("romaEnd" to "地图结束回调,状态:$status") - ), - true + TAG, mutableMapOf("romaEnd" to "地图结束回调,状态:$status"), true ) reset(false) } diff --git a/core/function-impl/mogo-core-function-startup/src/main/java/com/mogo/eagle/core/function/startup/stageone/HttpDnsStartUp.kt b/core/function-impl/mogo-core-function-startup/src/main/java/com/mogo/eagle/core/function/startup/stageone/HttpDnsStartUp.kt index 786ecfd526..949a5d03b2 100644 --- a/core/function-impl/mogo-core-function-startup/src/main/java/com/mogo/eagle/core/function/startup/stageone/HttpDnsStartUp.kt +++ b/core/function-impl/mogo-core-function-startup/src/main/java/com/mogo/eagle/core/function/startup/stageone/HttpDnsStartUp.kt @@ -371,12 +371,12 @@ class HttpDnsStartUp : AndroidStartup() { nodeAliasCode = CHAIN_CODE_HTTP_DNS_ERROR_REASON, paramIndexes = [0] ) - private fun logError(pr: String) { + private fun logError(pr: Map) { CallerLogger.e("$M_MAIN$TAG", "pr:$pr") } // 归一处理 - private fun getPrReason(msg: String): String { + private fun getPrReason(msg: String): Map { val map = hashMapOf() map["lat"] = if (CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude != 0.0) @@ -387,7 +387,7 @@ class HttpDnsStartUp : AndroidStartup() { CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().longitude else CallerMapUIServiceManager.getGDLocationServer(context!!)!!.lastLon map["reason"] = msg - return GsonUtils.toJson(map) + return map } @ChainLog( From 2584eddfed88065e88c7aa64e980bf05b67150c6 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Mon, 21 Aug 2023 16:00:17 +0800 Subject: [PATCH 18/22] =?UTF-8?q?[6.0.0][Opt]=E9=BB=98=E8=AE=A4=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E8=87=AA=E9=A9=BE=E8=BD=A8=E8=BF=B9=E7=82=B9=E5=B1=95?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mogo/eagle/core/function/view/OverMapView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/OverMapView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/OverMapView.kt index ed4793e385..b08bb0505c 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/OverMapView.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/OverMapView.kt @@ -119,7 +119,7 @@ class OverMapView @JvmOverloads constructor( private val markerOptionsList by lazy { ArrayList() } - private var isDebug = true + private var isDebug = false // 绘制轨迹线的集合 private val textureList: MutableList = ArrayList() From 9ddb562bb77ad09d2e6f0c8176ac0f5073e60df9 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Mon, 21 Aug 2023 16:04:01 +0800 Subject: [PATCH 19/22] =?UTF-8?q?[5.0.0]=20[=E7=BB=9F=E4=B8=80=E8=AE=A1?= =?UTF-8?q?=E7=AE=97gcj=E7=BC=96=E7=A0=81]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bean/response/OrderInfoResponse.kt | 45 ++++++++++- .../passenger/model/CharterPassengerModel.kt | 78 ++++--------------- .../mogo/och/bus/passenger/ui/MainFragment.kt | 2 +- 3 files changed, 56 insertions(+), 69 deletions(-) diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/bean/response/OrderInfoResponse.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/bean/response/OrderInfoResponse.kt index 6ae6bde5c9..ee15d54372 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/bean/response/OrderInfoResponse.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/bean/response/OrderInfoResponse.kt @@ -1,6 +1,8 @@ package com.mogo.och.bus.passenger.bean.response +import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.data.BaseData +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil /** * @@ -20,13 +22,50 @@ data class OrderInfoResponse(val data: OrderInfo?) : BaseData() { val siteNameKr: String?,//站点名称 var wgs84Lat: Double?, var wgs84Lon: Double?, - var gcj02Lat: Double?, - var gcj02Lon: Double?, val startTime: Long?,//开始时间 val endTime: Long?,//结束时间 val passengerPhone: String?,//乘客手机号 var arriveStatus:Int?,//1:未到达 2:到达 - ) + ){ + var gcj02Lat: Double?=null + get() { + if(field!=null){ + return field + } + if(wgs84Lat!=null&&wgs84Lon!=null){ + val coordinateConverterWgsToGcj = + CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj( + AbsMogoApplication.getApp(), + wgs84Lon!!, + wgs84Lat!! + ) + field = coordinateConverterWgsToGcj.latitude + gcj02Lon = coordinateConverterWgsToGcj.longitude + return field + }else{ + return null + } + } + var gcj02Lon: Double?=null + get() { + if(field!=null){ + return field + } + if(wgs84Lat!=null&&wgs84Lon!=null){ + val coordinateConverterWgsToGcj = + CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj( + AbsMogoApplication.getApp(), + wgs84Lon!!, + wgs84Lat!! + ) + field = coordinateConverterWgsToGcj.longitude + gcj02Lat = coordinateConverterWgsToGcj.latitude + return field + }else{ + return null + } + } + } companion object{ val ARRIVING = 1 val ARRIVED = 2 diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt index 9bc7c5cf5d..5df3061500 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt @@ -46,7 +46,6 @@ import com.mogo.och.common.module.manager.OCHAdasAbilityManager import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.common.module.utils.PinYinUtil -import com.mogo.och.common.module.utils.RxUtils import com.mogo.och.common.module.voice.VoiceManager import com.mogo.och.common.module.voice.VoiceNotice import io.reactivex.Observable @@ -79,13 +78,6 @@ object CharterPassengerModel { var mAutoStatusChnageListener = ConcurrentHashMap() - // 定位监听 - private val mControllerStatusCallbackMap = - ConcurrentHashMap() - - // 当前位置坐标 - private var mLocationGCJ02: MogoLocation? = null - // 订单信息 有订单有线路结束订单 @Volatile private var orderInfo: OrderInfoResponse.OrderInfo? = null @@ -136,7 +128,6 @@ object CharterPassengerModel { private fun releaseListeners() { CallerAutoPilotStatusListenerManager.removeListener(mGoAutopilotStatusListener) - CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) CallerPlanningRottingListenerManager.removeListener(moGoAutopilotPlanningListener) } @@ -146,8 +137,6 @@ object CharterPassengerModel { .registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener) // 自动驾驶状态变化监听 CallerAutoPilotStatusListenerManager.addListener(TAG, mGoAutopilotStatusListener) - // 定位监听 - CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 4, mMapLocationListener) // 自动驾驶路线规划接口 返回自动驾驶轨迹 CallerPlanningRottingListenerManager.addListener(TAG, moGoAutopilotPlanningListener) // 登录状态监听 @@ -155,14 +144,6 @@ object CharterPassengerModel { } // region 设置业务回调 - fun setControllerStatusCallback(tag: String, callback: IBusPassengerControllerStatusCallback?) { - if (tag.isBlank()) return - if (callback == null) { - mControllerStatusCallbackMap.remove(tag) - return - } - mControllerStatusCallbackMap[tag] = callback - } fun setAutoStatusCallback(tag: String, callback: ICharterPassengerAutoStatusChangeCallback?) { if (tag.isBlank()) return @@ -202,18 +183,6 @@ object CharterPassengerModel { // endregion // region 设置外部回调 - // 定位监听 - private val mMapLocationListener: IMoGoChassisLocationGCJ02Listener = - object : IMoGoChassisLocationGCJ02Listener { - override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { - if (null == mogoLocation) return - mLocationGCJ02 = mogoLocation - for (callback in mControllerStatusCallbackMap.values) { - callback.onCarLocationChanged(mogoLocation) - } - } - } - // 自动驾驶状态监听 private val mGoAutopilotStatusListener: IMoGoAutopilotStatusListener = object : IMoGoAutopilotStatusListener { @@ -397,17 +366,11 @@ object CharterPassengerModel { d(M_BUS_P + TAG, "设置车模") } if (this.orderInfo?.siteId != orderData.siteId) { - val coordinateConverterWgsToGcj = - CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj( - mContext, - order.wgs84Lon!!, - order.wgs84Lat!! - ) this.carTypeChageListener?.setEndStationCallBack( order.siteId, order.siteName, - coordinateConverterWgsToGcj.longitude, - coordinateConverterWgsToGcj.latitude + order.gcj02Lon!!, + order.gcj02Lat!! ) } this.orderInfo?.orderNo?.let { @@ -432,19 +395,13 @@ object CharterPassengerModel { this.orderInfo = orderData } //计算终点距离 - mLocationGCJ02?.let { currentInfo -> + CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().let { currentInfo -> // 两点之间的距离 - val coordinateConverterWgsToGcj = - CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj( - mContext, - order.wgs84Lon!!, - order.wgs84Lat!! - ) val calculateLineDistance = CoordinateUtils.calculateLineDistance( currentInfo.longitude, currentInfo.latitude, - coordinateConverterWgsToGcj.longitude, - coordinateConverterWgsToGcj.latitude + order.gcj02Lon!!, + order.gcj02Lat!! ) // 小于15m到站 if (calculateLineDistance < CharterPassengerConst.ARRIVE_AT_START_STATION_DISTANCE && calculateLineDistance > 0) { @@ -530,7 +487,7 @@ object CharterPassengerModel { if (data.orderNo != null && data.orderNo.isNotEmpty()) {// 订单进行中 return } - // 结束路距计算 + // 结束路距计算 订单结束了 endCalculateDistanceLoop() // 停止时间校准 endCalibrationLoop() @@ -683,7 +640,7 @@ object CharterPassengerModel { */ private fun calculateDistance() { //mLocation gcj坐标 - mLocationGCJ02?.let { + CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().let { orderInfo?.let { order -> d(M_BUS_P + "calculateDistance", "订单信息:$order") if (order.siteId == null || order.siteId == 0L || @@ -701,15 +658,9 @@ object CharterPassengerModel { } // 启动轨迹计算 var lastSumLength = 0f - val orderLonLat = - CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj( - mContext, - order.wgs84Lon!!, - order.wgs84Lat!! - ) val mogoLocation = MogoLocation() - mogoLocation.longitude = orderLonLat.longitude - mogoLocation.latitude = orderLonLat.latitude + mogoLocation.longitude = order.gcj02Lon!! + mogoLocation.latitude = order.gcj02Lat!! lastSumLength = CoordinateUtils.calculateLineDistance( it.longitude, @@ -795,7 +746,7 @@ object CharterPassengerModel { var distanceMap: MutableMap = TreeMap() // 计算所有点的距离 data.forEachIndexed { index, siteInfo -> - mLocationGCJ02?.let { currentInfo -> + CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().let { currentInfo -> // 两点之间的距离 val calculateLineDistance = CoordinateUtils.calculateLineDistance( currentInfo.longitude, @@ -843,7 +794,7 @@ object CharterPassengerModel { if (middle == 0) { return Pair(1, false) } - mLocationGCJ02?.let { + CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().let { // 仅计算 距离最近的站点middle 附近5个坐标的夹角 // middle middle-1 // middle middle+1 @@ -997,7 +948,7 @@ object CharterPassengerModel { cleanRoutePoints() // 到站结束自驾 CallerAutoPilotControlManager.cancelAutoPilot() - // 结束路距计算 + // 结束路距计算 到达目的站点 endCalculateDistanceLoop() // 到站置距离位0 invokeStationDistanceListener(-1, -1) @@ -1047,7 +998,7 @@ object CharterPassengerModel { } // 到站结束自驾 CallerAutoPilotControlManager.cancelAutoPilot() - // 停止路距计算 + // 停止路距计算 选择新的站点后 endCalculateDistanceLoop() // 到站置距离位0 invokeStationDistanceListener(-1, -1) @@ -1114,9 +1065,6 @@ object CharterPassengerModel { if (!checkCurrentOCHOrder()) { e(M_BUS_P + TAG, "no order or order is empty.") return null - } - mLocationGCJ02?.let { - } val parameters = AutopilotControlParameters() orderInfo?.let { orderInfo -> diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/MainFragment.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/MainFragment.kt index 4203fac99b..54ae94fa9c 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/MainFragment.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/bus/passenger/ui/MainFragment.kt @@ -225,7 +225,7 @@ class MainFragment : MvpFragment() { omvOverMap.onResume() UiThreadHandler.postDelayed({ getMapUIController()?.setAllGesturesEnabled(false) - }, 200) + }, 500) } override fun onSaveInstanceState(outState: Bundle) { From 5c056cf0af4e1386fcb2f93be44f5a64bc4f9838 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Mon, 21 Aug 2023 17:51:55 +0800 Subject: [PATCH 20/22] =?UTF-8?q?[5.0.0]=20[debugview=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=9D=80=E6=AD=BBAPP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../function/hmi/ui/setting/DebugSettingView.kt | 15 +++++++++++++++ .../src/main/res/layout/view_debug_setting.xml | 10 ++++++++++ 2 files changed, 25 insertions(+) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index 45b4c2e80b..0122f7417c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -89,6 +89,7 @@ import kotlin.collections.component3 import kotlin.collections.component4 import kotlin.collections.set import kotlin.math.abs +import kotlin.system.exitProcess /** @@ -745,6 +746,9 @@ internal class DebugSettingView @JvmOverloads constructor( CallerAutoPilotControlManager.sendIpcReboot() ToastUtils.showLong("重启命令已发送") } + btnAppReboot.onClick { + killApp() + } //只在司机端设置工控机节点重启功能 if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { btnIpcReboot.visibility = View.GONE @@ -2035,6 +2039,17 @@ internal class DebugSettingView @JvmOverloads constructor( } } + private fun killApp() { + Intent(Intent.ACTION_MAIN).apply { + addCategory(Intent.CATEGORY_HOME) + flags = Intent.FLAG_ACTIVITY_NEW_TASK + context.startActivity(this) + Process.killProcess(Process.myPid()) + exitProcess(0) + } + } + + /** * 初始化上报 */ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index f5cefbfa4e..c377837ecb 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -333,6 +333,16 @@ android:padding="@dimen/dp_20" android:textSize="@dimen/dp_24" /> +