From 667a0d4544565f0235ea9608a05521249567e172 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Sat, 25 Feb 2023 19:37:52 +0800 Subject: [PATCH 1/4] =?UTF-8?q?[charter]=20M1=E5=8F=B8=E6=9C=BA=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OCH/mogo-och-charter/build.gradle | 2 +- .../magic/mogo/och/charter/CharterProvider.kt | 20 +- .../bean/CheckOrderCountDownResponse.kt | 16 + .../bean/QueryBusinessStatusResponse.kt | 14 + .../charter/bean/QueryCurrentOrderResponse.kt | 25 + .../och/charter/bean/RequestChangeDest.kt | 7 + .../magic/mogo/och/charter/bean/Station.kt | 7 + .../charter/callback/ChangeDestCallback.kt | 9 + .../charter/callback/DriverM1OrderCallback.kt | 13 + .../IDriverM1ControllerStatusCallback.kt | 3 - .../och/charter/fragment/DriverM1Fragment.kt | 103 ++- .../charter/model/DriverM1LooperManager.kt | 71 +++ .../mogo/och/charter/model/DriverM1Model.kt | 603 +++++++++++------- .../och/charter/net/DriverM1ServiceManager.kt | 81 +++ .../mogo/och/charter/net/IDriverM1Service.kt | 45 ++ .../charter/presenter/DriverM1Presenter.kt | 106 ++- .../mogo/och/charter/view/SlidePanelView.kt | 20 +- .../res/layout/fragment_driver_m1.xml | 39 +- .../src/driverm1/res/values/attrs.xml | 13 + .../src/driverm1/res/values/strings.xml | 5 +- .../magic/mogo/och/charter/ICharterOCH.java | 3 +- .../och/charter/base/CharterBaseFragment.kt | 56 +- .../mogo/och/charter/constant/CharterConst.kt | 8 +- .../main/res/layout/charter_base_fragment.xml | 18 + .../module/bean/dpmsg/DPOperateDoorMsg.kt | 9 + .../module/bean/dpmsg/DPOrderClosedMsg.kt | 9 + .../socketmessage/OCHSocketMessageManager.kt | 6 +- .../common/socketmessage/data/DataBaseMsg.kt | 7 + .../socketmessage/data/OperateDoorMsg.kt | 12 + .../socketmessage/data/OrderCloseMsg.kt | 12 + .../common/socketmessage/data/SystemMsg.kt | 13 + .../module/biz/ui/TaxiLoginDialogFragment.kt | 4 +- .../common/module/utils/CallerLoggerUtils.kt | 7 +- .../mogo/launcher/startup/ConfigStartUp.kt | 3 + .../drawable-xhdpi/operation_order_icon.png | Bin 0 -> 15347 bytes .../src/main/res/drawable-xhdpi/pnc_icon.png | Bin 0 -> 16391 bytes .../mogo/logger/scene/SceneConstant.kt | 2 + .../com/mogo/commons/screen/ScreenHelper.java | 3 +- 38 files changed, 1065 insertions(+), 309 deletions(-) create mode 100644 OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/CheckOrderCountDownResponse.kt create mode 100644 OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/QueryBusinessStatusResponse.kt create mode 100644 OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/QueryCurrentOrderResponse.kt create mode 100644 OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/RequestChangeDest.kt create mode 100644 OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/Station.kt create mode 100644 OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/callback/ChangeDestCallback.kt create mode 100644 OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/callback/DriverM1OrderCallback.kt create mode 100644 OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1LooperManager.kt create mode 100644 OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/net/DriverM1ServiceManager.kt create mode 100644 OCH/mogo-och-charter/src/driverm1/res/values/attrs.xml create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/bean/dpmsg/DPOperateDoorMsg.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/bean/dpmsg/DPOrderClosedMsg.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/data/DataBaseMsg.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/data/OperateDoorMsg.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/data/OrderCloseMsg.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/data/SystemMsg.kt create mode 100755 core/mogo-core-res/src/main/res/drawable-xhdpi/operation_order_icon.png create mode 100755 core/mogo-core-res/src/main/res/drawable-xhdpi/pnc_icon.png diff --git a/OCH/mogo-och-charter/build.gradle b/OCH/mogo-och-charter/build.gradle index f3fdddfcc8..ed923ad613 100644 --- a/OCH/mogo-och-charter/build.gradle +++ b/OCH/mogo-och-charter/build.gradle @@ -55,7 +55,7 @@ dependencies { implementation rootProject.ext.dependencies.kotlinstdlibjdk7 implementation rootProject.ext.dependencies.androidxappcompat implementation rootProject.ext.dependencies.arouter - annotationProcessor rootProject.ext.dependencies.aroutercompiler + kapt rootProject.ext.dependencies.aroutercompiler implementation rootProject.ext.dependencies.androidxconstraintlayout implementation rootProject.ext.dependencies.amapnavi3dmap diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/CharterProvider.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/CharterProvider.kt index e5debe4c7f..b711a4f238 100644 --- a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/CharterProvider.kt +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/CharterProvider.kt @@ -4,9 +4,9 @@ import android.content.Context import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import com.alibaba.android.arouter.facade.annotation.Route -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.magic.mogo.och.charter.constant.CharterConst import com.magic.mogo.och.charter.fragment.DriverM1Fragment +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d /** @@ -17,18 +17,19 @@ import com.magic.mogo.och.charter.fragment.DriverM1Fragment class CharterProvider: ICharterOCH{ private var mActivity: FragmentActivity? = null - private var mContainerId = 0 + private var mContainerId: Int? = 0 private var driverM1Fragment: Fragment? = null override fun createCoverage(activity: FragmentActivity?, containerId: Int) {} - override fun createCoverage(activity: FragmentActivity?, containerId: Int?): Fragment? { - mActivity = activity - mContainerId = containerId!! + override fun createCoverage(fragmentActivity: FragmentActivity?, integer: Int?): Fragment? { + this.mContainerId = integer + this.mActivity = fragmentActivity showFragment() return null } + private fun showFragment() { val supportFragmentManager = mActivity?.supportFragmentManager @@ -41,10 +42,11 @@ class CharterProvider: ICharterOCH{ DriverM1Fragment() } if (!driverM1Fragment!!.isAdded) { - supportFragmentManager?.beginTransaction() - ?.add(mContainerId, driverM1Fragment!!, DriverM1Fragment.TAG)?.commitAllowingStateLoss() + mContainerId?.let { + supportFragmentManager?.beginTransaction() + ?.add(it, driverM1Fragment!!, DriverM1Fragment.TAG)?.commitAllowingStateLoss() + } } - return } d(TAG, "准备show fragment") supportFragmentManager?.beginTransaction()?.show(driverM1Fragment!!)?.commitAllowingStateLoss() @@ -55,7 +57,7 @@ class CharterProvider: ICharterOCH{ } override val functionName: String - get() = "och-charter-driver-m1" + get() = "" override fun onDestroy() { // 若不调用finish, 设置中打开关闭UITouch,会造成och fragment 重叠 diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/CheckOrderCountDownResponse.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/CheckOrderCountDownResponse.kt new file mode 100644 index 0000000000..64d9a58139 --- /dev/null +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/CheckOrderCountDownResponse.kt @@ -0,0 +1,16 @@ +package com.magic.mogo.och.charter.bean + +import com.mogo.eagle.core.data.BaseData + +/** + * @author: wangmingjun + * @date: 2023/2/24 + */ +data class CheckOrderCountDownResponse(var data: Result):BaseData(){ + data class Result( + var currentTime: Long, + var startTime: Long, + var endTime: Long + ) +} + diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/QueryBusinessStatusResponse.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/QueryBusinessStatusResponse.kt new file mode 100644 index 0000000000..85f2f77bcf --- /dev/null +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/QueryBusinessStatusResponse.kt @@ -0,0 +1,14 @@ +package com.magic.mogo.och.charter.bean + +import com.mogo.eagle.core.data.BaseData + +/** + * @author: wangmingjun + * @date: 2023/2/24 + */ +data class QueryBusinessStatusResponse(var data: Result):BaseData(){ + data class Result(var orderNo: String, var businessStatus: Int) + //1: 闲置 2:orderNo = "" 当前并没有核销的订单, orderNo != "" 当前车辆需还车状态 +} + + diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/QueryCurrentOrderResponse.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/QueryCurrentOrderResponse.kt new file mode 100644 index 0000000000..475345a1e4 --- /dev/null +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/QueryCurrentOrderResponse.kt @@ -0,0 +1,25 @@ +package com.magic.mogo.och.charter.bean + +import com.mogo.eagle.core.data.BaseData + +/** + * @author: wangmingjun + * @date: 2023/2/24 + */ +data class QueryCurrentOrderResponse(var data: Result):BaseData(){ //线路id , 线路名, 当前站点和坐标, 目的站点和坐标, 包车时间, 乘客信息 + data class Result( + var sn: String, + var productType: Int, + var orderNo: String, + var lineId: Int, + var lineName: String, + var siteId: Int, + var siteName: String, + var wgs84Lon: Double, + var wgs84Lat: Double, + var startTime: Long, + var endTime: Long, + var passengerPhone: String + ) +} + diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/RequestChangeDest.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/RequestChangeDest.kt new file mode 100644 index 0000000000..0505130487 --- /dev/null +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/RequestChangeDest.kt @@ -0,0 +1,7 @@ +package com.magic.mogo.och.charter.bean + +/** + * @author: wangmingjun + * @date: 2023/2/24 + */ +data class RequestChangeDest(var sn: String,var lineId: Int,var siteId: Int) diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/Station.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/Station.kt new file mode 100644 index 0000000000..7a8a8ce957 --- /dev/null +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/Station.kt @@ -0,0 +1,7 @@ +package com.magic.mogo.och.charter.bean + +/** + * @author: wangmingjun + * @date: 2023/2/23 + */ +data class Station(var siteId: Int, var siteName: String, var seq: Int) diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/callback/ChangeDestCallback.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/callback/ChangeDestCallback.kt new file mode 100644 index 0000000000..2c46965bd0 --- /dev/null +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/callback/ChangeDestCallback.kt @@ -0,0 +1,9 @@ +package com.magic.mogo.och.charter.callback + +/** + * @author: wangmingjun + * @date: 2023/2/24 + */ +interface ChangeDestCallback { + fun showCommitDialog(title: String,content: String) +} \ No newline at end of file diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/callback/DriverM1OrderCallback.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/callback/DriverM1OrderCallback.kt new file mode 100644 index 0000000000..3e4edd3453 --- /dev/null +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/callback/DriverM1OrderCallback.kt @@ -0,0 +1,13 @@ +package com.magic.mogo.och.charter.callback + +import com.magic.mogo.och.charter.bean.QueryCurrentOrderResponse + +/** + * @author: wangmingjun + * @date: 2023/2/23 + */ +interface DriverM1OrderCallback { + fun updateOrderUI(orderStatus: QueryCurrentOrderResponse.Result) // 到达站 + fun updateOverCountDown(minutes: Int) //倒计时 分钟 + fun updateReturnCarStatus(returnSuccess: Boolean) +} \ No newline at end of file diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/callback/IDriverM1ControllerStatusCallback.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/callback/IDriverM1ControllerStatusCallback.kt index 8420b661a7..d4881f53de 100644 --- a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/callback/IDriverM1ControllerStatusCallback.kt +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/callback/IDriverM1ControllerStatusCallback.kt @@ -8,9 +8,6 @@ import com.mogo.eagle.core.data.map.MogoLocation * Model->Presenter回调:状态控制器监听(accOn、adas ui show、voice ui show、push ui show、v2x ui show等等) */ interface IDriverM1ControllerStatusCallback { - // 是否vr map模式 - fun onVRModeChanged(isVRMode: Boolean) - // 自车定位 fun onCarLocationChanged(location: MogoLocation?) diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/fragment/DriverM1Fragment.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/fragment/DriverM1Fragment.kt index bcb7519be4..36a92a0c26 100644 --- a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/fragment/DriverM1Fragment.kt +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/fragment/DriverM1Fragment.kt @@ -3,16 +3,21 @@ package com.magic.mogo.och.charter.fragment import android.os.Bundle import android.view.View import com.alibaba.android.arouter.launcher.ARouter -import com.charter.driverm1.view.SlidePanelView import com.magic.mogo.och.charter.R import com.magic.mogo.och.charter.base.CharterBaseFragment +import com.magic.mogo.och.charter.bean.QueryCurrentOrderResponse import com.magic.mogo.och.charter.net.login.LoginDriverM1Impl import com.magic.mogo.och.charter.presenter.DriverM1Presenter +import com.magic.mogo.och.charter.view.SlidePanelView import com.mogo.eagle.core.data.temp.EventLogout import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.och.common.module.biz.constant.OchCommonConst import com.mogo.och.common.module.biz.provider.LoginService +import com.mogo.och.common.module.utils.DateTimeUtil +import com.mogo.och.common.module.wigets.OCHCommitDialog +import kotlinx.android.synthetic.driverm1.bus_no_line_view.* +import kotlinx.android.synthetic.driverm1.fragment_driver_m1.* import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode @@ -21,8 +26,9 @@ import org.greenrobot.eventbus.ThreadMode * @date: 2023/2/22 */ class DriverM1Fragment : CharterBaseFragment(), - SlidePanelView.OnSlidePanelMoveToEndListener, View.OnClickListener { + SlidePanelView.OnSlidePanelMoveToEndListener{ private var loginService: LoginService? = null + private var ochCommitDialog: OCHCommitDialog? = null companion object{ val TAG: String = DriverM1Fragment::class.java.name @@ -33,16 +39,42 @@ class DriverM1Fragment : CharterBaseFragment aLong + 1 } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + DriverM1Model.get().queryCurrentServiceStatus() + } + } + + fun stopQueryDriverLineLoop() { + if (mQueryLineDisposable != null) { + CallerLogger.i(SceneConstant.M_BUS_P + TAG, "stopQueryDriverLineLoop()") + mQueryLineDisposable!!.dispose() + mQueryLineDisposable = null + } + } + + fun starCountDownLoop() { + if (mQueryCountDownDisposable != null && !mQueryCountDownDisposable!!.isDisposed) { + return + } + CallerLogger.i(SceneConstant.M_BUS_P + TAG, "starCountDownLoop()") + mQueryCountDownDisposable = Observable.interval( + CharterConst.LOOP_DELAY, + CharterConst.LOOP_5M, TimeUnit.MINUTES + ) + .map { aLong: Long -> aLong + 1 } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + DriverM1Model.get().checkOrderCountDown() + } + } + + fun stopCountDownLoop() { + if (mQueryCountDownDisposable != null) { + CallerLogger.i(SceneConstant.M_BUS_P + TAG, "stopCountDownLoop()") + mQueryCountDownDisposable!!.dispose() + mQueryCountDownDisposable = null + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt index 3975e2ad07..dd048a79db 100644 --- a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt @@ -1,35 +1,51 @@ package com.magic.mogo.och.charter.model import android.content.Context +import android.net.ConnectivityManager import android.os.Handler import com.alibaba.android.arouter.launcher.ARouter +import com.alibaba.android.arouter.utils.TextUtils import com.elegant.network.utils.GsonUtil +import com.magic.mogo.och.charter.bean.CheckOrderCountDownResponse +import com.magic.mogo.och.charter.bean.QueryBusinessStatusResponse +import com.magic.mogo.och.charter.bean.QueryCurrentOrderResponse +import com.magic.mogo.och.charter.callback.ChangeDestCallback +import com.magic.mogo.och.charter.callback.DriverM1OrderCallback import com.magic.mogo.och.charter.callback.IADASStatusCallback import com.magic.mogo.och.charter.callback.IDriverM1ControllerStatusCallback +import com.magic.mogo.och.charter.net.DriverM1ServiceManager +import com.mogo.aicloud.services.socket.IMogoOnMessageListener import com.mogo.commons.AbsMogoApplication -import com.mogo.commons.module.status.IMogoStatusChangedListener -import com.mogo.commons.module.status.MogoStatusManager -import com.mogo.commons.module.status.StatusDescriptor +import com.mogo.commons.module.intent.IMogoIntentListener +import com.mogo.commons.module.intent.IntentManager +import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.map.MogoLocation -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.data.telematic.TelematicConstant import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener -import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener +import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.setIPCDemoMode import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.setIgnoreConditionDraw 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.CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager -import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager +import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager +import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager +import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager.sendMsgToAllClients 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.GsonUtils +import com.mogo.eagle.core.utilcode.util.NetworkUtils import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.common.module.bean.dpmsg.* import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager +import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager.pushAppOperationalMsgBox import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager.releaseSocketMessageListener +import com.mogo.och.common.module.biz.common.socketmessage.data.* import com.mogo.och.common.module.biz.constant.OchCommonConst +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback import com.mogo.och.common.module.biz.provider.LoginService import com.mogo.och.common.module.callback.OchAdasStartFailureCallback import com.mogo.och.common.module.manager.AbnormalFactorsLoopManager.startLoopAbnormalFactors @@ -49,9 +65,6 @@ class DriverM1Model { private var backgroundCurrentStationIndex = 0 //A->B 此处值是A站点索引 - - @Volatile - private var sInstance: DriverM1Model? = null var mLongitude = 0.0 var mLatitude = 0.0 private var mContext: Context? = null @@ -62,26 +75,38 @@ class DriverM1Model { private var isGoingToNextStation = false // 运营类型 - private val VEHICLE_TYPE = 10 - private val MSG_QUERY_BUS_STATION = 1001 + private val MSG_QUERY_BUS_STATION: Int = 1001 private val QUERY_BUS_STATION_DELAY: Long = 5000 -// private var slidePanelHideCallback: ISlidePannelHideCallback? = null private var mControllerStatusCallback //Model->Presenter:VR mode等 : IDriverM1ControllerStatusCallback? = null private var mADASStatusCallback: IADASStatusCallback? = null + private var mOrderCallback: DriverM1OrderCallback? = null - @Volatile - private var isArrivedStation = false + private var mChangeDestCallback: ChangeDestCallback? = null + + private var mCurrentOrder: QueryCurrentOrderResponse.Result? = null + + private var currentChangeDestMsg: ChangeDestMsg? = null //0: 代表没有启动过 1代表是启动第一次,当>=1 代表是重试 每次到站/路线结束清空置为0 - @Volatile - private var firstStartAutopilot = 0 private var loginService: LoginService? = null + companion object { + val TAG = DriverM1Model::class.java.simpleName + private var INSTANCE: DriverM1Model? = null + @Synchronized + fun get(): DriverM1Model{ + if (INSTANCE == null) { + INSTANCE = DriverM1Model() + } + return INSTANCE!! + } + } + private val handler = Handler(Handler.Callback { msg -> if (msg.what == MSG_QUERY_BUS_STATION) { return@Callback true @@ -89,64 +114,63 @@ class DriverM1Model { false }) - companion object { - val TAG = DriverM1Model::class.java.simpleName - const val MSG_QUERY_BUS_P_STATION = 1001 - val INSTANCE: DriverM1Model by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { - DriverM1Model() - } - } fun init() { mContext = AbsMogoApplication.getApp() - loginService = ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation() as LoginService // 定位监听 CallerChassisLocationGCJ02ListenerManager.addListener(TAG, mMapLocationListener) - MogoStatusManager.getInstance().registerStatusChangedListener( - TAG, - StatusDescriptor.VR_MODE, - mMogoStatusChangedListener - ) - - //自动驾驶路线规划接口 - CallerPlanningRottingListenerManager.addListener(TAG, moGoAutopilotPlanningListener) //开启自驾后 异常信息返回 OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(mAdasStartFailureListener) -// registerSocketMessageListener( //监听运营消息 -// OCHSocketMessageManager.msgMonitorType, -// mMogoOnMessageListener -// ) -// registerSocketMessageListener( //监听核销乘客 -// OCHSocketMessageManager.msgWriteOffPassengerType, -// mWriteOffPassengeOnMessageListener -// ) + + // 监听运营信息 + OCHSocketMessageManager.registerSocketMessageListener( + OCHSocketMessageManager.msgMonitorType, + mMogoOnMessageListener) + //监听开门 + OCHSocketMessageManager.registerSocketMessageListener( + OCHSocketMessageManager.msgOperateDoorType, + mMogoOnMessageListener) + //监听订单结束 + OCHSocketMessageManager.registerSocketMessageListener( + OCHSocketMessageManager.msgOrderClosedType, + mMogoOnMessageListener) + + //监听乘客屏发来的消息 + CallerTelematicListenerManager.addListener(TAG,mReceivedMsgListener) + + //定位,长连接等异常提示 startLoopAbnormalFactors(mContext!!) + //网络监听 + IntentManager.getInstance().registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener) + + loginService = ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation() as LoginService + //2022.1.28 // 调用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{ + RxJavaPlugins.setErrorHandler(object : Consumer { override fun accept(e: Throwable?) { var e = e if (e is UndeliverableException) { e = e.cause!! - d(SceneConstant.M_BUS + TAG, "UndeliverableException") + d(SceneConstant.M_CHARTER_D + TAG, "UndeliverableException") } if (e is IOException) { // // fine, irrelevant network problem or API that throws on cancellation - d(SceneConstant.M_BUS + TAG, "IOException") + 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_BUS + TAG, "InterruptedException") + 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_BUS + TAG, "NullPointerException or IllegalArgumentException") + d(SceneConstant.M_CHARTER_D + TAG, "NullPointerException or IllegalArgumentException") Thread.currentThread().uncaughtExceptionHandler.uncaughtException( Thread.currentThread(), e @@ -168,82 +192,102 @@ class DriverM1Model { }) } -// private val mMogoOnMessageListener: IMogoOnMessageListener = -// object : IMogoOnMessageListener { -// override fun target(): Class { -// return OCHOperationalMessage::class.java -// } -// -// fun onMsgReceived(obj: OCHOperationalMessage) { -// if (obj == null) { -// d(SceneConstant.M_BUS + TAG, "onMsgReceived = null") -// return -// } -// i(SceneConstant.M_BUS + TAG, "onMsgReceived = " + obj.message) -// pushAppOperationalMsgBox( -// obj.pushTimeStamp, -// obj.message -// ) -// } -// } + /** + * 接收乘客屏发来确认信息 + */ + private val mReceivedMsgListener: IReceivedMsgListener = + object : IReceivedMsgListener { + override fun onReceivedMsg(type: Int, byteArray: ByteArray) { + if (TelematicConstant.BUSINESS_STRING == type){ + try { + val msg = GsonUtils.fromJson(String(byteArray), + BaseDPMsg::class.java) as BaseDPMsg + if (msg.type == DPMsgType.TYPE_CHANGE_DEST.type){ + val changeDestMsg = GsonUtils.fromJson(String(byteArray), + ChangeDestMsg::class.java) as ChangeDestMsg + currentChangeDestMsg = changeDestMsg + showChangerDestCommitDialog(changeDestMsg) + } + d(SceneConstant.M_CHARTER_D,"onReceivedMsg = "+ GsonUtils.toJson(msg)) + }catch (e: Exception){ + d(SceneConstant.M_CHARTER_D,"onReceivedMsg = "+"消息解析错误") + } -// private val mWriteOffPassengeOnMessageListener: IMogoOnMessageListener = -// object : IMogoOnMessageListener { -// override fun target(): Class { -// return WriteOffPassenger::class.java -// } -// -// override fun onMsgReceived(passenger: WriteOffPassenger) { -// //进行播报 -// i(SceneConstant.M_BUS + TAG, "passenger = " + GsonUtil.jsonFromObject(passenger)) -// if (passenger != null && passenger.passengerSize == 0) return -// if (mPassengerCallback != null) { -// mPassengerCallback.playPassenger(passenger) -// } -// } -// } + } + } + } + + private fun showChangerDestCommitDialog(changeDestMsg: ChangeDestMsg) { + if (changeDestMsg.destSiteName !== ""){ + UiThreadHandler.post{ + mChangeDestCallback?.showCommitDialog("确认站点", + "请确认是否前往"+ changeDestMsg.destSiteName + "站点") + } + }else if (changeDestMsg.lineName !== ""){ + UiThreadHandler.post{ + mChangeDestCallback?.showCommitDialog("确认路线", + "请确认是否切换"+ changeDestMsg.lineName + "路线") + } + } + } + + private val mMogoOnMessageListener = + object : IMogoOnMessageListener { + override fun onMsgReceived(obj: DataBaseMsg) { + if (obj == null) { + d(SceneConstant.M_CHARTER_D + TAG, "onMsgReceived = null") + return + } + d(SceneConstant.M_CHARTER_D + TAG, "onMsgReceived = " + obj.msgType) + + when(obj.msgType){ + OCHSocketMessageManager.msgMonitorType ->{ + val msg = obj as SystemMsg + pushAppOperationalMsgBox(obj.pushTimeStamp, msg.context) + + val list = msg.screenList + if (list.size > 1){ //发送乘客屏 + } + } + OCHSocketMessageManager.msgOperateDoorType ->{ + val msg = obj as OperateDoorMsg +// pushAppOperationalMsgBox(obj.pushTimeStamp, msg.) + sendMsgToClient(DPOperateDoorMsg(true)) + } + OCHSocketMessageManager.msgOrderClosedType ->{ + val msg = obj as OrderCloseMsg + pushAppOperationalMsgBox(obj.pushTimeStamp, msg.message) + sendMsgToClient(DPOrderClosedMsg()) + } + } + + } + + override fun target(): Class { + return DataBaseMsg::class.java + } + } fun setAdasStatusCallback(callback: IADASStatusCallback?) { mADASStatusCallback = callback } -// fun setSlidePanelHideCallback(callback: ISlidePannelHideCallback?) { -// slidePanelHideCallback = callback -// } + fun setChangeDestCallback(callback: ChangeDestCallback?){ + mChangeDestCallback = callback + } + + fun setDriverM1OrderCallback(callback: DriverM1OrderCallback?) { + mOrderCallback = callback + } fun setControllerStatusCallback(callback: IDriverM1ControllerStatusCallback?) { mControllerStatusCallback = callback } - private val moGoAutopilotPlanningListener: IMoGoPlanningRottingListener = - object : IMoGoPlanningRottingListener { - override fun onAutopilotRotting(routeList: GlobalPathResp?) { - if (null != routeList && routeList.getWayPointsList().size() > 0) { -// points.clear() -// points.addAll( -// coordinateConverterWgsToGcjList( -// mContext, -// routeList.getWayPointsList() -// )!! -// ) -// updateOrderRoute() - } - } - } - fun release() { -// startOrStopOrderLoop(false) - MogoStatusManager.getInstance().unregisterStatusChangedListener( - TAG, - StatusDescriptor.VR_MODE, - mMogoStatusChangedListener - ) - // 注销定位监听 CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) - //自动驾驶路线规划接口 - CallerPlanningRottingListenerManager.removeListener(moGoAutopilotPlanningListener) loginService = null OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(null) releaseSocketMessageListener( @@ -255,20 +299,6 @@ class DriverM1Model { stopLoopAbnormalFactors() } - private fun readResolve(): Any? { - // 阻止反序列化,必须实现 Serializable 接口 - return sInstance - } - - private val mMogoStatusChangedListener: IMogoStatusChangedListener = - IMogoStatusChangedListener { descriptor, isTrue -> - - // VR mode变更回调 - if (StatusDescriptor.VR_MODE == descriptor) { - mControllerStatusCallback?.onVRModeChanged(isTrue) - } - } - private val mAdasStartFailureListener: OchAdasStartFailureCallback = object : OchAdasStartFailureCallback { override fun onStartAutopilotFailure( @@ -282,11 +312,22 @@ class DriverM1Model { // SceneConstant.M_BUS + TAG, // "mAdasStartFailureListener = $startFailedMessage" // ) -// mADASStatusCallback.onStartAdasFailure() +// mADASStatusCallback?.onStartAdasFailure() // } } } + //监听网络变化,避免启动机器时无网导致无法更新订单信息 + private val mNetWorkIntentListener = + IMogoIntentListener { intentStr, _ -> + d(SceneConstant.M_TAXI + TAG, "onIntentReceived = %s", intentStr) + if (ConnectivityManager.CONNECTIVITY_ACTION == intentStr) { + if (NetworkUtils.isConnected(mContext)) { + loginService!!.queryLoginStatusByNet() + } + } + } + // 自车定位 private val mMapLocationListener: IMoGoChassisLocationGCJ02Listener = object : IMoGoChassisLocationGCJ02Listener { @@ -294,14 +335,14 @@ class DriverM1Model { if (null == gnssInfo) return mLongitude = gnssInfo.longitude mLatitude = gnssInfo.latitude -// if (mControllerStatusCallback != null) { -// mControllerStatusCallback.onCarLocationChanged(gnssInfo) -// } + if (mControllerStatusCallback != null) { + mControllerStatusCallback?.onCarLocationChanged(gnssInfo) + } //是否到站的围栏判断 离站状态并且自动驾驶还未触发到站 - if (isGoingToNextStation && !isArrivedStation) { - judgeArrivedStation(gnssInfo) - } +// if (isGoingToNextStation && !isArrivedStation) { +// judgeArrivedStation(gnssInfo) +// } } } @@ -328,24 +369,12 @@ class DriverM1Model { // } } - private fun onStartAutopilot(leaveIndex: Int) { - //开启自动驾驶 2.10.0: 如果自动驾驶状态下开启, 非自动驾驶状态下不开启,需手动点击自动驾驶按钮开启 - isGoingToNextStation = true - if (getAutoPilotStatusInfo().state - == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING - ) { - startAutopilot(false, leaveIndex) - } else { - firstStartAutopilot = 0 - } - } - /** * 开启自动驾驶 * * @param isRestart */ - private fun startAutopilot(isRestart: Boolean, leaveIndex: Int) { + private fun startAutopilot() { if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().autopilotAbilityStatus) { ToastUtils.showLong( OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason + @@ -354,99 +383,67 @@ class DriverM1Model { triggerUnableStartAPReasonEvent() return } - firstStartAutopilot++ - triggerStartServiceEvent(isRestart, false) - val parameters = initAutopilotControlParameters(leaveIndex) + triggerStartServiceEvent(true, false) + val parameters = initAutopilotControlParameters() if (null == parameters) { - e(SceneConstant.M_BUS + TAG, "行程日志-AutopilotControlParameters is empty.") + d(SceneConstant.M_BUS + TAG, "行程日志-AutopilotControlParameters is empty.") return } startAutoPilot(parameters) d( SceneConstant.M_BUS + TAG, "行程日志-开启自动驾驶====" + GsonUtil.jsonFromObject(parameters) - + " startLatLon=" + parameters.startName + ",endLatLon=" + parameters.endName + - "isRestart = " + isRestart + + " startLatLon=" + parameters.startName + ",endLatLon=" + parameters.endName ) if (mControllerStatusCallback != null) { mControllerStatusCallback?.startOpenAutopilot() } } - //车站10s后播报 -// private fun leaveTTSTips(nextStation: String) { -// showNotice( -// String.format( -// mContext -// .getString(R.string.bus_leave_station_tip), -// nextStation -// ), CharterConst.Companion.DELAY_10S -// ) -// } - /** - * 关闭美化模式 - */ - fun closeBeautificationMode() { - if (FunctionBuildConfig.isDemoMode) { //收车结束美化 - FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = - false //是否强制绘制引导线 - setIgnoreConditionDraw(false) // 同步给乘客屏 - setIPCDemoMode(false) //是否自动启动自驾 - d(SceneConstant.M_BUS + TAG, "美化模式-ignore:置为false") - } + /** + * 关闭美化模式 + */ + fun closeBeautificationMode() { + if (FunctionBuildConfig.isDemoMode) { //收车结束美化 + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = + false //是否强制绘制引导线 + setIgnoreConditionDraw(false) // 同步给乘客屏 + setIPCDemoMode(false) //是否自动启动自驾 + d(SceneConstant.M_BUS + TAG, "美化模式-ignore:置为false") } + } - fun clearStartAutopilotTag() { - firstStartAutopilot = 0 - } - - fun startBeautificationMode() { - FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true - setIgnoreConditionDraw(true) - setIPCDemoMode(true) - } + fun startBeautificationMode() { + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true + setIgnoreConditionDraw(true) + setIPCDemoMode(true) + } - /** - * 延时查询站点信心 - */ - fun queryBusStationDelay() { - handler.sendEmptyMessageDelayed(MSG_QUERY_BUS_STATION, QUERY_BUS_STATION_DELAY) - } + /** + * 延时查询站点信心 + */ + fun queryBusStationDelay() { + handler.sendEmptyMessageDelayed(MSG_QUERY_BUS_STATION, QUERY_BUS_STATION_DELAY) + } - /** - * 在踩刹车、控制方向盘等操作后,会停止自动驾驶,重启自动驾驶的话相当于重新设置自动驾驶目的地 - */ - fun restartAutopilot() { - d(SceneConstant.M_BUS + TAG, "行程日志-重启自动驾驶===$isGoingToNextStation") - //只去启动自动驾驶,不再去上报离站 - startAutopilot(firstStartAutopilot >= 1, -1) - } + /** + * 在踩刹车、控制方向盘等操作后,会停止自动驾驶,重启自动驾驶的话相当于重新设置自动驾驶目的地 + */ + fun restartAutopilot() { + d(SceneConstant.M_BUS + TAG, "司机端-启动自动驾驶===$isGoingToNextStation") + //只去启动自动驾驶 + startAutopilot() + } - fun isRestartAutopilot(): Boolean { - return firstStartAutopilot > 1 - } + fun isGoingToNextStation(): Boolean { + return isGoingToNextStation + } - fun isGoingToNextStation(): Boolean { - return isGoingToNextStation - } - - fun sendWriteOffNumToClient(msg: String?) {} - - -// fun startOrStopOrderLoop(start: Boolean) { -// d(SceneConstant.M_BUS + TAG, "startOrStopOrderLoop() $start") -// if (start) { -// BusModelLoopManager.getInstance().startHeartbeatLoop() -// } else { -// BusModelLoopManager.getInstance().stopHeartbeatLoop() -// } -// } - - // 登出 - fun logout() { - loginService!!.loginOut(mLatitude, mLongitude) - } + // 登出 + fun logout() { + loginService!!.loginOut(mLatitude, mLongitude) + } fun triggerStartServiceEvent(isRestart: Boolean, send: Boolean) { // if (stationList == null || backgroundCurrentStationIndex >= stationList.size - 1) { @@ -460,7 +457,7 @@ class DriverM1Model { // ) } - fun triggerUnableStartAPReasonEvent() { + fun triggerUnableStartAPReasonEvent() { // if (stationList == null || backgroundCurrentStationIndex >= stationList.size - 1) { // return // } @@ -470,32 +467,32 @@ class DriverM1Model { // currentStation.getName(), nextStation.getName(), currentLineId, // OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason // ) - } + } - fun getCurrentStationIndex(): Int { - return backgroundCurrentStationIndex - } + fun getCurrentStationIndex(): Int { + return backgroundCurrentStationIndex + } - /** - * 将业务订单信息保存,鹰眼可取用 - */ - fun updateAutopilotControlParameters() { - // TODO: 业务信息保存 - val parameters = initAutopilotControlParameters(-1) - if (null == parameters) { - e(SceneConstant.M_BUS + TAG, "AutopilotControlParameters is empty.") - return - } - d(SceneConstant.M_BUS + TAG, "AutopilotControlParameters is update.") - CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(parameters) + /** + * 将业务订单信息保存,鹰眼可取用 + */ + fun updateAutopilotControlParameters() { + // TODO: 业务信息保存 + val parameters = initAutopilotControlParameters() + if (null == parameters) { + d(SceneConstant.M_CHARTER_D + TAG, "AutopilotControlParameters is empty.") + return } + d(SceneConstant.M_CHARTER_D + TAG, "AutopilotControlParameters is update.") + CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(parameters) + } - fun clearAutopilotControlParameters() { - d(SceneConstant.M_BUS + TAG, "AutopilotControlParameters is clear.") - CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(null) - } + fun clearAutopilotControlParameters() { + d(SceneConstant.M_CHARTER_D + TAG, "AutopilotControlParameters is clear.") + CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(null) + } - fun initAutopilotControlParameters(leaveIndex: Int): AutopilotControlParameters? { + fun initAutopilotControlParameters(): AutopilotControlParameters? { // var currentStation: BusStationBean? = null // var nextStation: BusStationBean? = null // if (leaveIndex < 0) { @@ -513,7 +510,7 @@ class DriverM1Model { // currentStation = stationList[leaveIndex] // nextStation = stationList[leaveIndex + 1] // } - var parameters = AutopilotControlParameters() + var parameters = AutopilotControlParameters() // parameters.routeID = busRoutesResult.getLineId() // parameters.routeName = busRoutesResult.getName() // parameters.startName = PinYinUtil.getPinYinHeadChar(currentStation.getName()) @@ -532,6 +529,134 @@ class DriverM1Model { // busRoutesResult.contrailSaveTimeDPQP // ) // } - return parameters + return parameters + } + + fun startQueryCurrentOrder(){ + DriverM1LooperManager.startQueryDriverLineLoop() + } + + fun stopQueryCurrentOrder(){ + DriverM1LooperManager.stopQueryDriverLineLoop() + } + + /** + * 司机端发送消息给乘客屏 + */ + fun sendCommitMsgToClient(isConfirmed: Boolean) { + if (currentChangeDestMsg !== null) { + currentChangeDestMsg?.isConfirmed = isConfirmed + sendMsgToClient(currentChangeDestMsg) } + } + + private fun sendMsgToClient(msg: BaseDPMsg?){ + sendMsgToAllClients( + TelematicConstant.BUSINESS_STRING, + GsonUtils.toJson(msg).toByteArray() + ) + } + + fun driverEndLease() { + DriverM1ServiceManager.driverEndLease(mContext,object : OchCommonServiceCallback{ + override fun onSuccess(data: BaseData?) { + if (data != null && data.code == 0){ + mOrderCallback?.updateReturnCarStatus(true) + } + } + + override fun onFail(code: Int, msg: String?) { + ToastUtilsOch.toastRequestError(mContext,msg) + } + + }) + } + + fun queryCurrentServiceStatus() { + DriverM1ServiceManager.queryCurrentServiceStatus(mContext + ,object: OchCommonServiceCallback{ + override fun onSuccess(data: QueryBusinessStatusResponse?) { + if (data == null || data.code != 0){ + return + } + if (data.data.businessStatus == 2){ + if (TextUtils.isEmpty(data.data.orderNo)){//还未换车,显示还车状态 + mOrderCallback?.updateReturnCarStatus(false) + startOrStopCheckCountDown(false) + }else{ // 去查询订单 + mOrderCallback?.updateReturnCarStatus(true) + queryCurrentOrder() + } + }else{ + startOrStopCheckCountDown(false) + } + } + + override fun onFail(code: Int, msg: String?) { + ToastUtilsOch.toastRequestError(mContext,msg) + } + }) + } + + fun queryCurrentOrder(){ + DriverM1ServiceManager.queryCurrentOrder(mContext + ,object: OchCommonServiceCallback{ + override fun onSuccess(data: QueryCurrentOrderResponse?) { + if (data == null || data.code == 0 || mCurrentOrder === data.data) return + mCurrentOrder = data.data + mOrderCallback?.updateOrderUI(data.data) + // 倒计时校验开始 + startOrStopCheckCountDown(true) + } + + override fun onFail(code: Int, msg: String?) { + TODO("Not yet implemented") + } + }) + } + + private fun startOrStopCheckCountDown(start: Boolean) { + if (start){ + DriverM1LooperManager.starCountDownLoop() + }else{ + DriverM1LooperManager.stopCountDownLoop() + } + } + + fun checkOrderCountDown() { + DriverM1ServiceManager.checkOrderCountDown(mContext, + object: OchCommonServiceCallback{ + override fun onSuccess(data: CheckOrderCountDownResponse?) { + if (data?.data == null || data.code != 0){ + return + } + val gap = data.data.endTime - data.data.currentTime + if (gap >= 0){ + mOrderCallback?.updateOverCountDown((gap/1000/60).toInt()) + } + } + + override fun onFail(code: Int, msg: String?) { + TODO("Not yet implemented") + } + + }) + } + + fun changeDest(){ + if (currentChangeDestMsg == null) return + DriverM1ServiceManager.changeDest(mContext,currentChangeDestMsg!!.lineId, + currentChangeDestMsg!!.destSiteId, + object : OchCommonServiceCallback{ + override fun onSuccess(data: BaseData?) { + if (data != null && data.code == 0){ + sendCommitMsgToClient(true) + } + } + + override fun onFail(code: Int, msg: String?) { + TODO("Not yet implemented") + } + }) + } } \ No newline at end of file diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/net/DriverM1ServiceManager.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/net/DriverM1ServiceManager.kt new file mode 100644 index 0000000000..a13db84d9f --- /dev/null +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/net/DriverM1ServiceManager.kt @@ -0,0 +1,81 @@ +package com.magic.mogo.och.charter.net + +import android.content.Context +import com.magic.mogo.och.charter.bean.CheckOrderCountDownResponse +import com.magic.mogo.och.charter.bean.QueryBusinessStatusResponse +import com.magic.mogo.och.charter.bean.QueryCurrentOrderResponse +import com.magic.mogo.och.charter.bean.RequestChangeDest +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.och.common.module.biz.constant.OchCommonConst +import com.mogo.eagle.core.data.BaseData +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback +import com.mogo.och.common.module.biz.network.OchCommonSubscribeImpl +import com.mogo.och.common.module.biz.network.interceptor.transformTry + +/** + * Created by pangfan on 2021/8/19 + */ +object DriverM1ServiceManager { + + private val mDriverM1ServiceApi: IDriverM1Service = + MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create( + IDriverM1Service::class.java + ) + + /** + * 司机还车 + * @param context + * @param callback + */ + @JvmStatic + fun driverEndLease( + context: Context?, + callback: OchCommonServiceCallback? + ) { + mDriverM1ServiceApi.driverEndLease( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + MoGoAiCloudClientConfig.getInstance().sn + )?.transformTry() + ?.subscribe(OchCommonSubscribeImpl(context!!, callback, "driverEndLease")) + } + + fun queryCurrentServiceStatus(context: Context?, + callback: OchCommonServiceCallback?){ + mDriverM1ServiceApi.queryBusinessStatus( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + MoGoAiCloudClientConfig.getInstance().sn + )?.transformTry() + ?.subscribe(OchCommonSubscribeImpl(context!!, callback, "queryCurrentServiceStatus")) + } + + fun queryCurrentOrder(context: Context?, + callback: OchCommonServiceCallback?){ + mDriverM1ServiceApi.queryCurrentOrder(MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + MoGoAiCloudClientConfig.getInstance().sn + )?.transformTry() + ?.subscribe(OchCommonSubscribeImpl(context!!, callback, "queryCurrentOrder")) + } + + fun checkOrderCountDown(context: Context?, + callback: OchCommonServiceCallback?){ + mDriverM1ServiceApi.checkOrderCountDown(MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + MoGoAiCloudClientConfig.getInstance().sn + )?.transformTry() + ?.subscribe(OchCommonSubscribeImpl(context!!, callback, "checkOrderCountDown")) + } + + fun changeDest(context: Context?,lineId: Int,siteId: Int, + callback: OchCommonServiceCallback?){ + mDriverM1ServiceApi.changeDest(MoGoAiCloudClientConfig.getInstance().serviceAppId, + MoGoAiCloudClientConfig.getInstance().token, + RequestChangeDest(MoGoAiCloudClientConfig.getInstance().sn,lineId,siteId) + )?.transformTry() + ?.subscribe(OchCommonSubscribeImpl(context!!, callback, "changeDest")) + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/net/IDriverM1Service.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/net/IDriverM1Service.kt index 45e87e0328..22a1293aca 100644 --- a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/net/IDriverM1Service.kt +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/net/IDriverM1Service.kt @@ -1,10 +1,55 @@ package com.magic.mogo.och.charter.net + +import com.magic.mogo.och.charter.bean.CheckOrderCountDownResponse +import com.magic.mogo.och.charter.bean.QueryBusinessStatusResponse +import com.magic.mogo.och.charter.bean.QueryCurrentOrderResponse +import com.magic.mogo.och.charter.bean.RequestChangeDest +import com.mogo.eagle.core.data.BaseData +import io.reactivex.Observable +import retrofit2.http.* + /** * @author: wangmingjun * @date: 2023/2/22 */ interface IDriverM1Service { + /** + * 司机还车 + * @param sn + * @return + */ + @Headers("Content-type:application/json;charset=UTF-8") + @GET("/och-rental-cabin/api/flow/v1/driver/endLease") + fun driverEndLease(@Header("appId") appId: String?, @Header("ticket") ticket: String?, + @Query("sn") sn: String?): Observable? + /** + * 查询当前订单信息 + */ + @Headers("Content-type:application/json;charset=UTF-8") + @GET("/och-rental-cabin/api/business/v1/driver/order") + fun queryCurrentOrder(@Header("appId") appId: String?, @Header("ticket") ticket: String?, + @Query("sn") sn: String?): Observable? + /** + * 查询车辆服务状态 + */ + @Headers("Content-type:application/json;charset=UTF-8") + @GET("/och-rental-cabin/api/business/v1/driver/businessStatus") + fun queryBusinessStatus(@Header("appId") appId: String?, @Header("ticket") ticket: String?, + @Query("sn") sn: String?): Observable? + + /** + * 确认更换目的地成功 + */ + @Headers("Content-Type:application/json;charset=UTF-8") + @POST("/och-rental-cabin/api/flow/v1/driver/changeDest") + fun changeDest(@Header("appId") appId: String?, @Header("ticket") ticket: String? + ,@Body request: RequestChangeDest): Observable? + + @Headers("Content-type:application/json;charset=UTF-8") + @GET("/och-rental-cabin/api/business/v1/driver/queryBusinessTime") + fun checkOrderCountDown(@Header("appId") appId: String?, @Header("ticket") ticket: String?, + @Query("sn") sn: String?): Observable? } \ No newline at end of file diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt index 55f924e7c0..57ee0946ec 100644 --- a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt @@ -1,8 +1,16 @@ package com.magic.mogo.och.charter.presenter +import androidx.lifecycle.LifecycleOwner +import com.magic.mogo.och.charter.bean.QueryCurrentOrderResponse +import com.magic.mogo.och.charter.callback.ChangeDestCallback +import com.magic.mogo.och.charter.callback.DriverM1OrderCallback import com.magic.mogo.och.charter.fragment.DriverM1Fragment import com.magic.mogo.och.charter.model.DriverM1Model import com.mogo.commons.mvp.Presenter +import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean @@ -14,25 +22,113 @@ import com.mogo.och.common.module.biz.constant.LoginStatusManager.isLogin * @date: 2023/2/22 */ class DriverM1Presenter(view: DriverM1Fragment?) : - Presenter(view),ILoginCallback{ + Presenter(view),ILoginCallback, DriverM1OrderCallback, ChangeDestCallback, + IMoGoAutopilotStatusListener { private val TAG = DriverM1Presenter::class.java.name + private var mCurrentAutopilotStatus : Int = -1 + + init { + DriverM1Model.get().init() + registerListener() + } + + private fun registerListener() { + //2021.11.1 鹰眼架构整合,由IMoGoAutopilotStatusListener逐步替代IMogoAdasOCHCallback接口 + CallerAutoPilotStatusListenerManager.addListener(TAG, this) + DriverM1Model.get().setDriverM1OrderCallback(this) + DriverM1Model.get().setChangeDestCallback(this) + } + + private fun releaseListener() { + DriverM1Model.get().setDriverM1OrderCallback(null) + DriverM1Model.get().setChangeDestCallback(null) + } + + override fun onDestroy(owner: LifecycleOwner) { + super.onDestroy(owner) + releaseListener() + DriverM1Model.get().release() + } override fun loginSuccess(data: DriverStatusQueryRespBean?) { d(SceneConstant.M_BUS + TAG, " loginStatus =" + isLogin()) if (isLogin()) { - // todo 已经登陆 + // 查询服务状态 + DriverM1Model.get().queryCurrentServiceStatus() } else { - // todo 未登陆 + DriverM1Model.get().stopQueryCurrentOrder() } } override fun loginFail(isLogin: Boolean) { - //todo 登陆失败 + DriverM1Model.get().stopQueryCurrentOrder() } // 登出 fun logout() { - DriverM1Model.INSTANCE.logout() + DriverM1Model.get().logout() + } + + fun restartAutopilot() { + // todo 启动自驾必须有订单路线 + if (DriverM1Model.get().isGoingToNextStation()) { + DriverM1Model.get().restartAutopilot() + } + } + + fun driverEndLease() { + DriverM1Model.get().driverEndLease() + } + + override fun updateOrderUI(orderStatus: QueryCurrentOrderResponse.Result) { + mView?.updateOrderUI(orderStatus) + } + + override fun updateOverCountDown(minutes: Int) { + mView?.updateCountDown(minutes) + } + + override fun updateReturnCarStatus(returnSuccess: Boolean) { + mView?.updateReturnCarStatus(returnSuccess) + } + + override fun showCommitDialog(title: String,content: String) { + mView?.showCommitDialog(title,content) + } + + fun sendCommitMsgToClient(isAffirm: Boolean){ + DriverM1Model.get().sendCommitMsgToClient(isAffirm) + } + + fun changeDest(){ + DriverM1Model.get().changeDest() + } + + override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { + val status = autoPilotStatusInfo.state + if (mCurrentAutopilotStatus == status) return + + if (FunctionBuildConfig.isDemoMode){ //todo 此处要加上判断订单状态 美化模式生效 + mView?.onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) + }else{ + mView?.onAutopilotStatusChanged(status) + } + +// when(status){ +// +// IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE -> { // +// +// } +// IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING ->{ +// +// } +// IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE ->{ +// +// } +// IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING ->{ +// +// } +// } } } diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/view/SlidePanelView.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/view/SlidePanelView.kt index 41b256ae46..651e857ef5 100644 --- a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/view/SlidePanelView.kt +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/view/SlidePanelView.kt @@ -1,4 +1,4 @@ -package com.charter.driverm1.view +package com.magic.mogo.och.charter.view import android.animation.ObjectAnimator import android.animation.ValueAnimator @@ -8,6 +8,7 @@ import android.util.AttributeSet import android.view.MotionEvent import android.view.View import android.view.animation.DecelerateInterpolator +import com.magic.mogo.och.charter.R import com.mogo.commons.AbsMogoApplication import me.jessyan.autosize.AutoSizeConfig import me.jessyan.autosize.utils.AutoSizeUtils @@ -62,7 +63,7 @@ class SlidePanelView @JvmOverloads constructor( } private fun init() { - bgRectF = RectF(0, 0, 0, 0) + bgRectF = RectF(0F, 0F, 0F, 0F) bgPaint.color = Color.parseColor("#CC0F1325") bgPaint.style = Paint.Style.FILL textPaint.style = Paint.Style.FILL @@ -70,22 +71,23 @@ class SlidePanelView @JvmOverloads constructor( textPaint.textAlign = Paint.Align.LEFT textGradient = LinearGradient( -GRADIENT_OFFSET, - 0, - 0, - 0, + 0f, + 0f, + 0f, intArrayOf(0x33ffffff, -0x1, 0x33ffffff), null, Shader.TileMode.CLAMP ) + textGradient!!.setLocalMatrix(gradientMatrix) textPaint.shader = textGradient textPaint.getFontMetrics(blockTextMetrics) val size = AutoSizeUtils.dp2px(context, 120f) val opts = BitmapFactory.Options() opts.inDensity = AutoSizeConfig.getInstance().initDensity.toInt() - bmBlock = BitmapFactory.decodeResource(resources, R.drawable.bus_base_slide_block, opts) - bmBlock = Bitmap.createScaledBitmap(bmBlock, size, size, true) - blockWidth = bmBlock.getWidth() + bmBlock = BitmapFactory.decodeResource(resources, R.drawable.bus_base_slide_block, opts) as Bitmap + bmBlock = Bitmap.createScaledBitmap(bmBlock!!, size, size, true) as Bitmap + blockWidth = bmBlock!!.width } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { @@ -233,7 +235,7 @@ class SlidePanelView @JvmOverloads constructor( private var SHORT_TEXT_MARGIN_LEFT = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(), 60f) private var SHORT_TEXT_MARGIN_RIGHT = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(), 70f) private const val STRING_SLIDE_TO_RIGHT = "向右滑动" - private const val GRADIENT_OFFSET = 200 + private const val GRADIENT_OFFSET = 200f } init { diff --git a/OCH/mogo-och-charter/src/driverm1/res/layout/fragment_driver_m1.xml b/OCH/mogo-och-charter/src/driverm1/res/layout/fragment_driver_m1.xml index 2b7f8c45c3..c55fe1aeb0 100644 --- a/OCH/mogo-och-charter/src/driverm1/res/layout/fragment_driver_m1.xml +++ b/OCH/mogo-och-charter/src/driverm1/res/layout/fragment_driver_m1.xml @@ -5,7 +5,9 @@ android:id="@+id/module_och_bus_order_status_stationInfo" android:layout_width="@dimen/module_mogo_och_autopilot_order_bg_width" android:layout_height="wrap_content" + android:minHeight="@dimen/dp_754" android:background="@drawable/bus_line_panel_bg" + android:paddingBottom="@dimen/dp_90" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent"> @@ -138,6 +140,7 @@ app:layout_constraintRight_toLeftOf="@+id/driverm1StationName2Tv" app:layout_constraintTop_toTopOf="@+id/driverm1StationName2Tv" app:layout_constraintBottom_toBottomOf="@+id/driverm1StationName2Tv"/> + + + + + + + driverm1StationName2Tv,driverm1nextCircleIv,driverm1CircleIvBg,driverm1ArrowBg + ,line3,during_time,passenger_phone"/> + \ No newline at end of file diff --git a/OCH/mogo-och-charter/src/driverm1/res/values/attrs.xml b/OCH/mogo-och-charter/src/driverm1/res/values/attrs.xml new file mode 100644 index 0000000000..396db92f74 --- /dev/null +++ b/OCH/mogo-och-charter/src/driverm1/res/values/attrs.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-charter/src/driverm1/res/values/strings.xml b/OCH/mogo-och-charter/src/driverm1/res/values/strings.xml index 75d31d69a4..173a67f36a 100644 --- a/OCH/mogo-och-charter/src/driverm1/res/values/strings.xml +++ b/OCH/mogo-och-charter/src/driverm1/res/values/strings.xml @@ -1,4 +1,7 @@ - 剩余—分钟 + 剩余%1$s分钟 + 包车时间:%1$s + 乘客信息:%1$s + diff --git a/OCH/mogo-och-charter/src/main/java/com/magic/mogo/och/charter/ICharterOCH.java b/OCH/mogo-och-charter/src/main/java/com/magic/mogo/och/charter/ICharterOCH.java index bd442dc496..2f8ecd62bb 100644 --- a/OCH/mogo-och-charter/src/main/java/com/magic/mogo/och/charter/ICharterOCH.java +++ b/OCH/mogo-och-charter/src/main/java/com/magic/mogo/och/charter/ICharterOCH.java @@ -5,14 +5,13 @@ import androidx.fragment.app.FragmentActivity; import com.mogo.eagle.core.function.api.base.IMoGoFunctionProvider; -public /** * @author congtaowang * @since 2021/1/15 * * 网约车抽象接口 */ -interface ICharterOCH extends IMoGoFunctionProvider { +public interface ICharterOCH extends IMoGoFunctionProvider { /** * 初始化网约车容器 diff --git a/OCH/mogo-och-charter/src/main/java/com/magic/mogo/och/charter/base/CharterBaseFragment.kt b/OCH/mogo-och-charter/src/main/java/com/magic/mogo/och/charter/base/CharterBaseFragment.kt index 73b81690f1..a14e3c85bc 100644 --- a/OCH/mogo-och-charter/src/main/java/com/magic/mogo/och/charter/base/CharterBaseFragment.kt +++ b/OCH/mogo-och-charter/src/main/java/com/magic/mogo/och/charter/base/CharterBaseFragment.kt @@ -11,6 +11,7 @@ import android.widget.* import androidx.constraintlayout.widget.Group import com.magic.mogo.och.charter.R import com.magic.mogo.och.charter.constant.CharterConst +import com.magic.mogo.och.charter.view.SlidePanelView import com.mogo.commons.mvp.IView import com.mogo.commons.mvp.MvpFragment import com.mogo.commons.mvp.Presenter @@ -63,9 +64,7 @@ abstract class CharterBaseFragment?>() : private var mapBizView: MapBizView? = null private var groupTestPanel: Group? = null private var mTrafficDataView: TrafficDataView? = null - // private BusTrafficLightView mTrafficLightView; - - // private BusTrafficLightView mTrafficLightView; + protected var slidePanelView: SlidePanelView? = null //远景和中景的切换 private var mSwitchMapModeImage: ImageView? = null private var mSwitchMapModeLayout: LinearLayout? = null @@ -93,6 +92,9 @@ abstract class CharterBaseFragment?>() : ctvAutopilotStatusTv = findViewById(R.id.bus_autopolot_btn_tv) flStationPanelContainer = findViewById(R.id.module_mogo_och_station_panel_container) + slidePanelView = findViewById(R.id.charter_slide_panel) + slidePanelView?.setOnSlidePanelMoveToEndListener(onSlideToEndListener) + mTrafficDataView = findViewById(R.id.bus_arc) as TrafficDataView? LayoutInflater.from(context).inflate(getStationPanelViewId(), flStationPanelContainer) mSwitchMapModeLayout = findViewById(R.id.bus_switch_model_layout) @@ -155,8 +157,6 @@ abstract class CharterBaseFragment?>() : ) } - // 模拟 自动驾驶网约车回调数据 - findViewById(R.id.btnAutopilotRoute)!!.setOnClickListener { view: View? -> debugArrivedRoute() } mSettingBtn = findViewById(R.id.module_mogo_och_setting_layout) mSettingBtn!!.setOnClickListener { v: View? -> // TODO: 2021/12/9 @@ -212,6 +212,38 @@ abstract class CharterBaseFragment?>() : return super.onCreateView(inflater, container, savedInstanceState) } + private val onSlideToEndListener = object : SlidePanelView.OnSlidePanelMoveToEndListener{ + override fun moveToEnd() { + // 此处做一个代理,处理一下共有情况 + if (getSlidePanelOnEndListener() != null) { + getSlidePanelOnEndListener()?.moveToEnd() + } + } + } + + open fun getSlidePanelOnEndListener(): SlidePanelView.OnSlidePanelMoveToEndListener? { + return null + } + + /** + * 展示滑动按钮 + * + * @param text 指定的文字 + */ + fun showSlidePanel(text: String?) { + requireActivity().runOnUiThread { + slidePanelView?.setText(text!!) + slidePanelView?.visibility = View.VISIBLE + } + } + + /** + * 隐藏滑动按钮 + */ + fun hideSlidePanel() { + requireActivity().runOnUiThread { slidePanelView?.visibility = View.GONE } + } + private fun updateSwitchMapIcon() { val controller = getMapUIController() if (controller != null) { @@ -225,10 +257,6 @@ abstract class CharterBaseFragment?>() : } } - private fun debugArrivedRoute() { -// BDRouteDataTestUtils.converToRouteData() - } - override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) mapBizView!!.onSaveInstanceState(outState) @@ -257,7 +285,7 @@ abstract class CharterBaseFragment?>() : } - open fun playDI() { + fun playDI() { SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(context, R.raw.bus_di) } @@ -266,8 +294,8 @@ abstract class CharterBaseFragment?>() : * * @param autopilotStatus 0:不可用 1:可用状态 2:自动驾驶中 */ - open fun onAutopilotStatusChanged(autopilotStatus: Int) { - activity?.runOnUiThread { + fun onAutopilotStatusChanged(autopilotStatus: Int) { + requireActivity().runOnUiThread { changeAutopilotBtnView( autopilotStatus, isAnimateRunning @@ -275,7 +303,7 @@ abstract class CharterBaseFragment?>() : } } - open fun setAutopilotBtnStatus(autopilotStatus: Int) { + private fun setAutopilotBtnStatus(autopilotStatus: Int) { if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE == autopilotStatus ) { //0不可用 @@ -344,7 +372,7 @@ abstract class CharterBaseFragment?>() : * 展示【自动驾驶】按钮 */ open fun showAutopilotBiz() { - activity?.runOnUiThread { ctvAutopilotStatus!!.visibility = View.VISIBLE } + requireActivity().runOnUiThread { ctvAutopilotStatus!!.visibility = View.VISIBLE } } /** diff --git a/OCH/mogo-och-charter/src/main/java/com/magic/mogo/och/charter/constant/CharterConst.kt b/OCH/mogo-och-charter/src/main/java/com/magic/mogo/och/charter/constant/CharterConst.kt index c75012f070..cc3137bb8f 100644 --- a/OCH/mogo-och-charter/src/main/java/com/magic/mogo/och/charter/constant/CharterConst.kt +++ b/OCH/mogo-och-charter/src/main/java/com/magic/mogo/och/charter/constant/CharterConst.kt @@ -7,7 +7,7 @@ class CharterConst { companion object { // OCH arouter 路由path - const val PATH = "/och/api" + const val PATH = "/driver/api" // 测试用的广播 const val BROADCAST_TEST_BUS_CONTROL_TYPE_EXTRA_KEY = "sceneType" @@ -66,9 +66,9 @@ class CharterConst { const val ARRIVE_AT_END_STATION_DISTANCE = 10 // 轮询 - const val LOOP_PASSENGER_5S = 5 * 1000L - const val LOOP_PASSENGER_2S = 2 * 1000L - const val LOOP_PASSENGER_1S = 1 * 1000L + const val LOOP_5M = 3 * 1000L + const val LOOP_2S = 2 * 1000L + const val LOOP_1S = 1 * 1000L const val LOOP_DELAY_500 = 500L const val DELAY_10S = 10 * 1000L diff --git a/OCH/mogo-och-charter/src/main/res/layout/charter_base_fragment.xml b/OCH/mogo-och-charter/src/main/res/layout/charter_base_fragment.xml index e0b25c915c..9d79f5934a 100644 --- a/OCH/mogo-och-charter/src/main/res/layout/charter_base_fragment.xml +++ b/OCH/mogo-och-charter/src/main/res/layout/charter_base_fragment.xml @@ -366,4 +366,22 @@ app:layout_constraintEnd_toEndOf="parent" /> + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/bean/dpmsg/DPOperateDoorMsg.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/bean/dpmsg/DPOperateDoorMsg.kt new file mode 100644 index 0000000000..20b8443827 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/bean/dpmsg/DPOperateDoorMsg.kt @@ -0,0 +1,9 @@ +package com.mogo.och.common.module.bean.dpmsg + +/** + * @author: wangmingjun + * @date: 2023/2/24 + */ +data class DPOperateDoorMsg( + var open: Boolean = false // true: 开门, false: 关门 +): BaseDPMsg(DPMsgType.TYPE_CHANGE_DEST.type) diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/bean/dpmsg/DPOrderClosedMsg.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/bean/dpmsg/DPOrderClosedMsg.kt new file mode 100644 index 0000000000..1b5e4c5a15 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/bean/dpmsg/DPOrderClosedMsg.kt @@ -0,0 +1,9 @@ +package com.mogo.och.common.module.bean.dpmsg + +/** + * @author: wangmingjun + * @date: 2023/2/24 + */ +data class DPOrderClosedMsg( + var closed: Boolean = true // true: 开门, false: 关门 +): BaseDPMsg(DPMsgType.TYPE_CHANGE_DEST.type) diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/OCHSocketMessageManager.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/OCHSocketMessageManager.kt index 0439ca7842..443ad5469d 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/OCHSocketMessageManager.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/OCHSocketMessageManager.kt @@ -12,8 +12,10 @@ import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager * 统一管理业务长链消息推送 */ object OCHSocketMessageManager { - const val msgMonitorType:Int = 6295553 - const val msgWriteOffPassengerType:Int = 6295554 + public const val msgMonitorType:Int = 6295553 //后台运营消息 + public const val msgWriteOffPassengerType:Int = 6295554 //核销消息 + public const val msgOperateDoorType = 6295554 // 开/关门消息 + public const val msgOrderClosedType = 6295555 //订单结束消息 fun registerSocketMessageListener(msgType:Int, mogoOnMessageListener :IMogoOnMessageListener){ diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/data/DataBaseMsg.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/data/DataBaseMsg.kt new file mode 100644 index 0000000000..813ff0d5b2 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/data/DataBaseMsg.kt @@ -0,0 +1,7 @@ +package com.mogo.och.common.module.biz.common.socketmessage.data + +/** + * @author: wangmingjun + * @date: 2023/2/25 + */ +open class DataBaseMsg (var msgType: Int,var pushTimeStamp: Long = System.currentTimeMillis()) \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/data/OperateDoorMsg.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/data/OperateDoorMsg.kt new file mode 100644 index 0000000000..c5eefb403a --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/data/OperateDoorMsg.kt @@ -0,0 +1,12 @@ +package com.mogo.och.common.module.biz.common.socketmessage.data + +import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager.msgOperateDoorType + +/** + * @author: wangmingjun + * @date: 2023/2/25 + */ +data class OperateDoorMsg( + var orderNo: String, + var message: String +):DataBaseMsg(msgOperateDoorType) //{"orderNo":"","message":""} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/data/OrderCloseMsg.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/data/OrderCloseMsg.kt new file mode 100644 index 0000000000..09635d4b6a --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/data/OrderCloseMsg.kt @@ -0,0 +1,12 @@ +package com.mogo.och.common.module.biz.common.socketmessage.data + +import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager.msgOrderClosedType + +/** + * @author: wangmingjun + * @date: 2023/2/25 + */ +data class OrderCloseMsg( + var orderNo: String, + var message: String +):DataBaseMsg(msgOrderClosedType) //{"orderNo":"","message":""} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/data/SystemMsg.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/data/SystemMsg.kt new file mode 100644 index 0000000000..0f33831838 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/common/socketmessage/data/SystemMsg.kt @@ -0,0 +1,13 @@ +package com.mogo.och.common.module.biz.common.socketmessage.data + +import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager.msgMonitorType + +/** + * @author: wangmingjun + * @date: 2023/2/25 + */ +data class SystemMsg( + var context: String, + var screenList: MutableList +):DataBaseMsg(msgMonitorType) // {"context":"","screenList":[]} 1:司机屏 2:乘客屏 + diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt index cac280afa6..ce48f0d692 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt @@ -60,7 +60,6 @@ class TaxiLoginDialogFragment : super.onCreate(savedInstanceState) setStyle(STYLE_NO_TITLE, R.style.DialogFullScreen) //dialog全屏 } - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -99,7 +98,8 @@ class TaxiLoginDialogFragment : //出租车司机 acivLoginBg.setImageResource(R.drawable.taxi_ic_login_bg) } else if ((AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) - || AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)) && + || AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode) + || AppIdentityModeUtils.isCharter(FunctionBuildConfig.appIdentityMode)) && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { //小巴车司机 acivLoginBg.setImageResource(R.drawable.bus_ic_login_bg) diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CallerLoggerUtils.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CallerLoggerUtils.kt index 14e2610598..d004bcd8bf 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CallerLoggerUtils.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CallerLoggerUtils.kt @@ -4,6 +4,7 @@ import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_CHARTER_D import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_SWEEPER import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_TAXI import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_TAXI_P @@ -13,7 +14,7 @@ object CallerLoggerUtils { AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ //出租车司机 M_TAXI - }else if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)&& + }else if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ //小巴车司机 M_BUS @@ -28,6 +29,10 @@ object CallerLoggerUtils { }else if (AppIdentityModeUtils.isSweeper(FunctionBuildConfig.appIdentityMode)){ //清扫车 M_SWEEPER + }else if (AppIdentityModeUtils.isCharter(FunctionBuildConfig.appIdentityMode) && + AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ + //M1司机端 + M_CHARTER_D } else{ "" diff --git a/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt b/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt index f6921d05cc..588ffec05c 100644 --- a/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt +++ b/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt @@ -89,8 +89,11 @@ object ConfigStartUp { HdMapBuildConfig.currentCarVrIconRes = R.raw.huanwei } else if (AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)){ HdMapBuildConfig.currentCarVrIconRes = R.raw.xiaobache + } else if (AppIdentityModeUtils.isCharter(FunctionBuildConfig.appIdentityMode)){ + HdMapBuildConfig.currentCarVrIconRes = R.raw.xiaobache } + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { //是否显示 限速UI diff --git a/core/mogo-core-res/src/main/res/drawable-xhdpi/operation_order_icon.png b/core/mogo-core-res/src/main/res/drawable-xhdpi/operation_order_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..d1363d1a969248b3f1b78f11041797e4a84827bd GIT binary patch literal 15347 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ΠAcg(qw#n7k0|3ahS1Oq{? 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 R4NL$4002ovPDHLkV1jbBZ}R{E literal 0 HcmV?d00001 diff --git a/core/mogo-core-res/src/main/res/drawable-xhdpi/pnc_icon.png b/core/mogo-core-res/src/main/res/drawable-xhdpi/pnc_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..1ba1c633ec0af4d0ede746def2f5dce659572f6f GIT binary patch literal 16391 zcmV+iK={9jP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91c%TCS1ONa40RR91cmMzZ00`n$?f?KkaY;l$RCod1y$Q5sS9#yL?|tu8 zX{gdrnkdZzDMAQ=FtH6LBEm_m#F$}WgfT|gP8?(7q`R{^Y17zkWIIk+D~_Gz<+X^t zFisd^7Q_oDalnRVo?@^X?8dZYBqSkKX{stDsw7pt;okoL{@?fQbMC8>(1=9#t8@0= z-|+vYz0W;&tV#Qypnc=z?SzfhcHzdnT{vm&!uh;ips;q#=acPiKHuIZZCjhQ?V@d) zPui-+`z3dvO(y##yT7%$j`sD*tX(&ov}>nJ?Yh&xuiZSkT9V)4O>ur_wfWU;dEYhd zZ*Hu&?^khNq~cwo{xqVP=uczSYu@Mx&hz3yg^{gz11-`qhcRh~CiC`HiGFrEZy#-2 zwteg=A3AVn>3*m5-w_4A^M~36O7=^Ybrp4fnRlkD;sQ|%MN!3y+En^o;?8r)EjXf6 z@B}D~;37RN7!W6u$(LpSqf3*e51;loF8$NV?_RT3mY%FVu{>WEl z)jn?_X^KlMP8#T>Rp} zwBTm?fMto4m;J-^!LuL2!G2HPyj>^ocdl$b_HCzq7tkE;N7Jc<#)WMQCFEUGO9bZE$Uob-~ZE5Wdk60_{2zCkwO z+Q*rQlXicbOy4%0%>K<8pKP~S_6a^cp#`4*bX&RWw)Q&Z;ElRpJ>NNWo}xBAnVBRP zR#~iK^xRqT2y_XAPDpOn_q+$8Jh#fChNeaVhJT|{$>&n)*oci%Y z*PHSLou04)?|s?QD`&Hff2+&!*%dnpqYb+#=A0v$Lk`E6$}W}qhZUiAp@B*|3e{Em z0DkUXjd~H&fx~ zU^95}JK|Bod(wtPSJHcOkjcVD5ThNuNgtifi>4Q@9H<>CT|?W@2oqp+>xwm=@;HMdgPLznUeBS#7LwX!vzCQrfLJi(aI6nPFGT9w zdg*q4%8m7pgln1*9zdUm4Lh)jUlF_Jj;npLt+XFK`!j8K@g9%~eVew#W;#ILCQ4c1Q*g%3oq+GfS(6}a=@2O71)g=7D4vmFI zv%ebqk_$}&rE3ApL0Qxf2Mk~yIMd1GuE~7oC`*V2x7~|gg()Jty|Do=X z&jY%4VTSDmj^V|`gcDAv88MHuq)DXcwLvyxmfU#3ls!D?^lmsYrDzh^DOY-BZ$V%3 zK_6oVR+kHBGQh-TN!Z4sz8;t7^Xc?opYvz4Uu3

SNUt+hf}HyuAG#J;uCW!RVcw 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 VRortXp)mje002ovPDHLkV1lwzbz}el literal 0 HcmV?d00001 diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/scene/SceneConstant.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/scene/SceneConstant.kt index aaf68dc862..daa67e941d 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/scene/SceneConstant.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/scene/SceneConstant.kt @@ -41,5 +41,7 @@ class SceneConstant { //清扫车 const val M_SWEEPER = "M_SWEEPER-" + //M1司机端 + const val M_CHARTER_D = "M_CHARTER_D-" } } \ No newline at end of file diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/screen/ScreenHelper.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/screen/ScreenHelper.java index d9d9338019..49ca031de5 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/screen/ScreenHelper.java +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/screen/ScreenHelper.java @@ -21,7 +21,8 @@ public class ScreenHelper { int baseHeight = 1600; boolean baseOnWidth = true; - if (AppIdentityModeUtils.isM1(FunctionBuildConfig.appIdentityMode)) { + if (AppIdentityModeUtils.isM1(FunctionBuildConfig.appIdentityMode) && + AppIdentityModeUtils.isPassenger((FunctionBuildConfig.appIdentityMode))) { baseWidth = 1920; baseHeight = 1080; } else if (AppIdentityModeUtils.isM2(FunctionBuildConfig.appIdentityMode)) { From 9f576a66bb189c296bb028984a1e49a07c93c5ec Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Sat, 25 Feb 2023 20:24:08 +0800 Subject: [PATCH 2/4] =?UTF-8?q?[jinlv=20bus]=20=E5=A2=9E=E5=8A=A0=E4=B8=AD?= =?UTF-8?q?=E8=8B=B1=E9=9F=A9=E6=92=AD=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/och/bus/model/OrderModel.java | 70 +++++++++++++++++-- .../src/main/res/values/strings.xml | 8 +++ .../och/common/module/voice/VoiceNotice.kt | 7 ++ 3 files changed, 79 insertions(+), 6 deletions(-) diff --git a/OCH/mogo-och-bus/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java b/OCH/mogo-och-bus/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java index f9dd311b48..c137eac508 100644 --- a/OCH/mogo-och-bus/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java +++ b/OCH/mogo-och-bus/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java @@ -20,6 +20,7 @@ import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.module.status.IMogoStatusChangedListener; import com.mogo.commons.module.status.MogoStatusManager; import com.mogo.commons.module.status.StatusDescriptor; +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.config.FunctionBuildConfig; @@ -67,6 +68,8 @@ import com.mogo.och.common.module.utils.NumberFormatUtil; import com.mogo.och.common.module.utils.PinYinUtil; import com.mogo.och.common.module.utils.ToastUtilsOch; import com.mogo.och.common.module.voice.VoiceNotice; +import com.mogo.tts.base.LangTtsEntity; +import com.mogo.tts.base.LanguageType; import org.jetbrains.annotations.NotNull; @@ -714,9 +717,28 @@ public class OrderModel { , isLastStop); } - VoiceNotice.showNotice(String.format(mContext +// VoiceNotice.showNotice(String.format(mContext +// .getString(R.string.bus_arrived_station_tip), +// arriveStation)); + + ttsArrivedStation(arriveStation); + } + + private void ttsArrivedStation(String arriveStation){ + List list = new ArrayList<>(); + LangTtsEntity chineseTTS = new LangTtsEntity(String.format(mContext .getString(R.string.bus_arrived_station_tip), - arriveStation)); + arriveStation), LanguageType.CHINESE); + LangTtsEntity engTTS = new LangTtsEntity(String.format(mContext + .getString(R.string.bus_arrived_station_english_tip), + arriveStation), LanguageType.ENGLISH); + LangTtsEntity koreanTTS = new LangTtsEntity(String.format(mContext + .getString(R.string.bus_arrived_station_korean_tip), + arriveStation), LanguageType.KOREAN); + list.add(chineseTTS); + list.add(engTTS); + list.add(koreanTTS); + VoiceNotice.showNotice(list, AIAssist.LEVEL0); } /** @@ -768,9 +790,30 @@ public class OrderModel { //车站10s后播报 private void leaveTTSTips(String nextStation) { - VoiceNotice.showNotice(String.format(mContext - .getString(R.string.bus_leave_station_tip), - nextStation), DELAY_10S); + + UiThreadHandler.postDelayed(new Runnable() { + @Override + public void run() { + List list = new ArrayList<>(); + LangTtsEntity chineseTTS = new LangTtsEntity(String.format(mContext + .getString(R.string.bus_leave_station_tip), + nextStation), LanguageType.CHINESE); + LangTtsEntity engTTS = new LangTtsEntity(String.format(mContext + .getString(R.string.bus_leave_station_english_tip), + nextStation), LanguageType.ENGLISH); + LangTtsEntity koreanTTS = new LangTtsEntity(String.format(mContext + .getString(R.string.bus_leave_station_korean_tip), + nextStation), LanguageType.KOREAN); + list.add(chineseTTS); + list.add(engTTS); + list.add(koreanTTS); + VoiceNotice.showNotice(list, AIAssist.LEVEL0); + } + },DELAY_10S); + +// VoiceNotice.showNotice(String.format(mContext +// .getString(R.string.bus_leave_station_tip), +// nextStation), DELAY_10S); } /** @@ -1014,7 +1057,7 @@ public class OrderModel { queryBusRoutes();// 重新获取任务 removeTipRunnables(); // startOrStopQueryPassengerWriteOff(false); - VoiceNotice.showNotice(mContext.getString(R.string.bus_end_task_tip)); + ttsEndTask(); } } @@ -1038,6 +1081,21 @@ public class OrderModel { }); } + private void ttsEndTask() { +// VoiceNotice.showNotice(mContext.getString(R.string.bus_end_task_tip)); + List list = new ArrayList<>(); + LangTtsEntity chineseTTS = new LangTtsEntity(mContext + .getString(R.string.bus_end_task_tip), LanguageType.CHINESE); + LangTtsEntity engTTS = new LangTtsEntity(mContext + .getString(R.string.bus_end_task_english_tip), LanguageType.ENGLISH); + LangTtsEntity koreanTTS = new LangTtsEntity(mContext + .getString(R.string.bus_end_task_korean_tip), LanguageType.KOREAN); + list.add(chineseTTS); + list.add(engTTS); + list.add(koreanTTS); + VoiceNotice.showNotice(list, AIAssist.LEVEL0); + } + /** * 到站 * diff --git a/OCH/mogo-och-bus/src/main/res/values/strings.xml b/OCH/mogo-och-bus/src/main/res/values/strings.xml index 737487ec70..7f0c9a32be 100644 --- a/OCH/mogo-och-bus/src/main/res/values/strings.xml +++ b/OCH/mogo-och-bus/src/main/res/values/strings.xml @@ -43,8 +43,16 @@ 已到达%1$s,带好随身物品,下车请注意安全。 + We are arriving at %1$s ,get off with your belongings + %1$s 역에 도착했습니다 , 소지품 챙겨서 내리세요 + 车辆起步,请扶稳坐好,前方到站是%1$s,请下车的乘客做好准备。 + The next station is %1$s ,please get ready for your arrival + 전방에서 역에 도착하는 %1$s ,차에서 내리는 승객은 준비하세요 + 感谢您体验\'蘑菇车联\'自动驾驶小巴车,我们下次再见。 + Thank you for experiencing the self-driving minibus. See you next time + 자율주행 버스를 체험해 주셔서 감사합니다. 다음에 또 뵙겠습니다 距离发车时间还有%1$s分钟 diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/voice/VoiceNotice.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/voice/VoiceNotice.kt index 43ef0ffb30..7aeecde59e 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/voice/VoiceNotice.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/voice/VoiceNotice.kt @@ -3,6 +3,8 @@ package com.mogo.och.common.module.voice import com.mogo.commons.AbsMogoApplication import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.tts.base.LangTtsEntity +import com.mogo.tts.base.MultiLangTtsEntity object VoiceNotice { @JvmStatic @@ -46,4 +48,9 @@ object VoiceNotice { AIAssist.getInstance(AbsMogoApplication.getApp()).stopTts() } } + + @JvmStatic + fun showNotice(listTTS: MutableList, level: Int) { + AIAssist.getInstance(AbsMogoApplication.getApp()) + .speakMultiLangTTSWithLevel(MultiLangTtsEntity(listTTS), level,null) } } \ No newline at end of file From c5ddb6449611fba5b7619ecac5c0729dad6b3cac Mon Sep 17 00:00:00 2001 From: yangyakun Date: Sun, 26 Feb 2023 18:58:12 +0800 Subject: [PATCH 3/4] =?UTF-8?q?[build=20=E4=BF=AE=E6=94=B9]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 ++ app/urlConfig.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 4e9764e384..b72f804cb0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -471,6 +471,8 @@ Object readFileToJson(env){ def variantName() { if(gradle.startParameter.taskNames.size()>0) { def taskName = gradle.startParameter.taskNames[0] + taskName = taskName.replace("Debug","") + taskName = taskName.replace("Release","") if (taskName.endsWith("Qa")) { return "qa" } else if (taskName.endsWith("Online")) { diff --git a/app/urlConfig.json b/app/urlConfig.json index 75cc1b7ca8..ee3e7c4ede 100644 --- a/app/urlConfig.json +++ b/app/urlConfig.json @@ -8,7 +8,7 @@ "socket_tech_url": "" }, "online": { - "och_url": "http://tech-dev.zhidaohulian.com", + "och_url": "http://tech.zhidaohulian.com", "shuttle_url": "https://och-driver.zhidaozhixing.com", "passport_url": "", "socket_base_url": "", From 815c8eba3a9b115e49e2a67af8e07a832eb345ed Mon Sep 17 00:00:00 2001 From: yangyakun Date: Mon, 27 Feb 2023 07:31:41 +0800 Subject: [PATCH 4/4] =?UTF-8?q?[=E9=A1=B5=E9=9D=A2=E8=B0=83=E6=95=B4]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bus/passenger/model/OrderStatusEnum.kt | 28 ++++ .../ui/adapter/OrderLineItemAdapter.kt | 61 ++++++++ .../ui/adapter/OrderSiteItemAdapter.kt | 88 ++++++++++++ .../och/bus/passenger/ui/view/LineSiteView.kt | 130 +++++++++++++++++- .../bus/passenger/view/BottomDecoration.java | 43 ++++++ .../view/RecyclerViewCornerRadius.java | 70 ++++++++++ .../res/drawable-nodpi/m1_order_end_car.png | Bin 0 -> 71498 bytes .../drawable-nodpi/m1_order_site_check.png | Bin 0 -> 1758 bytes .../drawable-nodpi/m1_order_site_checked.png | Bin 0 -> 2743 bytes .../drawable/m1_order_line_checked_shape.xml | 5 + .../m1/res/drawable/m1_order_line_shape.xml | 11 ++ .../src/m1/res/layout/m1_order_end.xml | 2 +- .../src/m1/res/layout/m1_order_fragment.xml | 2 +- .../src/m1/res/layout/m1_order_line_item.xml | 11 ++ .../src/m1/res/layout/m1_order_lineside.xml | 41 +++++- .../src/m1/res/layout/m1_order_site_item.xml | 24 ++++ .../m1/res/layout/m1_order_wait_define.xml | 32 ----- .../src/m1/res/values/color.xml | 8 ++ 18 files changed, 520 insertions(+), 36 deletions(-) create mode 100644 OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/model/OrderStatusEnum.kt create mode 100644 OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/adapter/OrderLineItemAdapter.kt create mode 100644 OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/adapter/OrderSiteItemAdapter.kt create mode 100644 OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/view/BottomDecoration.java create mode 100644 OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/view/RecyclerViewCornerRadius.java create mode 100644 OCH/mogo-och-charter-passenger/src/m1/res/drawable-nodpi/m1_order_end_car.png create mode 100644 OCH/mogo-och-charter-passenger/src/m1/res/drawable-nodpi/m1_order_site_check.png create mode 100644 OCH/mogo-och-charter-passenger/src/m1/res/drawable-nodpi/m1_order_site_checked.png create mode 100644 OCH/mogo-och-charter-passenger/src/m1/res/drawable/m1_order_line_checked_shape.xml create mode 100644 OCH/mogo-och-charter-passenger/src/m1/res/drawable/m1_order_line_shape.xml create mode 100644 OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_line_item.xml create mode 100644 OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_site_item.xml delete mode 100644 OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_wait_define.xml diff --git a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/model/OrderStatusEnum.kt b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/model/OrderStatusEnum.kt new file mode 100644 index 0000000000..feb181b90d --- /dev/null +++ b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/model/OrderStatusEnum.kt @@ -0,0 +1,28 @@ +package com.mogo.och.bus.passenger.model + +/** + * Created on 2022/08/19 + * + * + * 0 初始状态, + * 10 已登录, + * 20 已登出, + */ +enum class OrderStatusEnum(val code: Int) { + NoOrderUnuse( 0 ), //无订单车闲置 m1_order_noorder.xml 无订单页面 + OrderNoLine( 10), //有订单无线路 m1_order_lineside 选择线路页面 + OrdersWithLine( 20), //有订单有线路 m1_order_lineside 选择线路页面隐藏掉确定取消 + NoOrderUse( 30),; //无订单车不闲置 m1_order_end.xml 开门关门页面 + + companion object { + @JvmStatic + fun valueOf(code: Int): OrderStatusEnum? { + for (value in values()) { + if (value.code == code) { + return value + } + } + return NoOrderUnuse + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/adapter/OrderLineItemAdapter.kt b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/adapter/OrderLineItemAdapter.kt new file mode 100644 index 0000000000..fb1cbc1752 --- /dev/null +++ b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/adapter/OrderLineItemAdapter.kt @@ -0,0 +1,61 @@ +package com.mogo.och.bus.passenger.ui.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.mogo.och.bus.passenger.R +import com.mogo.och.bus.passenger.bean.response.LineInfoResponse + +/** + * Created by adityagohad on 06/06/17. + */ +class OrderLineItemAdapter(private val context: Context, private val dataList: List) : RecyclerView.Adapter() { + + private var checkIndex = -1 + + var checkChangeListener:CheckListener?=null + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TextVH { + val view: View + val inflater = LayoutInflater.from(context) + view = inflater.inflate(R.layout.m1_order_line_item, parent, false) + return TextVH(view) + } + + override fun onBindViewHolder(holder: TextVH, position: Int) { + val lineInfo = dataList[holder.bindingAdapterPosition] + if (position==checkIndex){ + holder.lineNameTextView.setBackgroundResource(R.drawable.m1_order_line_checked_shape) + }else{ + holder.lineNameTextView.setBackgroundResource(android.R.color.transparent) + } + holder.lineNameTextView.text = lineInfo.name + holder.lineNameTextView.setOnClickListener { + val preChecked = checkIndex + checkIndex = holder.bindingAdapterPosition + notifyItemChanged(preChecked) + notifyItemChanged(checkIndex) + checkChangeListener?.onCheckListener(lineInfo) + } + } + + override fun getItemCount(): Int { + return dataList.size + } + + interface CheckListener{ + fun onCheckListener(lineInfo:LineInfoResponse.Result) + } + + inner class TextVH(itemView: View) : RecyclerView.ViewHolder(itemView) { + var lineNameTextView: TextView + + init { + lineNameTextView = itemView.findViewById(R.id.tv_line_name) + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/adapter/OrderSiteItemAdapter.kt b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/adapter/OrderSiteItemAdapter.kt new file mode 100644 index 0000000000..6eb4ff02fe --- /dev/null +++ b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/adapter/OrderSiteItemAdapter.kt @@ -0,0 +1,88 @@ +package com.mogo.och.bus.passenger.ui.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.utilcode.util.ToastUtils +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 + +/** + * Created by adityagohad on 06/06/17. + */ +class OrderSiteItemAdapter(private val context: Context, private val dataList: List) : RecyclerView.Adapter() { + + private var checkIndex = -1 + private var enableIndex = -1 + + var checkChangeListener:CheckListener?=null + + fun setEnableIndex(enableIndex:Int){ + this.enableIndex = enableIndex + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TextVH { + val view: View + val inflater = LayoutInflater.from(context) + view = inflater.inflate(R.layout.m1_order_site_item, parent, false) + return TextVH(view) + } + + override fun onBindViewHolder(holder: TextVH, position: Int) { + val siteInfo = dataList[holder.bindingAdapterPosition] + if(holder.bindingAdapterPosition>enableIndex){ + if (position == checkIndex) { + holder.iv_site_checked.setImageResource(R.drawable.m1_order_site_checked) + } else { + holder.iv_site_checked.setImageResource(R.drawable.m1_order_site_check) + } + holder.tv_site_site_name.setTextColor(ContextCompat.getColor(context,R.color.bus_p_m1_2C2D31)) + }else { + holder.iv_site_checked.setImageResource(R.drawable.m1_order_site_check) + holder.tv_site_site_name.setTextColor(ContextCompat.getColor(context,R.color.bus_p_m1_662C2D31)) + } + holder.tv_site_site_name.text = siteInfo.lineName + holder.itemView.setOnClickListener { + if(holder.bindingAdapterPosition>enableIndex) { + val preChecked = checkIndex + checkIndex = holder.bindingAdapterPosition + notifyItemChanged(preChecked) + notifyItemChanged(checkIndex) + checkChangeListener?.onCheckListener(siteInfo) + }else{ + ToastUtils.showShort("请选择可选站点") + } + } + } + + override fun getItemCount(): Int { + return dataList.size + } + + fun clearCheck() { + val temp = checkIndex + checkIndex = -1 + notifyItemChanged(temp) + } + + interface CheckListener{ + fun onCheckListener(siteInfo:SiteInfoResponse.SiteInfo) + } + + inner class TextVH(itemView: View) : RecyclerView.ViewHolder(itemView) { + var tv_site_site_name: TextView + var iv_site_checked: ImageView + + init { + tv_site_site_name = itemView.findViewById(R.id.tv_site_site_name) + iv_site_checked = itemView.findViewById(R.id.iv_site_checked) + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/view/LineSiteView.kt b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/view/LineSiteView.kt index 00c6dd6613..93760cd843 100644 --- a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/view/LineSiteView.kt +++ b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/ui/view/LineSiteView.kt @@ -1,18 +1,146 @@ package com.mogo.och.bus.passenger.ui.view +import android.animation.ObjectAnimator import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater +import android.view.View +import android.view.animation.LinearInterpolator import androidx.constraintlayout.widget.ConstraintLayout -import com.mogo.eagle.core.function.hmi.ui.widget.BlueToothView +import androidx.recyclerview.widget.LinearLayoutManager +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.util.ToastUtils 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.ui.adapter.OrderLineItemAdapter +import com.mogo.och.bus.passenger.ui.adapter.OrderSiteItemAdapter +import com.mogo.och.bus.passenger.view.BottomDecoration +import com.mogo.och.bus.passenger.view.RecyclerViewCornerRadius +import kotlinx.android.synthetic.m1.m1_order_lineside.view.* +import kotlinx.android.synthetic.m1.m1_soft_fragment.* +import me.jessyan.autosize.utils.AutoSizeUtils class LineSiteView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : ConstraintLayout(context, attrs, defStyleAttr) { + + private var checkLine: LineInfoResponse.Result?=null + private var checkSite: SiteInfoResponse.SiteInfo?=null + + private var tempCheckLine: LineInfoResponse.Result?=null + private var tempCheckSite: SiteInfoResponse.SiteInfo?=null + + + private val lineList = mutableListOf() + private val siteList = mutableListOf() + + private var lineAdapter: OrderLineItemAdapter + private var siteAdapter: OrderSiteItemAdapter + + private val loadingAni = ObjectAnimator.ofFloat(iv_loading_wait_driver, "rotation", 0f, 90f ,180f, 270f, 360f).apply { + repeatCount = -1 + interpolator = LinearInterpolator() + duration = 1000 + } + + init { LayoutInflater.from(context).inflate(R.layout.m1_order_lineside, this, true) + lineAdapter = OrderLineItemAdapter(context,lineList) + siteAdapter = OrderSiteItemAdapter(context,siteList) + loadingAni.target = iv_loading_wait_driver + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + lineList.add(LineInfoResponse.Result("路线名称1",1)) + lineList.add(LineInfoResponse.Result("路线名称2",2)) + lineList.add(LineInfoResponse.Result("路线名称3",3)) + lineList.add(LineInfoResponse.Result("路线名称4",4)) + lineList.add(LineInfoResponse.Result("路线名称5",5)) + lineList.add(LineInfoResponse.Result("路线名称6",6)) + lineList.add(LineInfoResponse.Result("路线名称7",7)) + siteList.add(SiteInfoResponse.SiteInfo(1,"线路id",1,"站点名称",0.0,0.0,0.0,0.0,0.0,0)) + siteList.add(SiteInfoResponse.SiteInfo(1,"线路id",2,"站点名称",0.0,0.0,0.0,0.0,0.0,0)) + siteList.add(SiteInfoResponse.SiteInfo(1,"线路id",3,"站点名称",0.0,0.0,0.0,0.0,0.0,0)) + siteList.add(SiteInfoResponse.SiteInfo(1,"线路id",4,"站点名称",0.0,0.0,0.0,0.0,0.0,0)) + siteList.add(SiteInfoResponse.SiteInfo(1,"线路id",5,"站点名称",0.0,0.0,0.0,0.0,0.0,0)) + siteList.add(SiteInfoResponse.SiteInfo(1,"线路id",6,"站点名称",0.0,0.0,0.0,0.0,0.0,0)) + siteList.add(SiteInfoResponse.SiteInfo(1,"线路id",7,"站点名称",0.0,0.0,0.0,0.0,0.0,0)) + siteList.add(SiteInfoResponse.SiteInfo(1,"线路id",8,"站点名称",0.0,0.0,0.0,0.0,0.0,0)) + siteList.add(SiteInfoResponse.SiteInfo(1,"线路id",9,"站点名称",0.0,0.0,0.0,0.0,0.0,0)) + siteList.add(SiteInfoResponse.SiteInfo(1,"线路id",10,"站点名称",0.0,0.0,0.0,0.0,0.0,0)) + siteList.add(SiteInfoResponse.SiteInfo(1,"线路id",11,"站点名称",0.0,0.0,0.0,0.0,0.0,0)) + siteList.add(SiteInfoResponse.SiteInfo(1,"线路id",12,"站点名称",0.0,0.0,0.0,0.0,0.0,0)) + siteList.add(SiteInfoResponse.SiteInfo(1,"线路id",13,"站点名称",0.0,0.0,0.0,0.0,0.0,0)) + + 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,60f))) + rv_site_list.adapter = siteAdapter + + initListener() + + } + + private fun initListener() { + lineAdapter.checkChangeListener = object :OrderLineItemAdapter.CheckListener{ + override fun onCheckListener(lineInfo: LineInfoResponse.Result) { + ToastUtils.showLong("选中线路${lineInfo} 对比当前坐标计算需要禁用的站点") + tempCheckLine = lineInfo + siteAdapter.clearCheck() + siteAdapter.setEnableIndex(3) + } + } + siteAdapter.checkChangeListener = object :OrderSiteItemAdapter.CheckListener{ + override fun onCheckListener(siteInfo: SiteInfoResponse.SiteInfo) { + // 设置临时选中的 + tempCheckSite = siteInfo + } + + } + tv_line_cancle.onClick { + ToastUtils.showLong("取消切换") + } + tv_line_submit.onClick { + ToastUtils.showLong("向司机端确认弹出loading 并启动轮询查看是否正常连接司机端、等待结果") + startAni() + } + tv_site_cancle.onClick { + ToastUtils.showLong("取消切换") + } + tv_site_submit.onClick { + ToastUtils.showLong("向司机端确认弹出loading 并启动轮询查看是否正常连接司机端、等待结果") + } + tv_switch_line.onClick { + ToastUtils.showLong("判断速度是否为0,开始查询线路信息") + } + tv_loading_wait_driver_title.onClick { + endAni() + } + } + + fun startAni(){ + g_lines_sites_data.visibility = View.GONE + g_loading_group.visibility = View.VISIBLE + if(!loadingAni.isRunning) { + loadingAni.start() + } + } + + fun endAni(){ + g_lines_sites_data.visibility = View.VISIBLE + g_loading_group.visibility = View.GONE + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + loadingAni.cancel() } } \ No newline at end of file diff --git a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/view/BottomDecoration.java b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/view/BottomDecoration.java new file mode 100644 index 0000000000..78ec3608db --- /dev/null +++ b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/view/BottomDecoration.java @@ -0,0 +1,43 @@ +package com.mogo.och.bus.passenger.view; + +import android.graphics.Rect; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.mogo.commons.AbsMogoApplication; +import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; +import com.mogo.och.bus.passenger.ui.adapter.TemperatureAdapter; + +public class BottomDecoration extends RecyclerView.ItemDecoration { + /** + * 第一个视图和最后一个视图偏移的距离 + */ + public static int distance = 0; + + /** + * 设置RecyclerView子视图的边距,本示例仅用于定义两个子视图之间的边距,为space*2 + */ + public BottomDecoration(int distance) { + this.distance = distance; + } + + @Override + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + int pos = parent.getChildAdapterPosition(view); + RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams)view.getLayoutParams(); + + /** + * 通过设置Item左右边距实现第一个左侧和最后一个右侧设置边距,确保显示的视图位于屏幕中间 + */ + int itemCount = parent.getAdapter().getItemCount(); + if(pos == itemCount-1){ + layoutParams.setMargins(0,0,0,distance); + }else { + layoutParams.setMargins(0,0,0,0); + } + view.setLayoutParams(layoutParams); + super.getItemOffsets(outRect, view, parent, state); + } +} diff --git a/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/view/RecyclerViewCornerRadius.java b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/view/RecyclerViewCornerRadius.java new file mode 100644 index 0000000000..1d84288d1c --- /dev/null +++ b/OCH/mogo-och-charter-passenger/src/m1/java/com/mogo/och/bus/passenger/view/RecyclerViewCornerRadius.java @@ -0,0 +1,70 @@ +package com.mogo.och.bus.passenger.view; +import android.graphics.Canvas; +import android.graphics.Path; +import android.graphics.RectF; +import android.graphics.Region; +import android.os.Build; +import android.view.ViewTreeObserver; + +import androidx.recyclerview.widget.RecyclerView; + +/** + * 为RecyclerView设置圆角 + */ +public class RecyclerViewCornerRadius extends RecyclerView.ItemDecoration { + public static final String TAG = "RecyclerViewCornerRadius"; + + private RectF rectF; + private Path path; + + private int topLeftRadius = 0; + private int topRightRadius = 0; + private int bottomLeftRadius = 0; + private int bottomRightRadius = 0; + + public RecyclerViewCornerRadius(final RecyclerView recyclerView) { + recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + rectF = new RectF(0, 0, recyclerView.getMeasuredWidth(), recyclerView.getMeasuredHeight()); + + path = new Path(); + path.reset(); + path.addRoundRect(rectF, new float[]{ + topLeftRadius, topLeftRadius, + topRightRadius, topRightRadius, + bottomLeftRadius, bottomLeftRadius, + bottomRightRadius, bottomRightRadius + }, Path.Direction.CCW); + + recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this); + } + }); + } + + public void setCornerRadius(int radius) { + this.topLeftRadius = radius; + this.topRightRadius = radius; + this.bottomLeftRadius = radius; + this.bottomRightRadius = radius; + } + + public void setCornerRadius(int topLeftRadius, int topRightRadius, int bottomLeftRadius, int bottomRightRadius) { + this.topLeftRadius = topLeftRadius; + this.topRightRadius = topRightRadius; + this.bottomLeftRadius = bottomLeftRadius; + this.bottomRightRadius = bottomRightRadius; + } + + @Override + public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { + c.clipRect(rectF); + + + if (Build.VERSION.SDK_INT >= 28) { + c.clipPath(path); + } else { + c.clipPath(path, Region.Op.REPLACE); + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-charter-passenger/src/m1/res/drawable-nodpi/m1_order_end_car.png b/OCH/mogo-och-charter-passenger/src/m1/res/drawable-nodpi/m1_order_end_car.png new file mode 100644 index 0000000000000000000000000000000000000000..ba4dbadad7f1904759c33d363a01d3355885131c GIT binary patch literal 71498 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 literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-charter-passenger/src/m1/res/drawable-nodpi/m1_order_site_check.png b/OCH/mogo-och-charter-passenger/src/m1/res/drawable-nodpi/m1_order_site_check.png new file mode 100644 index 0000000000000000000000000000000000000000..94446335e8054a6284aedb28658086f5094f52ca GIT binary patch literal 1758 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 literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-charter-passenger/src/m1/res/drawable/m1_order_line_checked_shape.xml b/OCH/mogo-och-charter-passenger/src/m1/res/drawable/m1_order_line_checked_shape.xml new file mode 100644 index 0000000000..138da92fa0 --- /dev/null +++ b/OCH/mogo-och-charter-passenger/src/m1/res/drawable/m1_order_line_checked_shape.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/OCH/mogo-och-charter-passenger/src/m1/res/drawable/m1_order_line_shape.xml b/OCH/mogo-och-charter-passenger/src/m1/res/drawable/m1_order_line_shape.xml new file mode 100644 index 0000000000..b9db163776 --- /dev/null +++ b/OCH/mogo-och-charter-passenger/src/m1/res/drawable/m1_order_line_shape.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_end.xml b/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_end.xml index e87b854288..f8a822c8c6 100644 --- a/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_end.xml +++ b/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_end.xml @@ -12,7 +12,7 @@ android:layout_height="@dimen/dp_172" android:layout_marginTop="@dimen/dp_63" android:layout_marginStart="@dimen/dp_56" - android:src="@drawable/m1_order_early_end" + android:src="@drawable/m1_order_end_car" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_fragment.xml b/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_fragment.xml index 67dc890500..c2bbe00149 100644 --- a/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_fragment.xml +++ b/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_fragment.xml @@ -18,11 +18,11 @@ app:layout_constraintWidth_percent="0.53698"> diff --git a/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_line_item.xml b/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_line_item.xml new file mode 100644 index 0000000000..ea560d73ea --- /dev/null +++ b/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_line_item.xml @@ -0,0 +1,11 @@ + + diff --git a/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_lineside.xml b/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_lineside.xml index faa15c61a4..9320493d21 100644 --- a/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_lineside.xml +++ b/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_lineside.xml @@ -49,6 +49,8 @@ android:layout_height="@dimen/dp_16"/> @@ -154,7 +157,6 @@ @@ -181,6 +183,7 @@ android:layout_height="0dp"/> @@ -188,5 +191,41 @@ + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_site_item.xml b/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_site_item.xml new file mode 100644 index 0000000000..10a51bc373 --- /dev/null +++ b/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_site_item.xml @@ -0,0 +1,24 @@ + + + + + + + diff --git a/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_wait_define.xml b/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_wait_define.xml deleted file mode 100644 index 9e559fcc54..0000000000 --- a/OCH/mogo-och-charter-passenger/src/m1/res/layout/m1_order_wait_define.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/OCH/mogo-och-charter-passenger/src/m1/res/values/color.xml b/OCH/mogo-och-charter-passenger/src/m1/res/values/color.xml index 59bc9ebb4f..685b7a7cfe 100644 --- a/OCH/mogo-och-charter-passenger/src/m1/res/values/color.xml +++ b/OCH/mogo-och-charter-passenger/src/m1/res/values/color.xml @@ -21,7 +21,15 @@ #3B4056 #23293B #485173 + #292C39 + #2C2D31 + #662C2D31 + #80288DFC + #3060ABFE + #0060ABFE + #00EFF6FF + #91EFF6FF #CCFFFFFF #80FFFFFF \ No newline at end of file