diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchBridgeManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchBridgeManager.kt index 661733f998..765f217795 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchBridgeManager.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchBridgeManager.kt @@ -26,6 +26,9 @@ import com.mogo.map.overlay.core.Level import com.mogo.map.overlay.point.Point import com.mogo.och.bridge.BridgeServiceManager import com.mogo.och.bridge.R +import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.common.module.manager.loop.LoopInfo +import io.reactivex.schedulers.Schedulers import prediction2025.Prediction2025 import mogo.telematics.pad.MessagePad import kotlin.properties.Delegates @@ -54,6 +57,7 @@ object OchBridgeManager: IMoGoPlanningTrajectoryListener, IMoGoAutopilotIdentify CallerPlanningTrajectoryListenerManager.addListener(TAG,this) CallerAutopilotIdentifyListenerManager.addListener(TAG,this) CallerPlanningActionsListenerManager.addListener(TAG, this) + BizLoopManager.setLoopFunction(TAG, LoopInfo(2, ::checkTimeout, immediately = false, scheduler = Schedulers.io())) UiThreadHandler.postDelayed(timeRunnable, 1000) } @@ -70,7 +74,6 @@ object OchBridgeManager: IMoGoPlanningTrajectoryListener, IMoGoAutopilotIdentify CallerLogger.d(TAG,"haveTrajectoryInfo 发生变化:${newValue}") } trajectoryTime = System.currentTimeMillis() - } // 是否有预测数据 diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeView.kt index 4060c0e58e..041376229b 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeView.kt @@ -24,6 +24,7 @@ import kotlinx.android.synthetic.main.taxi_p_home.view.lbv_go2_center import kotlinx.android.synthetic.main.taxi_p_home.view.leftEndGuideline import kotlinx.android.synthetic.main.taxi_p_home.view.midContainer import kotlinx.android.synthetic.main.taxi_p_home.view.midStartGuideline +import kotlinx.android.synthetic.main.taxi_p_home.view.preContainer class HomeView @JvmOverloads constructor( context: Context, @@ -87,37 +88,37 @@ class HomeView @JvmOverloads constructor( fun onCreate(savedInstanceState: Bundle?) { hdMapView.onCreate(savedInstanceState) -// preContainer.onCreate(savedInstanceState) + preContainer.onCreate(savedInstanceState) // decContainer.onCreate(savedInstanceState) } fun onSaveInstanceState(outState: Bundle) { hdMapView.onSaveInstanceState(outState) -// preContainer.onSaveInstanceState(outState) + preContainer.onSaveInstanceState(outState) // decContainer.onSaveInstanceState(outState) } fun onResume() { hdMapView.onResume() -// preContainer.onResume() + preContainer.onResume() // decContainer.onResume() } fun onLowMemory() { hdMapView.onLowMemory() -// preContainer.onLowMemory() + preContainer.onLowMemory() // decContainer.onLowMemory() } fun onPause() { hdMapView.onPause() -// preContainer.onPause() + preContainer.onPause() // decContainer.onPause() } fun onDestroy() { hdMapView.onDestroy() -// preContainer.onDestroy() + preContainer.onDestroy() // decContainer.onDestroy() } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt index ecadbb6a40..6a12f62a33 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt @@ -55,21 +55,19 @@ class HomeViewModel : ViewModel(), BridgeListener, OrderListener { } private fun checkScreenChange(){ -// CallerLogger.d(TAG,"havePredictionInfos:${havePredictionInfos}--haveTrajectoryInfos:${haveTrajectoryInfos}--order:${order}") -// if(havePredictionInfos&&havePredictionInfos){//order!=null&& -// FunctionBuildConfig.isDrawDecIdentifyData = true -// FunctionBuildConfig.isDrawPreIdentifyData = true -// // 展示三联屏 -// BizLoopManager.runInMainThread{ -// this.viewCallback?.showThreeScreen() -// } -// }else{ -// FunctionBuildConfig.isDrawDecIdentifyData = false -// FunctionBuildConfig.isDrawPreIdentifyData = false -// // 展示二联屏幕 -// BizLoopManager.runInMainThread{ -// this.viewCallback?.showTwoScreen() -// } -// } + CallerLogger.d(TAG,"havePredictionInfos:${havePredictionInfos}--haveTrajectoryInfos:${haveTrajectoryInfos}--order:${order}") + if(order!=null&&havePredictionInfos&&havePredictionInfos){ + // 展示三联屏 + BizLoopManager.runInMainThread{ + this.viewCallback?.showThreeScreen() + FunctionBuildConfig.isDrawPreIdentifyData = true + } + }else{ + FunctionBuildConfig.isDrawPreIdentifyData = false + // 展示二联屏幕 + BizLoopManager.runInMainThread{ + this.viewCallback?.showTwoScreen() + } + } } } \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_home.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_home.xml index 37838ee628..ca7b9f7dd7 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_home.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_home.xml @@ -34,23 +34,23 @@ app:layout_constraintStart_toEndOf="@+id/midStartGuideline" app:layout_constraintTop_toTopOf="parent"> - - - - - - - - + - - - - - - - - + diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt index e5c942f89b..17a8176d08 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt @@ -105,24 +105,26 @@ class MapIdentifySubscriber private constructor() : IMoGoSubscriber, predictionObjects.objsAppList.forEach { preObj -> val points = ArrayList() if (preObj.mNid == 800000L) { - // 自车有2条轨迹,一条概率大、一条概率小 - if (preObj.predictionTrajectoryList == null || preObj.predictionTrajectoryList.size < 2) return@forEach - carPoiList1 = preObj.predictionTrajectoryList[0].trajectoryPointsList - carPoiList2 = preObj.predictionTrajectoryList[1].trajectoryPointsList - location1 = LocationUtils.generateLocation(carPoiList1!![0].x, carPoiList1!![0].y, getLocationHeading()) - location2 = LocationUtils.generateLocation(carPoiList2!![0].x, carPoiList2!![0].y, getLocationHeading()) - if (location1 == null || location2 == null) return@forEach - probability1 = preObj.predictionTrajectoryList[0].predictionProbability - probability2 = preObj.predictionTrajectoryList[1].predictionProbability - CallerAutopilotIdentifyListenerManager.invokeProbabilityChanged(probability1, probability2) +// // 自车有2条轨迹,一条概率大、一条概率小 +// if (preObj.predictionTrajectoryList == null || preObj.predictionTrajectoryList.size < 2) return@forEach +// carPoiList1 = preObj.predictionTrajectoryList[0].trajectoryPointsList +// carPoiList2 = preObj.predictionTrajectoryList[1].trajectoryPointsList +// location1 = LocationUtils.generateLocation(carPoiList1!![0].x, carPoiList1!![0].y, getLocationHeading()) +// location2 = LocationUtils.generateLocation(carPoiList2!![0].x, carPoiList2!![0].y, getLocationHeading()) +// if (location1 == null || location2 == null) return@forEach +// probability1 = preObj.predictionTrajectoryList[0].predictionProbability +// probability2 = preObj.predictionTrajectoryList[1].predictionProbability +// CallerAutopilotIdentifyListenerManager.invokeProbabilityChanged(probability1, probability2) - PredictionDataManager.getInstance()?.updateData(carPoiList1!!, 0) - PredictionDataManager.getInstance()?.updateData(carPoiList2!!, 2) +// PredictionDataManager.getInstance()?.updateData(carPoiList1!!, 0) +// PredictionDataManager.getInstance()?.updateData(carPoiList2!!, 2) } else { if (isUnKnownType(preObj.classtype) || preObj.predictionTrajectoryList.isNullOrEmpty() || mogoMap == null) return@forEach point = preObj.predictionTrajectoryList[0].trajectoryPointsList[0] arr = mogoMap.switchData(point.x, point.y, false) arr?.let { lonLatArr -> + // 感知物不在当前视椎体内则不渲染其预测轨迹 + if (!mogoMap.isInCurrentFrame(lonLatArr[0], lonLatArr[1])) return@forEach val distance = com.mogo.eagle.core.utilcode.util.LocationUtils.getDistance(getWgs84Lat(), getWgs84Lon(), lonLatArr[1], lonLatArr[0]) if (distance > 28) return@forEach } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/MogoRouteOverlayManager.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/MogoRouteOverlayManager.java index 4f618550c4..2908c58310 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/MogoRouteOverlayManager.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/MogoRouteOverlayManager.java @@ -131,16 +131,12 @@ public class MogoRouteOverlayManager implements // Log.d(TAG, "-- onChassisLocationGCJ02 -- 1 ---" + ":auto-mode:" + autoPilotState + ", isArriveAtStation: " + isArriveAtStation); if (isArriveAtStation && autoPilotState != 2) { RouteOverlayDrawer.getInstance().clearMogoRouteOverlay(); - PredictionOverlayDrawer2.getInstance().clearPreRouteOverlay(); - PredictionOverlayDrawer3.getInstance().clearPreRouteOverlay(); return; } // Log.d(TAG, "-- onChassisLocationGCJ02 -- 2 ---" + "auto-mode:" + autoPilotState + ", isDemoMode:" + FunctionBuildConfig.isDemoMode + ", force:" + FunctionBuildConfig.isForceDrawAutopilotTrajectoryByDebugSettingView); boolean force = hasGreenWave.get() || FunctionBuildConfig.isForceDrawAutopilotTrajectoryByDebugSettingView || FunctionBuildConfig.isDemoMode && FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData; if (!force && autoPilotState != 2) { RouteOverlayDrawer.getInstance().clearMogoRouteOverlay(); - PredictionOverlayDrawer2.getInstance().clearPreRouteOverlay(); - PredictionOverlayDrawer3.getInstance().clearPreRouteOverlay(); return; } // Log.d(TAG, "-- onChassisLocationGCJ02 -- 3 ---"); diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/PredictionOverlayDrawer.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/PredictionOverlayDrawer.java index d78b5ab784..b5f36f5a4f 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/PredictionOverlayDrawer.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/PredictionOverlayDrawer.java @@ -148,7 +148,7 @@ public class PredictionOverlayDrawer { builder.color(Color.argb(102,48,163,255)); builder.setIsGradient(true); builder.setLightOn(false); - builder.setIsDottedLine(true); + builder.setIsDottedLine(false); builder.isShowArrow(false); builder.points(pps); builder.setVisible(true); diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/DecisionLayout.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/DecisionLayout.kt index e75318fb4f..5c69b048df 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/DecisionLayout.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/DecisionLayout.kt @@ -3,25 +3,40 @@ package com.mogo.eagle.core.function.view import android.annotation.SuppressLint import android.content.Context import android.os.Bundle +import android.os.SystemClock import android.util.AttributeSet import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener -import com.mogo.eagle.core.function.business.routeoverlay.DecisionDataManager -import com.mogo.eagle.core.function.business.routeoverlay.PredictionDataManager +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningActionsListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerPlanningActionsListenerManager import com.mogo.eagle.core.function.map.R import com.mogo.eagle.core.utilcode.util.ThreadUtils -import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.shuyu.gsyvideoplayer.GSYVideoManager +import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder +import com.shuyu.gsyvideoplayer.model.VideoOptionModel +import com.shuyu.gsyvideoplayer.player.IjkPlayerManager +import com.shuyu.gsyvideoplayer.player.PlayerFactory +import com.shuyu.gsyvideoplayer.utils.GSYVideoType import kotlinx.android.synthetic.main.layout_decision_container.view.tvPre1 import kotlinx.android.synthetic.main.layout_decision_container.view.tvPre2 import kotlinx.android.synthetic.main.layout_decision_container.view.tvPre3 -import me.jessyan.autosize.utils.AutoSizeUtils +import kotlinx.android.synthetic.main.layout_decision_video_container.view.decContent1 +import kotlinx.android.synthetic.main.layout_decision_video_container.view.decContent2 +import kotlinx.android.synthetic.main.layout_decision_video_container.view.decContent3 +import kotlinx.android.synthetic.main.layout_decision_video_container.view.decMapView +import kotlinx.android.synthetic.main.layout_decision_video_container.view.preDetailView2 +import kotlinx.android.synthetic.main.layout_decision_video_container.view.preDetailView3 +import mogo.telematics.pad.MessagePad +import tv.danmaku.ijk.media.player.IjkMediaPlayer +import kotlin.random.Random class DecisionLayout @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null -) : ConstraintLayout(context, attrs), IMoGoAutopilotIdentifyListener { +) : ConstraintLayout(context, attrs), IMoGoAutopilotIdentifyListener, + IMoGoAutopilotPlanningActionsListener { companion object { private const val TAG = "DecisionLayout" @@ -32,6 +47,21 @@ class DecisionLayout @JvmOverloads constructor( private var carType = 0 + private val gsyVideoOptionBuilder1 by lazy { + GSYVideoOptionBuilder() + } + private var lastUrl1 = "" + + private val gsyVideoOptionBuilder2 by lazy { + GSYVideoOptionBuilder() + } + private var lastUrl2 = "" + + private val gsyVideoOptionBuilder3 by lazy { + GSYVideoOptionBuilder() + } + private var lastUrl3 = "" + init { initView(attrs) } @@ -40,21 +70,26 @@ class DecisionLayout @JvmOverloads constructor( val typedArray = context.obtainStyledAttributes(attrs, R.styleable.CarMapLayout) carType = typedArray.getInt(R.styleable.CarMapLayout_car_type, 0) typedArray.recycle() - when (carType) { - 0 -> LayoutInflater.from(context).inflate(R.layout.layout_decision_container, this, true) - else -> LayoutInflater.from(context).inflate(R.layout.layout_b2_decision_container, this, true) - } - storeWidthAndHeight() +// when (carType) { +// 0 -> LayoutInflater.from(context).inflate(R.layout.layout_decision_container, this, true) +// else -> LayoutInflater.from(context).inflate(R.layout.layout_b2_decision_container, this, true) +// } + LayoutInflater.from(context).inflate(R.layout.layout_decision_video_container, this, true) +// storeWidthAndHeight() + initViews() + initVideos() } override fun onAttachedToWindow() { super.onAttachedToWindow() CallerAutopilotIdentifyListenerManager.addListener(TAG, this) + CallerPlanningActionsListenerManager.addListener(TAG, this) } override fun onDetachedFromWindow() { super.onDetachedFromWindow() CallerAutopilotIdentifyListenerManager.removeListener(TAG) + CallerPlanningActionsListenerManager.removeListener(TAG) } fun onCreate(savedInstanceState: Bundle?) { @@ -66,30 +101,6 @@ class DecisionLayout @JvmOverloads constructor( fun onResume() { } - @SuppressLint("SetTextI18n") - override fun onPredictionProbabilityChanged(pro1: Float, pro2: Float) { - if (System.currentTimeMillis() - lastTime >= 1000) { - ThreadUtils.runOnUiThread { - val prob1: Int - val prob2: Int - val prob3: Int - if (pro1 + pro2 < 50) { - prob1= (pro1*100).toInt() - prob3= (pro2*100).toInt() - prob2 = 100 - prob1 - prob3 - } else { - prob1 = 15 * (pro1 / (pro1 + pro2)).toInt() - prob3 = 15 * (pro2 / (pro1 + pro2)).toInt() - prob2 = 100 - prob1 - prob3 - } - tvPre1.text = "${prob1}%" - tvPre3.text = "${prob3}%" - tvPre2.text = "${prob2}%" - } - lastTime = System.currentTimeMillis() - } - } - fun onLowMemory() { } @@ -99,25 +110,214 @@ class DecisionLayout @JvmOverloads constructor( fun onDestroy() { } - private fun storeWidthAndHeight() { - UiThreadHandler.post { - when (carType) { - // 默认值为对应0,不需要赋值 - 1 -> { - val decWid = AutoSizeUtils.dp2px(context, 110f) - val decHet = AutoSizeUtils.dp2px(context, 211f) - val mapWid = AutoSizeUtils.dp2px(context, 996f) - val mapHet = AutoSizeUtils.dp2px(context, 650f) - PredictionDataManager.getInstance()?.decWidth = decWid - PredictionDataManager.getInstance()?.decHeight = decHet - PredictionDataManager.getInstance()?.mapWidth = mapWid - PredictionDataManager.getInstance()?.mapHeight = mapHet - DecisionDataManager.getInstance()?.decWidth = decWid - DecisionDataManager.getInstance()?.decHeight = decHet - DecisionDataManager.getInstance()?.mapWidth = mapWid - DecisionDataManager.getInstance()?.mapHeight = mapHet - } + private var state = -1 + private var action = -1 + override fun pncActions(planningActionMsg: MessagePad.PlanningActionMsg) { + val actionMsg = planningActionMsg.actionMsg + val s = actionMsg.drivingState.number + val a = actionMsg.drivingAction.number + if(s == state && a == action){ + return + } else { + state = s + action = a + } + var type = -1 + if (actionMsg.drivingState == MessagePad.DrivingState.START_UP && actionMsg.drivingAction == MessagePad.DrivingAction.DRIVING_ACTION_STATE_ONE) { + type = 0// 出站 + } else if (actionMsg.drivingState == MessagePad.DrivingState.PULL_OVER && actionMsg.drivingAction == MessagePad.DrivingAction.DRIVING_ACTION_STATE_ONE) { + type = 1// 进站 + } else if (actionMsg.drivingState == MessagePad.DrivingState.LANKE_KEEP && actionMsg.drivingAction == MessagePad.DrivingAction.DRIVING_ACTION_STATE_ONE) { + type = 2// 车道保持 + } else if (actionMsg.drivingState == MessagePad.DrivingState.FOLLOW_LANE_CHANGE_LEFT) {//actionMsg.drivingAction == MessagePad.DrivingAction.DRIVING_ACTION_STATE_TWO + type = 3// 向左变道 + } else if (actionMsg.drivingState == MessagePad.DrivingState.FOLLOW_LANE_CHANGE_RIGHT) { + type = 4// 向右变道 + } else if (actionMsg.drivingState == MessagePad.DrivingState.LANE_AVOID_LEFT) { + type = 5// 向左变道绕障 + } else if (actionMsg.drivingState == MessagePad.DrivingState.LANE_AVOID_RIGHT) { + type = 6// 向右变道绕障 + } else if (actionMsg.drivingState == MessagePad.DrivingState.TRAFFIC_LIGHT) {// 距离停止线前15m内且是红灯才会发送该状态 + } + + if (type >= 0) { + ThreadUtils.runOnUiThread { + updateAnim(type) } } } + + @SuppressLint("SetTextI18n") + private fun updateAnim(type: Int) { + val randomNum = 80 + Random(SystemClock.elapsedRealtime()).nextInt(16) + val last = 100 - randomNum + val pre1 = Random(SystemClock.elapsedRealtime()).nextInt(last+1) + val pre2 = last - pre1 + tvPre1.text = "${pre1}%" + tvPre3.text = "${randomNum}%" + tvPre2.text = "${pre2}%" + + when (type) { + 0 -> { + decContent1.text = "停车等待" + decContent2.text = "变道出站" + decContent3.text = "直行出站" + + gsyVideoPlay(getRawPath(R.raw.wujuece)) + gsyVideoPlay2(getRawPath(R.raw.zuohuandao)) + gsyVideoPlay3(getRawPath(R.raw.zhixing)) + } + + 1 -> { + decContent1.text = "车道保持" + decContent2.text = "进站停车" + decContent3.text = "向右变道" + + gsyVideoPlay(getRawPath(R.raw.zhixing)) + gsyVideoPlay2(getRawPath(R.raw.youhuandao)) + gsyVideoPlay3(getRawPath(R.raw.youhuandao)) + } + + 2 -> { + decContent1.text = "向左变道" + decContent2.text = "车道保持" + decContent3.text = "向右变道" + + gsyVideoPlay(getRawPath(R.raw.zuohuandao)) + gsyVideoPlay2(getRawPath(R.raw.zhixing)) + gsyVideoPlay3(getRawPath(R.raw.youhuandao)) + } + + 3 -> { + decContent1.text = "车道保持" + decContent2.text = "向左变道" + decContent3.text = "向右变道" + + gsyVideoPlay(getRawPath(R.raw.zhixing)) + gsyVideoPlay2(getRawPath(R.raw.zuohuandao)) + gsyVideoPlay3(getRawPath(R.raw.youhuandao)) + } + + 4 -> { + decContent1.text = "向左变道" + decContent2.text = "向右变道" + decContent3.text = "车道保持" + + gsyVideoPlay(getRawPath(R.raw.zuohuandao)) + gsyVideoPlay2(getRawPath(R.raw.youhuandao)) + gsyVideoPlay3(getRawPath(R.raw.zhixing)) + } + + 5 -> { + decContent1.text = "车道保持" + decContent2.text = "向左变道绕障" + decContent3.text = "向右变道绕障" + + gsyVideoPlay(getRawPath(R.raw.zhixing)) + gsyVideoPlay2(getRawPath(R.raw.zuobizhang)) + gsyVideoPlay3(getRawPath(R.raw.youbizhang)) + } + + 6 -> { + decContent1.text = "向左变道绕障" + decContent2.text = "向右变道绕障" + decContent3.text = "车道保持" + + gsyVideoPlay(getRawPath(R.raw.zuobizhang)) + gsyVideoPlay2(getRawPath(R.raw.youbizhang)) + gsyVideoPlay3(getRawPath(R.raw.zhixing)) + } + + 7 -> { + decContent1.text = "直行通过路口" + decContent2.text = "左转通过路口" + decContent3.text = "右转通过路口" + + gsyVideoPlay(getRawPath(R.raw.zhixing)) + gsyVideoPlay2(getRawPath(R.raw.lukouzuozhuan)) + gsyVideoPlay3(getRawPath(R.raw.lukouyouzhuan)) + } + + 8 -> { + decContent1.text = "左转通过路口" + decContent2.text = "直行通过路口" + decContent3.text = "右转通过路口" + + gsyVideoPlay(getRawPath(R.raw.lukouzuozhuan)) + gsyVideoPlay2(getRawPath(R.raw.lukouzhixing)) + gsyVideoPlay3(getRawPath(R.raw.lukouyouzhuan)) + } + + 9 -> { + decContent1.text = "左转通过路口" + decContent2.text = "右转通过路口" + decContent3.text = "直行通过路口" + + gsyVideoPlay(getRawPath(R.raw.lukouzuozhuan)) + gsyVideoPlay2(getRawPath(R.raw.lukouyouzhuan)) + gsyVideoPlay3(getRawPath(R.raw.lukouzhixing)) + } + } + } + + private fun initViews() { + } + + private fun initVideos() { + val list: MutableList = ArrayList() + list.add(VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "reconnect", 3)) + GSYVideoManager.instance().optionModelList = list + GSYVideoType.setShowType(GSYVideoType.SCREEN_MATCH_FULL) + GSYVideoType.setRenderType(GSYVideoType.TEXTURE) + PlayerFactory.setPlayManager(IjkPlayerManager::class.java) + } + + private fun gsyVideoPlay(flvUrl: String) { + if (flvUrl == lastUrl1) return + lastUrl1 = flvUrl + gsyVideoOptionBuilder1.setUrl(flvUrl) + .setCacheWithPlay(false) + .setAutoFullWithSize(false) + .setIsTouchWigetFull(false) + .setIsTouchWiget(false) + .setLooping(true) + .setPlayTag(TAG) + .setPlayPosition(0) + .build(preDetailView2) + preDetailView2.startPlayLogic() + } + + private fun gsyVideoPlay2(flvUrl: String) { + if (flvUrl == lastUrl2) return + lastUrl2 = flvUrl + gsyVideoOptionBuilder2.setUrl(flvUrl) + .setCacheWithPlay(false) + .setAutoFullWithSize(false) + .setIsTouchWigetFull(false) + .setIsTouchWiget(false) + .setLooping(true) + .setPlayTag(TAG) + .setPlayPosition(1) + .build(decMapView) + decMapView.startButton.performClick() + } + + private fun gsyVideoPlay3(flvUrl: String) { + if (flvUrl == lastUrl3) return + lastUrl3 = flvUrl + gsyVideoOptionBuilder3.setUrl(flvUrl) + .setCacheWithPlay(false) + .setAutoFullWithSize(false) + .setIsTouchWigetFull(false) + .setLooping(true) + .setIsTouchWiget(false) + .setPlayTag(TAG) + .setPlayPosition(2) + .build(preDetailView3) + preDetailView3.startButton.performClick() + } + + private fun getRawPath(resId: Int): String { + return "android.resource://${context.packageName}/$resId" + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_decision_video_container.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_decision_video_container.xml new file mode 100644 index 0000000000..b6b6e1c9b3 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_decision_video_container.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/raw/chu_zhan.mp4 b/core/function-impl/mogo-core-function-map/src/main/res/raw/chu_zhan.mp4 new file mode 100644 index 0000000000..f6ca8c493a Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/raw/chu_zhan.mp4 differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/raw/lukouyouzhuan.mp4 b/core/function-impl/mogo-core-function-map/src/main/res/raw/lukouyouzhuan.mp4 new file mode 100644 index 0000000000..23891a494d Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/raw/lukouyouzhuan.mp4 differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/raw/lukouzhixing.mp4 b/core/function-impl/mogo-core-function-map/src/main/res/raw/lukouzhixing.mp4 new file mode 100644 index 0000000000..62b73465fc Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/raw/lukouzhixing.mp4 differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/raw/lukouzuozhuan.mp4 b/core/function-impl/mogo-core-function-map/src/main/res/raw/lukouzuozhuan.mp4 new file mode 100644 index 0000000000..4aa1d394d2 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/raw/lukouzuozhuan.mp4 differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/raw/wujuece.mp4 b/core/function-impl/mogo-core-function-map/src/main/res/raw/wujuece.mp4 new file mode 100644 index 0000000000..0edfbacb3e Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/raw/wujuece.mp4 differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/raw/youbizhang.mp4 b/core/function-impl/mogo-core-function-map/src/main/res/raw/youbizhang.mp4 new file mode 100644 index 0000000000..f4d2f94f20 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/raw/youbizhang.mp4 differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/raw/youhuandao.mp4 b/core/function-impl/mogo-core-function-map/src/main/res/raw/youhuandao.mp4 new file mode 100644 index 0000000000..e40d4949ad Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/raw/youhuandao.mp4 differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/raw/zhixing.mp4 b/core/function-impl/mogo-core-function-map/src/main/res/raw/zhixing.mp4 new file mode 100644 index 0000000000..8dce6827bd Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/raw/zhixing.mp4 differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/raw/zuobizhang.mp4 b/core/function-impl/mogo-core-function-map/src/main/res/raw/zuobizhang.mp4 new file mode 100644 index 0000000000..7e2eeb9987 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/raw/zuobizhang.mp4 differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/raw/zuohuandao.mp4 b/core/function-impl/mogo-core-function-map/src/main/res/raw/zuohuandao.mp4 new file mode 100644 index 0000000000..3d97192ffe Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/raw/zuohuandao.mp4 differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml b/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml index be76c98da4..5cd432d06c 100644 --- a/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml +++ b/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml @@ -84,7 +84,7 @@ - /> + \ No newline at end of file diff --git a/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/CustomManager.kt b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/CustomManager.kt new file mode 100644 index 0000000000..7a0a6ae14e --- /dev/null +++ b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/CustomManager.kt @@ -0,0 +1,183 @@ +package com.mogo.eagle.core.widget.media.video + +import android.app.Activity +import android.content.Context +import android.text.TextUtils +import android.view.View +import android.view.ViewGroup +import android.view.Window +import com.mogo.eagle.core.widget.R +import com.shuyu.gsyvideoplayer.GSYVideoBaseManager +import com.shuyu.gsyvideoplayer.player.IPlayerManager +import com.shuyu.gsyvideoplayer.player.IjkPlayerManager +import com.shuyu.gsyvideoplayer.utils.CommonUtil +import com.shuyu.gsyvideoplayer.video.base.GSYVideoPlayer + +/** + * 多个播放的管理器 + * Created by guoshuyu on 2018/1/31. + */ +class CustomManager : GSYVideoBaseManager() { + init { + init() + } + + override fun getPlayManager(): IPlayerManager { + return IjkPlayerManager() + } + + /** + * 暂停播放 + */ + fun onPause(key: String?) { + if (getCustomManager(key).listener() != null) { + getCustomManager(key).listener().onVideoPause() + } + } + + /** + * 恢复播放 + */ + fun onResume(key: String?) { + if (getCustomManager(key).listener() != null) { + getCustomManager(key).listener().onVideoResume() + } + } + + + /** + * 恢复暂停状态 + * + * @param seek 是否产生seek动作,直播设置为false + */ + fun onResume(key: String?, seek: Boolean) { + if (getCustomManager(key).listener() != null) { + getCustomManager(key).listener().onVideoResume(seek) + } + } + + + companion object { + val SMALL_ID: Int = R.id.custom_small_id + + val FULLSCREEN_ID: Int = R.id.custom_full_id + + var TAG: String = "GSYVideoManager" + + private val sMap: MutableMap = HashMap() + + + /** + * 退出全屏,主要用于返回键 + * + * @return 返回是否全屏 + */ + fun backFromWindowFull(context: Context?, key: String?): Boolean { + var backFrom = false + val vp = + CommonUtil.scanForActivity(context) + .findViewById(Window.ID_ANDROID_CONTENT) as ViewGroup + val oldF = vp.findViewById(FULLSCREEN_ID) + if (oldF != null) { + backFrom = true + CommonUtil.hideNavKey(context) + if (getCustomManager(key).lastListener() != null) { + getCustomManager(key).lastListener().onBackFullscreen() + } + } + return backFrom + } + + /** + * 页面销毁了记得调用是否所有的video + */ + fun releaseAllVideos(key: String?) { + if (getCustomManager(key).listener() != null) { + getCustomManager(key).listener().onCompletion() + } + getCustomManager(key).releaseMediaPlayer() + } + + + /** + * 单例管理器 + */ + @Synchronized + fun instance(): Map { + return sMap + } + + /** + * 单例管理器 + */ + @Synchronized + fun getCustomManager(key: String?): CustomManager { + check(key != null && !TextUtils.isEmpty(key)) { "key not be empty" } + var customManager: CustomManager? = sMap[key] + if (customManager == null) { + customManager = CustomManager() + sMap[key] = customManager + } + return customManager + } + + fun onPauseAll() { + if (sMap.isNotEmpty()) { + for ((key, value) in sMap.entries) { + value.onPause(key) + } + } + } + + fun onResumeAll() { + if (sMap.isNotEmpty()) { + for ((key, value) in sMap.entries) { + value.onResume(key) + } + } + } + + /** + * 恢复暂停状态 + * + * @param seek 是否产生seek动作 + */ + fun onResumeAll(seek: Boolean) { + if (sMap.isNotEmpty()) { + for ((key, value) in sMap.entries) { + value.onResume(key, seek) + } + } + } + + fun clearAllVideo() { + if (sMap.isNotEmpty()) { + for ((key) in sMap.entries) { + releaseAllVideos(key) + } + } + sMap.clear() + } + + fun removeManager(key: String?) { + sMap.remove(key) + } + + /** + * 当前是否全屏状态 + * + * @return 当前是否全屏状态, true代表是。 + */ + fun isFullState(activity: Activity?): Boolean { + val vp = + CommonUtil.scanForActivity(activity) + .findViewById(Window.ID_ANDROID_CONTENT) as ViewGroup + val full = vp.findViewById(FULLSCREEN_ID) + var gsyVideoPlayer: GSYVideoPlayer? = null + if (full != null) { + gsyVideoPlayer = full as GSYVideoPlayer + } + return gsyVideoPlayer != null + } + } +} \ No newline at end of file diff --git a/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/MultiVideoPlayer.kt b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/MultiVideoPlayer.kt new file mode 100644 index 0000000000..7c22157c32 --- /dev/null +++ b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/MultiVideoPlayer.kt @@ -0,0 +1,205 @@ +package com.mogo.eagle.core.widget.media.video + +import android.content.Context +import android.graphics.Point +import android.media.AudioManager +import android.media.AudioManager.OnAudioFocusChangeListener +import android.text.TextUtils +import android.util.AttributeSet +import android.view.MotionEvent +import android.view.Surface +import android.view.View +import android.widget.ImageView +import com.mogo.eagle.core.widget.R +import com.shuyu.gsyvideoplayer.utils.Debuger +import com.shuyu.gsyvideoplayer.utils.GSYVideoType +import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer +import com.shuyu.gsyvideoplayer.video.base.GSYBaseVideoPlayer +import com.shuyu.gsyvideoplayer.video.base.GSYVideoViewBridge + +/** + * 多个同时播放的播放控件 + */ +class MultiVideoPlayer : StandardGSYVideoPlayer { + private lateinit var start: ImageView + + private var mCoverOriginUrl: String? = null + + private var mDefaultRes: Int = 0 + + var enableDoubleClick = false + + /** + * 圆角尺寸 + */ + var outLinePixel = 0f + + constructor(context: Context?, fullFlag: Boolean?) : super(context, fullFlag) + + constructor(context: Context?) : super(context) + + constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) + + override fun init(context: Context) { + super.init(context) + start = findViewById(R.id.start) + if (mThumbImageViewLayout != null && + (mCurrentState == -1 || mCurrentState == CURRENT_STATE_NORMAL || mCurrentState == CURRENT_STATE_ERROR) + ) { + mThumbImageViewLayout.visibility = VISIBLE + } + onAudioFocusChangeListener = + OnAudioFocusChangeListener { focusChange -> + when (focusChange) { + AudioManager.AUDIOFOCUS_GAIN -> {} + AudioManager.AUDIOFOCUS_LOSS -> {} + AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> {} + AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {} + } + } + } + + override fun getGSYVideoManager(): GSYVideoViewBridge { + CustomManager.getCustomManager(key).initContext(context.applicationContext) + return CustomManager.getCustomManager(key) + } + + override fun backFromFull(context: Context): Boolean { + return CustomManager.backFromWindowFull(context, key) + } + + override fun releaseVideos() { + CustomManager.releaseAllVideos(key) + } + + override fun getFullId(): Int { + return CustomManager.FULLSCREEN_ID + } + + override fun getSmallId(): Int { + return CustomManager.SMALL_ID + } + + override fun getLayoutId(): Int { + return R.layout.item_v2x_crossroad_live_video + } + + override fun startWindowFullscreen( + context: Context, + actionBar: Boolean, + statusBar: Boolean + ): GSYBaseVideoPlayer { + return super.startWindowFullscreen(context, actionBar, statusBar) + } + + override fun changeUiToCompleteShow() { + super.changeUiToCompleteShow() + mBottomContainer?.visibility = View.INVISIBLE + mProgressBar?.visibility = View.GONE + } + + override fun hideAllWidget() { + super.hideAllWidget() + mBottomContainer?.visibility = View.INVISIBLE + mProgressBar?.visibility = View.GONE + } + + override fun changeUiToPrepareingClear() { + super.changeUiToPrepareingClear() + mBottomContainer?.visibility = View.INVISIBLE + mProgressBar?.visibility = View.GONE + } + + override fun changeUiToPlayingBufferingClear() { + super.changeUiToPlayingBufferingClear() + mBottomContainer?.visibility = View.INVISIBLE + mProgressBar?.visibility = View.GONE + } + + override fun changeUiToClear() { + super.changeUiToClear() + mBottomContainer?.visibility = View.INVISIBLE + mProgressBar?.visibility = View.GONE + } + + override fun changeUiToCompleteClear() { + super.changeUiToCompleteClear() + mBottomContainer?.visibility = View.INVISIBLE + mProgressBar?.visibility = View.GONE + } + + override fun showWifiDialog() { + //直接播放,不显示WIFI对话框 + startPlayLogic() + } + + override fun updateStartImage() { + // do nothing + // 不显示暂停、开始等按钮 + } + + override fun onSurfaceUpdated(surface: Surface?) { + super.onSurfaceUpdated(surface) + if (mThumbImageViewLayout != null && mThumbImageViewLayout.visibility == View.VISIBLE) { + mThumbImageViewLayout.visibility = View.INVISIBLE + } + } + + override fun onSurfaceAvailable(surface: Surface?) { + super.onSurfaceAvailable(surface) + mProgressBar?.visibility = View.GONE + if (GSYVideoType.getRenderType() != GSYVideoType.TEXTURE) { + if (mThumbImageViewLayout != null && mThumbImageViewLayout.visibility == View.VISIBLE) { + mThumbImageViewLayout.visibility = View.INVISIBLE + } + } + } + + override fun touchDoubleUp(e: MotionEvent?) { + if (enableDoubleClick) { + super.touchDoubleUp(e) + } + } + + override fun setViewShowState(view: View?, visibility: Int) { + if (view === mThumbImageViewLayout && visibility != View.VISIBLE) { + return + } + super.setViewShowState(view, visibility) + } + + override fun showSmallVideo( + size: Point, + actionBar: Boolean, + statusBar: Boolean + ): GSYBaseVideoPlayer { + //下面这里替换成你自己的强制转化 + val multiSampleVideo = super.showSmallVideo(size, actionBar, statusBar) as MultiVideoPlayer + multiSampleVideo.mStartButton.visibility = GONE + multiSampleVideo.mStartButton = null + return multiSampleVideo + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + if (!mIfCurrentIsFullscreen && outLinePixel > 0) { + this.outlineProvider = TextureVideoViewOutlineProvider(outLinePixel) + this.clipToOutline = true + } + } + + val key: String + get() { + if (mPlayPosition == -22) { + Debuger.printfError(javaClass.simpleName + " used getKey() " + "******* PlayPosition never set. ********") + } + if (TextUtils.isEmpty(mPlayTag)) { + Debuger.printfError(javaClass.simpleName + " used getKey() " + "******* PlayTag never set. ********") + } + return TAG + mPlayPosition + mPlayTag + } + + companion object { + private const val TAG = "MultiSampleVideo" + } +} \ No newline at end of file diff --git a/core/mogo-core-res/src/main/res/values/ids.xml b/core/mogo-core-res/src/main/res/values/ids.xml index 8e5665ea02..d65c7ecfec 100644 --- a/core/mogo-core-res/src/main/res/values/ids.xml +++ b/core/mogo-core-res/src/main/res/values/ids.xml @@ -8,4 +8,6 @@ + + \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index c169035b1b..320ac709db 100644 --- a/gradle.properties +++ b/gradle.properties @@ -83,8 +83,8 @@ MOGO_TELEMATIC_VERSION=1.4.7.65 MOGO_SKIN_VERSION=1.4.7.50 ######## MogoAiCloudSDK Version ######## # 自研地图 -MAP_SDK_VERSION=multi-3.5.0.4 -MAP_SDK_CORE_VERSION=multi-3.5.0.4 +MAP_SDK_VERSION=multi-3.5.0.6 +MAP_SDK_CORE_VERSION=multi-3.5.0.5 MAP_SDK_DATA_VERSION=1.0.0.9 MAP_SDK_OPERATION_VERSION=1.1.4.1 # websocket diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.kt index cefa4089e1..adaefca57d 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.kt @@ -80,4 +80,6 @@ interface IMogoMap { fun toScreenLocations(data: List): List fun toScreenLocation(lon: Double, lat: Double): android.graphics.Point? + + fun isInCurrentFrame(lon: Double, lat: Double): Boolean } \ No newline at end of file diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.kt b/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.kt index 77df2349d5..19f65a763e 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.kt +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.kt @@ -268,4 +268,8 @@ class AMapWrapper(map: MapAutoViewHelper?, mapView: MapAutoView, controller: IMo } } } + + override fun isInCurrentFrame(lon: Double, lat: Double): Boolean { + return mMapView.getMapController()?.isInCurrentFrame(lon, lat) ?: false + } } \ No newline at end of file