Merge remote-tracking branch 'origin/dev_robobus-m1-p-app-module_1.1.0_230112_1.1.0' into dev_robobus-m1-p-app-module_1.1.0_230112_1.1.0

This commit is contained in:
yangyakun
2023-02-23 21:51:48 +08:00
11 changed files with 348 additions and 67 deletions

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,12 @@
package com.mogo.och.bus.passenger.model
import android.content.Context
import android.net.ConnectivityManager
import android.os.Handler
import com.mogo.commons.module.intent.IMogoIntentListener
import com.mogo.commons.module.intent.IntentManager
import com.mogo.commons.voice.AIAssist
import com.mogo.commons.voice.IMogoVoiceCmdCallBack
import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.map.MogoLocation
@@ -17,7 +22,6 @@ import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManage
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
import com.mogo.eagle.core.utilcode.util.CoordinateUtils
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.eagle.core.utilcode.util.NetworkUtils
@@ -34,7 +38,6 @@ import com.mogo.och.bus.passenger.network.PM2ModelLoopManager
import com.mogo.och.common.module.bean.AppConnectMsg
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil
import com.mogo.och.common.module.voice.VoiceNotice.showNotice
import mogo.telematics.pad.MessagePad
import kotlin.math.abs
@@ -103,6 +106,9 @@ class PM2DrivingModel private constructor() {
//自动驾驶轨迹监听
CallerPlanningRottingListenerManager.addListener(TAG, moGoAutopilotPlanningListener)
//网络监听
IntentManager.getInstance().registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener)
}
fun releaseListener(){
@@ -126,6 +132,14 @@ class PM2DrivingModel private constructor() {
mAutoStatusCallback = autoPilotStatusCallback
}
private val mNetWorkIntentListener = IMogoIntentListener { intentStr, _ ->
if (ConnectivityManager.CONNECTIVITY_ACTION == intentStr) {
if (NetworkUtils.isConnected(mContext)) {
queryDriverOperationStatus()
}
}
}
private val mReceivedMsgListener: IReceivedMsgListener =
object : IReceivedMsgListener{
override fun onReceivedMsg(type: Int, byteArray: ByteArray) {//接收司机端发来的信息
@@ -133,12 +147,40 @@ class PM2DrivingModel private constructor() {
val msg = GsonUtils.fromJson(String(byteArray),AppConnectMsg::class.java) as AppConnectMsg
Logger.d(TAG,"onReceivedMsg = "+GsonUtils.toJson(msg))
if (msg.isPlay){ //播报
showNotice(msg.msg)
speakTTS(msg.msg)
}
}
}
}
private fun speakTTS(msg: String) {
// var mAudioManager = mContext?.getSystemService(Context.AUDIO_SERVICE) as AudioManager
// var mAudioAttributes = AudioAttributes.Builder()
// .setUsage(AudioAttributes.USAGE_MEDIA) //设置声音的用途
// .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) //设置声音的类型
// .build()
// var mAudioFocusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK) //设置焦点类型
// .setAudioAttributes(mAudioAttributes) //设置声音属性
// .setAcceptsDelayedFocusGain(false) //设置接受延迟获取焦点需要设置OnAudioFocusChangeListener来监听焦点的获取
// .build()
// mAudioManager.requestAudioFocus(mAudioFocusRequest) //抢占焦点
AIAssist.getInstance(mContext).speakTTSVoiceWithLevel(msg,AIAssist.LEVEL0,object : IMogoVoiceCmdCallBack{
override fun onSpeakEnd(speakText: String?) {
// mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest)
}
override fun onSpeakError(speakText: String?, errorMsg: String?) {
// mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest)
}
override fun onSpeakSelectTimeOut(speakText: String?) {
// mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest)
}
})
}
private val mMapLocationListener: IMoGoChassisLocationGCJ02Listener =
object : IMoGoChassisLocationGCJ02Listener{
override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) {
@@ -293,6 +335,7 @@ class PM2DrivingModel private constructor() {
&& station.isLeaving && i + 1 < stations.size) {
mDrivingInfoCallback?.updateStationsInfo(stations as MutableList<PM2Station>, i + 1, false)
if (mNextStationIndex != i + 1) {
d(TAG,"轨迹排查--开始行程")
mTwoStationsRouts.clear()
startRemainRouteInfo()
}
@@ -300,9 +343,6 @@ class PM2DrivingModel private constructor() {
mNextStationIndex = i + 1
return
} else if (station.drivingStatus == BusPassengerConst.STATION_STATUS_STOPPED && !station.isLeaving) {
if (i == 0) {
// startOrStopRouteAndWipe(false)
}
mPreRouteIndex = 0
isGoingToNextStation = false
startOrStopCalculateRouteInfo(false)
@@ -419,17 +459,6 @@ class PM2DrivingModel private constructor() {
}
}
}
if (mTwoStationsRouts.size > 0) {
val sumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(
mTwoStationsRouts
)
mContext?.let {
SharedPrefsMgr.getInstance(it).putInt(
BusPassengerConst.BUS_SP_KEY_ORDER_SUM_DIS,
sumLength.toInt()
)
}
}
}
}

View File

@@ -48,25 +48,27 @@ class PM2DrivingInfoFragment :
context?.let { it -> ToggleDebugView.toggleDebugView.toggle(it) }
}
current_time_tv.onClick {
//测试V2X消息
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
MsgBoxType.V2X,
V2XMsg(
"6666",
"超速行驶",
""
)
)
)
val noticeTrafficStylePushData = NoticeTrafficStylePushData()
noticeTrafficStylePushData.content= "测试公告布局"
val noticeFromCloudMsg = NoticeFrCloudMsg(null, noticeTrafficStylePushData, 1)
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
MsgBoxType.NOTICE, noticeFromCloudMsg)
)
// //测试V2X消息
// CallerMsgBoxManager.saveMsgBox(
// MsgBoxBean(
// MsgBoxType.V2X,
// V2XMsg(
// "6666",
// "超速行驶",
// ""
// )
// )
// )
//
// val noticeTrafficStylePushData = NoticeTrafficStylePushData()
// noticeTrafficStylePushData.content= "测试公告布局"
// val noticeFromCloudMsg = NoticeFrCloudMsg(null, noticeTrafficStylePushData, 1)
// CallerMsgBoxManager.saveMsgBox(
// MsgBoxBean(
// MsgBoxType.NOTICE, noticeFromCloudMsg)
// )
// BPRouteDataTestUtils.converToRouteData()
}
updateCurrentTime()
}
@@ -118,7 +120,9 @@ class PM2DrivingInfoFragment :
}
fun changeOperationStatus(status:Boolean){
setLineInfoView(status)
if (!status){
updateNoOrderUI()
}
}
fun showNoTaskView(haveTask: Boolean){
@@ -131,15 +135,19 @@ class PM2DrivingInfoFragment :
line_during_tv.visibility = View.VISIBLE
no_line_tv.visibility = View.GONE
}else{
line_name_tv.visibility = View.GONE
line_during_tv.visibility = View.GONE
no_line_tv.visibility = View.VISIBLE
updateNoStationView()
overMapView.clearSiteMarkers()
overMapView.clearCustomPolyline()
updateNoOrderUI()
}
}
private fun updateNoOrderUI() {
line_name_tv.visibility = View.GONE
line_during_tv.visibility = View.GONE
no_line_tv.visibility = View.VISIBLE
updateNoStationView()
overMapView.clearSiteMarkers()
overMapView.clearCustomPolyline()
}
private fun updateNoStationView(){
station_name_tv.setTextColor(resources.getColor(R.color.m2_no_line_tv_color))
station_name_title_tv.text = resources.getString(R.string.m2_p_station_title_tv)
@@ -203,7 +211,7 @@ class PM2DrivingInfoFragment :
}
}
val time = ceil(timeInSecond as Double / 60f).toInt()
val time = ceil(timeInSecond / 60f).toInt()
"$remainDis$disUnit | $time 分钟".also { remain_mt.text = it }
}

View File

@@ -84,7 +84,7 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter
private fun addView(item: RotationItem) {
if (item.type == 1) { // 表示视频
val videoView = AdvanceVideoView(mContext)
videoView.setVideoPath(item.path)
videoView.setVideoPath(item.path,item.cacheImgPath)
viewList.add(videoView)
} else { // 表示图片
val imageView = AdvanceImageView(mContext)

View File

@@ -35,6 +35,7 @@ class AdvanceVideoView @JvmOverloads constructor(
private var mOnCompletionListener: GSYSampleCallBack? = null
private var downloadVideoName = ""
private var fileNetPath: String? = ""
private var cacheImageUrl: String? = ""
init {
initView()
@@ -69,10 +70,11 @@ class AdvanceVideoView @JvmOverloads constructor(
videoRelativeLayout?.addView(videoViewPlayer, layoutParams)
}
fun setVideoPath(path: String) {
fun setVideoPath(path: String,cacheImageUrl: String) {
// https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357834634/5.m4v
// https://img.zhidaohulian.com/fileServer/online_car_hailing/1676360274126/10.mp4
this.fileNetPath = path
this.cacheImageUrl = cacheImageUrl
val pathList = path.split("/")
if (pathList.isNotEmpty()){
this.downloadVideoName = pathList[pathList.size - 1]
@@ -83,22 +85,37 @@ class AdvanceVideoView @JvmOverloads constructor(
private fun loadCacheImg() {
// BitmapHelper.getVideoThumbnail(path) /*获取第一帧图*/
cacheImage?.setImageResource(R.drawable.m2_p_video_holder)
setCacheImageViewVisible()
Thread{
var bitmap = BitmapHelper.getVideoThumbnail(fileNetPath)
Thread {
var bitmap = BitmapHelper.getVideoThumbnail(fileNetPath)
Logger.d(ImageAndVideoRotation.TAG, "setVideoPath")
ThreadUtils.runOnUiThread {
Logger.d(ImageAndVideoRotation.TAG, "bitmap加载")
cacheImage?.let {
Glide.with(context).load(bitmap)
.apply(
RequestOptions().placeholder(R.drawable.m2_p_video_holder).centerCrop()
RequestOptions().placeholder(R.drawable.m2_p_video_holder)
.error(R.drawable.m2_p_video_holder)
.fallback(R.drawable.m2_p_video_holder)
.centerCrop()
)
.into(it)
}
videoViewPlayer?.thumbImageView = cacheImage
}
}.start()
// Logger.d(ImageAndVideoRotation.TAG, "bitmap加载")
// cacheImage?.let {
// Glide.with(context).load(cacheImageUrl)
// .apply(
// RequestOptions().placeholder(R.drawable.m2_p_video_holder)
// .error(R.drawable.m2_p_video_holder)
// .fallback(R.drawable.m2_p_video_holder)
// .centerCrop()
// )
// .into(it)
// }
// videoViewPlayer?.thumbImageView = cacheImage
}
fun clearLocalErrorVideo(){
@@ -110,11 +127,13 @@ class AdvanceVideoView @JvmOverloads constructor(
@SuppressLint("CheckResult")
fun setCacheImageViewVisible() {
videoViewPlayer?.thumbImageView = cacheImage
videoViewPlayer?.setCacheImageViewVisible()
}
fun setCacheImageViewGone() {
videoViewPlayer?.setCacheImageViewGone()
videoViewPlayer?.clearThumbImageView()
}
fun setVideo(onCompletionListener: GSYSampleCallBack) {

View File

@@ -6,7 +6,7 @@ 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.login.LoginCharterImpl
import com.magic.mogo.och.charter.net.login.LoginDriverM1Impl
import com.magic.mogo.och.charter.presenter.DriverM1Presenter
import com.mogo.eagle.core.data.temp.EventLogout
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
@@ -36,7 +36,7 @@ class DriverM1Fragment : CharterBaseFragment<DriverM1Fragment?, DriverM1Presente
loginService?.registerFragment(
this,
presenter,
LoginCharterImpl()
LoginDriverM1Impl()
)
}
}
@@ -55,7 +55,7 @@ class DriverM1Fragment : CharterBaseFragment<DriverM1Fragment?, DriverM1Presente
fun changeOverview(eventLogout: EventLogout) {
if (eventLogout.messgae == EventLogout.LOGOUT_TYPE) {
d(SceneConstant.M_BUS + TAG, "changeOverview Event消息去登出")
mPresenter.logout()
mPresenter?.logout()
}
}

View File

@@ -1,13 +1,10 @@
package com.magic.mogo.och.charter.net
import com.mogo.eagle.core.data.BaseData
import io.reactivex.Observable
import retrofit2.http.*
/**
* @author: wangmingjun
* @date: 2023/2/22
*/
interface IDriverM1Service {
}

View File

@@ -1,4 +1,4 @@
package com.magic.mogo.och.charter.login
package com.magic.mogo.och.charter.net.login
import android.content.Context
import com.mogo.eagle.core.data.BaseData
@@ -8,16 +8,11 @@ import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean
import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean
import com.mogo.och.common.module.biz.network.LoginDefaultManage
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
import com.mogo.och.common.module.biz.network.OchCommonServiceManager
/**
* @author: wangmingjun
* @date: 2023/2/23
*/
class LoginCharterImpl: LoginDefaultManage {
class LoginDriverM1Impl: LoginDefaultManage {
override fun getPhoneCode(
context: Context,
phone: String?,
context: Context, phone: String?,
callback: OchCommonServiceCallback<BaseData>?
) {
OchCommonServiceManager.getPhoneCode(context,phone,callback)
@@ -47,4 +42,6 @@ class LoginCharterImpl: LoginDefaultManage {
) {
OchCommonServiceManager.queryDriverServiceStatus(context,callback)
}
}

View File

@@ -0,0 +1,107 @@
package com.magic.mogo.och.charter.net.login
import android.content.Context
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.och.common.module.biz.bean.TaxiLoginSmsReqBean
import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean
import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean
import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean
import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean
import com.mogo.och.common.module.biz.constant.OchCommonConst
import com.mogo.cloud.passport.MoGoAiCloudClient
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 OchCommonServiceManager {
private const val TAG = "OchCommonServiceManager"
private val mLoginServiceApi: OchLoginServiceApi =
MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(
OchLoginServiceApi::class.java
)
/**
* 获取手机验证码
* @param context
* @param callback
*/
@JvmStatic
fun getPhoneCode(
context: Context, phone: String?,
callback: OchCommonServiceCallback<BaseData>?
) {
mLoginServiceApi.getPhoneCode(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
TaxiLoginSmsReqBean(phone)
).transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "getPhoneCode"))
}
/**
* 通过验证码登录
* @param context
* @param callback
*/
@JvmStatic
fun gotoLoginBycode(
context: Context, phone: String?, code: String?,
location4Login: TaxiLoginReqBean.Location4Login?,
callback: OchCommonServiceCallback<TaxiLoginRespBean>?
) {
val sn = MoGoAiCloudClientConfig.getInstance().sn
mLoginServiceApi.gotoLoginBycode4Bus(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
TaxiLoginReqBean(phone, code, sn, location4Login)
).transformTry().subscribe(OchCommonSubscribeImpl(context, callback, "gotoLoginBycode"))
}
/**
* 登出
*/
@JvmStatic
fun logout(
context: Context,
location4Login: TaxiLogoutReqBean.Location4Login?,
callback: OchCommonServiceCallback<BaseData>?
) {
mLoginServiceApi.logout4Bus(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().sn, location4Login)
).transformTry().subscribe(OchCommonSubscribeImpl(context, callback, "logout"))
}
/**
* 接单状态和登录状态查询
*
* @param context
* @param callback
*/
@JvmStatic
fun queryDriverServiceStatus(
context: Context,
callback: OchCommonServiceCallback<DriverStatusQueryRespBean>?
) {
if (MoGoAiCloudClientConfig.getInstance().token.isEmpty()) {
callback?.onFail(OchCommonConst.WAIT_TAKEN, "等待令牌中请稍等")
MoGoAiCloudClient.getInstance().refreshToken()
return
}
mLoginServiceApi.queryDriverServiceStatusAndLoginStatus(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
MoGoAiCloudClientConfig.getInstance().sn
).transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverServiceStatus"))
}
}

View File

@@ -0,0 +1,66 @@
package com.magic.mogo.och.charter.net.login;
import com.mogo.eagle.core.data.BaseData;
import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean;
import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean;
import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean;
import com.mogo.och.common.module.biz.bean.TaxiLoginSmsReqBean;
import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean;
import io.reactivex.Observable;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
/**
* Created by pangfan on 2021/8/19
* <p>
* 网约车-出租车接口定义
*/
interface OchLoginServiceApi {
/**
* 获取手机验证码
*
* @return
*/
@Headers({"Content-type:application/json;charset=UTF-8"})
@POST("/och-rental-cabin/api/sms/v1/driver/sendSms")
Observable<DriverStatusQueryRespBean> getPhoneCode(@Header("appId") String appId
, @Header("ticket") String ticket, @Body TaxiLoginSmsReqBean data);
/**
* 通过验证码登录
*
* @param appId
* @param ticket
* @param data
* @return
*/
@Headers({"Content-type:application/json;charset=UTF-8"})
@POST("/och-rental-cabin/api/flow/v1/driver/startOperation")
Observable<TaxiLoginRespBean> gotoLoginBycode4Bus(@Header("appId") String appId
, @Header("ticket") String ticket, @Body TaxiLoginReqBean data);
/**
* 登出接口
*/
@Headers({"Content-type:application/json;charset=UTF-8"})
@POST("/och-rental-cabin/api/flow/v1/driver/endOperation")
Observable<BaseData> logout4Bus(@Header("appId") String appId, @Header("ticket") String ticket,
@Body TaxiLogoutReqBean data);
/**
* 接单状态和登录状态查询 出租车司机端、小巴车司机端、小巴车乘客端
*
* @param sn
* @return
*/
@Headers({"Content-type:application/json;charset=UTF-8"})
@GET("/och-rental-cabin/api/business/v1/driver/loginStatus")
Observable<DriverStatusQueryRespBean> queryDriverServiceStatusAndLoginStatus(@Header("appId") String appId
, @Header("ticket") String ticket, @Query("sn") String sn);
}

View File

@@ -25,6 +25,8 @@
app:layout_constraintCircle="@id/cbMsgBoxM1"
app:layout_constraintCircleAngle="35"
app:layout_constraintCircleRadius="25dp"
tools:ignore="MissingConstraints" />
tools:ignore="MissingConstraints"
android:visibility="gone"
/>
</androidx.constraintlayout.widget.ConstraintLayout>