diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt index 2c14bbc3b0..4be8d66433 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt @@ -25,6 +25,7 @@ import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager 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.v2x.CallerTrafficLightListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant @@ -155,6 +156,42 @@ class TeleMsgHandler : IMsgHandler { } return } + if (it.protocolType == TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_REQ) { + try { + Log.d(TAG, "乘客屏收到司机屏转发的驾驶位视频流开关 --- 1 ---") + val content = String(it.body, Charset.defaultCharset()) + Log.d(TAG, "乘客屏收到司机屏转发的驾驶位视频流开关 --- 2 ---:$content") + val data = GsonUtils.fromJson(content, Map::class.java) + val open = data["open"].toString().toInt() == 1 + val playUrl = data["playUrl"]?.toString() + //TODO yangyakun + if (open) { + if (playUrl != null) { + // 1. 获取视频播放控件 + val target = CallerDevaToolsManager.driveSeatVideoProvider()?.getDriveVideoView(playUrl) { event -> + + } + + if (target != null) { + // 2. 添加到一个ViewGroup上 + // 11: 第1个1代表运营面板开关打开,第2个1代表打开成功,告之司机端 + // 10: 第1个1代表运营面板开关打开,第2个0代表打开成功,告之司机端 + CallerTelematicManager.sendMsgToServer(TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP, "11".toByteArray()) + } + + } else { + CallerTelematicManager.sendMsgToServer(TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP, "10".toByteArray()) + } + } else { + //第1个0代表运营面板开关关闭,第2个1代表关闭成功,告之司机端; 相应的还有状态:00表示关闭失败 + CallerTelematicManager.sendMsgToServer(TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP, "01".toByteArray()) + } + } catch (t: Throwable) { + t.printStackTrace() + Log.e(TAG, "乘客屏收到司机屏转发的驾驶位视频流开关--- 3 ---", t) + } + return + } when (it.protocolType) { MogoProtocolMsg.NORMAL_DATA -> { try { @@ -349,6 +386,11 @@ class TeleMsgHandler : IMsgHandler { ) } + TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP -> { + // 来自客户端的响应 + CallerTelematicListenerManager.invokeReceivedMsg(TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP, it.body) + } + else -> { } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index b8f17f3570..cdf553419d 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -57,6 +57,8 @@ import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.mogo_core_function_devatools.binding.BindingCarManager import com.zhjt.mogo_core_function_devatools.block.MoGoBlockProviderImpl import com.zhjt.mogo_core_function_devatools.coldstart.ColdStartManager +import com.zhjt.mogo_core_function_devatools.driver.video.DriveSeatVideoProviderImpl +import com.mogo.eagle.core.function.api.driver.video.IDriveSeatVideoProvider import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager import com.zhjt.mogo_core_function_devatools.exam.ExamControlManager import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigCenter.Companion.bizConfigCenter @@ -125,6 +127,8 @@ class DevaToolsProvider : IDevaToolsProvider, IAppStateListener { ARouter.getInstance().build(MogoServicePaths.PATH_MAP_ROUTE_GUIDE).navigation() as? IMapRouteProvider } + private val driveSeatVideoProvider by lazy { DriveSeatVideoProviderImpl() } + @Volatile private var lastCanAutopilotStatus: Int? = null @@ -682,4 +686,8 @@ class DevaToolsProvider : IDevaToolsProvider, IAppStateListener { override fun takeOver(@TakeOverAnnotation takeOverAnnotation: Int) { TakeOverManager.takeOverManager.takeOver(takeOverAnnotation) } + + override fun driveSeatVideoProvider(): IDriveSeatVideoProvider { + return driveSeatVideoProvider + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/driver/video/DriveSeatVideoProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/driver/video/DriveSeatVideoProviderImpl.kt new file mode 100644 index 0000000000..a0e2e7c7a5 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/driver/video/DriveSeatVideoProviderImpl.kt @@ -0,0 +1,155 @@ +package com.zhjt.mogo_core_function_devatools.driver.video + +import android.os.Bundle +import android.text.TextUtils +import android.util.Log +import android.view.View +import androidx.core.view.doOnAttach +import androidx.core.view.doOnDetach +import com.mogo.commons.constants.HostConst +import com.mogo.eagle.core.data.BaseResponse +import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.function.api.driver.video.IDriveSeatVideoProvider +import com.mogo.eagle.core.function.api.driver.video.IDriveSeatVideoProvider.Event +import com.mogo.eagle.core.function.api.driver.video.IDriveSeatVideoProvider.Event.Failed +import com.mogo.eagle.core.function.api.driver.video.IDriveSeatVideoProvider.Event.Loading +import com.mogo.eagle.core.function.api.driver.video.IDriveSeatVideoProvider.Event.Playing +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.eagle.core.utilcode.util.AppStateManager +import com.tencent.liteav.basic.log.TXCLog +import com.tencent.rtmp.ITXLivePlayListener +import com.tencent.rtmp.TXLiveConstants +import com.tencent.rtmp.TXLivePlayConfig +import com.tencent.rtmp.TXLivePlayer +import com.tencent.rtmp.ui.TXCloudVideoView +import com.zhjt.mogo_core_function_devatools.driver.video.vo.VideoUrlData +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import retrofit2.http.GET +import retrofit2.http.Headers +import retrofit2.http.Query +import java.lang.ref.WeakReference + +class DriveSeatVideoProviderImpl: IDriveSeatVideoProvider { + + companion object { + private const val TAG = "DriveSeatVideoProvider" + } + + @Volatile + private var target: WeakReference? = null + + @Volatile + private var timer: Job? = null + + private val scope by lazy { CoroutineScope(Dispatchers.IO + SupervisorJob()) } + + private var data: VideoUrlData? = null + + internal interface IVideoLiveUrlApi { + @Headers("Content-Type:application/json;charset=UTF-8") + @GET("/eagleEye-mis/camera/monitor/watch/status") + suspend fun requestVideoLiveUrl(@Query(value = "numberPlate") numberPlate: String, @Query("cameraType") cameraType: Int, @Query("protocolType") protocolType: Int): BaseResponse + } + + + override suspend fun requestVideoInfo(): VideoUrlData? { + val plateNumber = AppConfigInfo.plateNumber + if (TextUtils.isEmpty(plateNumber)) { + Log.e(TAG, "-- isVideoLiveUsable -- plate number is empty.") + return null + } + val resp = getApi()?.requestVideoLiveUrl(plateNumber, 2, 2) ?: return null + Log.e(TAG, "-- isVideoLiveUsable -- receive response: {code: ${resp.code}, msg: ${resp.msg}, result: ${resp.result}}") + data = resp.result + return resp.result + } + + override fun getDriveVideoView(playUrl: String, playCallback: ((Event) -> Unit)?): View? { + val activity = AppStateManager.currentActivity() ?: return null + val t = target?.get() + if (t != null) { + return t + } + val x = TXCloudVideoView(activity) + Log.d(TAG, "getDriveVideoView --> $playUrl") + x.doOnAttach { + Log.d(TAG, "onAttachToWindow --> $playUrl") + val player = TXLivePlayer(activity) + player.setPlayerView(x) + player.setMute(true) + TXCLog.setLevel(4) + val config = TXLivePlayConfig() + config.setConnectRetryCount(30) + player.setConfig(config) + player.enableHardwareDecode(true) + player.startPlay(playUrl, TXLivePlayer.PLAY_TYPE_LIVE_RTMP) + player.setPlayListener(object : ITXLivePlayListener { + + override fun onPlayEvent(event: Int, bundle: Bundle?) { + Log.d(TAG, "直播信息 => event: $event, playUrl: $playUrl, bundle: $bundle") + if (event == TXLiveConstants.PLAY_EVT_PLAY_LOADING) { + Log.d(TAG, "play loading...") + playCallback?.invoke(Loading) + } else if (event == TXLiveConstants.PLAY_EVT_PLAY_BEGIN) { + Log.d(TAG, "play begin...") + start() + playCallback?.invoke(Playing) + } else { + if (event < 0) { + Log.d(TAG, "play failed...$event, bundle: $bundle") + stop() + playCallback?.invoke(Failed(bundle?.toString() ?: "播放失败")) + } + } + } + + override fun onNetStatus(bundle: Bundle?) { + Log.d(TAG, "直播信息 => onNetStatus -> $bundle") + } + }) + + x.doOnDetach { + Log.d(TAG, "-- onDetachedFromWindow ---: $playUrl") + try { + player.stopPlay(true) + stop() + } finally { + target?.clear() + } + } + } + target = WeakReference(x) + return x + } + + + override fun getLastData(): VideoUrlData? { + return data + } + + private fun start() { + timer?.cancel() + scope.launch { + val result = requestVideoInfo() + if (result != null) { + data = result + } + delay(5000) + }.also { + timer = it + } + } + + private fun stop() { + timer?.cancel() + } + + private fun getApi(): IVideoLiveUrlApi? { + return MoGoRetrofitFactory.getInstanceNoCallAdapter(HostConst.getHost()).create(IVideoLiveUrlApi::class.java) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt index 2059af003a..64c92eb7d6 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt @@ -31,6 +31,7 @@ import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_DEMO import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_RAIN import com.mogo.eagle.core.function.api.setting.ISopSettingListener +import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager @@ -41,6 +42,7 @@ import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.obu.CallerObuApiManager import com.mogo.eagle.core.function.call.setting.CallerSopSettingManager +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.unmanned.CallerUnmannedListenerManager import com.mogo.eagle.core.function.call.vehicle.CallerSweeperModeListenerManager @@ -59,11 +61,13 @@ import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.mogo.vehicle.SweeperVehicleConfigUtils import com.mogo.eagle.core.utilcode.rv.divider.CommonDividerItemDecoration import com.mogo.eagle.core.utilcode.util.AppStateManager +import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.eagle.core.utilcode.util.GsonUtils.* import com.mogo.eagle.core.utilcode.util.ToastUtils import com.zhjt.mogo.adas.data.AdasConstants import com.zhjt.mogo.adas.data.bean.AdasParam import kotlinx.android.synthetic.main.layout_operate_panel.view.iv_operate_panel_close +import kotlinx.android.synthetic.main.layout_operate_panel_preference_widget_switch_compat.switchWidget import kotlinx.coroutines.launch import me.jessyan.autosize.utils.AutoSizeUtils import mogo.telematics.pad.MessagePad @@ -669,9 +673,10 @@ class OperatePanelLayout : LinearLayout { } } - class BusinessPreferenceFragmentCompat : OperatePanelDetailBase() { + class BusinessPreferenceFragmentCompat : OperatePanelDetailBase(), IReceivedMsgListener { companion object { + private const val TAG = "BusinessPreferenceFragmentCompat" private const val KEY_FAULT_REPORT_TIP = "fault_report_tip" private const val KEY_LIMIT_SPEED_MARKER = "limit_speed_marker" private const val KEY_WEATHER_EFFECT_SWITCH = "weather_effect_switch" @@ -680,6 +685,22 @@ class OperatePanelLayout : LinearLayout { private const val KEY_UNMANNED_DEMO_PULL_INTERVAL = "unmanned_demo_pull_interval" private const val KEY_SWEEPER_CLOUD_CONTROL = "sweeper_cloud_control" private const val KEY_LOOK_AROUND_360 = "look_around_360" + private const val KEY_DRIVE_SEAT_VIDEO_STREAM = "drive_seat_video_stream" + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + CallerTelematicListenerManager.addListener(TAG, this) + lifecycleScope.launchWhenResumed { + preferenceScreen.findPreferenceReal(KEY_DRIVE_SEAT_VIDEO_STREAM)?.also { + it.isEnabled = CallerDevaToolsManager.driveSeatVideoProvider()?.requestVideoInfo()?.livePlayUrl?.isNotEmpty() ?: false + } + } + } + + override fun onDestroyView() { + super.onDestroyView() + CallerTelematicListenerManager.removeListener(TAG) } override fun getDefaultVal(pref: Preference): Any? { @@ -758,6 +779,30 @@ class OperatePanelLayout : LinearLayout { return super.onPreferenceClick(preference) } + override fun onReceivedMsg(type: Int, byteArray: ByteArray) { + if (type == TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP) { + val s = String(byteArray) + clickEventAnalytics("视频流驾驶位开头-RSP->$s", false) + lifecycleScope.launchWhenResumed { + when(s) { + "01" -> { + //关闭成功 + FunctionBuildConfig.isDriveSeatVideoStream = false + preferenceScreen.findPreferenceReal(KEY_DRIVE_SEAT_VIDEO_STREAM)?.also { changeValue(it, false) } + } + "11" -> { + //打开成功 + FunctionBuildConfig.isDriveSeatVideoStream = true + preferenceScreen.findPreferenceReal(KEY_DRIVE_SEAT_VIDEO_STREAM)?.also { changeValue(it, true) } + } + else -> { + //关闭失败或打开失败 + } + } + } + } + } + override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { when (preference.key) { KEY_FAULT_REPORT_TIP -> { @@ -848,6 +893,15 @@ class OperatePanelLayout : LinearLayout { clickEventAnalytics("清扫云控业务", isChecked) return true } + KEY_DRIVE_SEAT_VIDEO_STREAM -> { + val isChecked = newValue as? Boolean ?: false + clickEventAnalytics("视频流驾驶位开关", isChecked) + val map = HashMap() + map["open"] = if (isChecked) "1" else "0" + map["playUrl"] = CallerDevaToolsManager.driveSeatVideoProvider()?.getLastData()?.livePlayUrl ?: "" + CallerTelematicManager.sendMsgToAllClients(TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_REQ, toJson(map).toByteArray()) + return false + } } return super.onPreferenceChange(preference, newValue) } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/xml/operate_panel_preference_details_business.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/xml/operate_panel_preference_details_business.xml index 5fd5b9faac..7e1c73ca89 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/xml/operate_panel_preference_details_business.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/xml/operate_panel_preference_details_business.xml @@ -51,5 +51,12 @@ android:title="360环视" android:persistent="false" android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" /> + \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt index eeb2a7d44b..c971c7d358 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt @@ -448,4 +448,11 @@ object FunctionBuildConfig { @Volatile @JvmField var maxSpeedLimit: Double = 0.0 + + /** + * 驾驶位视频流开关是否打开-运营面板使用 + */ + @Volatile + @JvmField + var isDriveSeatVideoStream: Boolean = false } \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/multidisplay/TelematicConstant.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/multidisplay/TelematicConstant.kt index d9491b76a2..7818326490 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/multidisplay/TelematicConstant.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/multidisplay/TelematicConstant.kt @@ -30,5 +30,16 @@ class TelematicConstant { const val V2N_AI_ROAD_SHI_GU = 207 // -------------------- For Android Unit Test ------ END ------------ + + /** + * 驾驶位视频流开关-请求 + */ + const val DRIVE_SEAT_VIDEO_STREAM_REQ = 208 + + + /** + * 驾驶位视频流开关-响应 + */ + const val DRIVE_SEAT_VIDEO_STREAM_RSP = 209 } } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt index 9054729d6b..9022f1d786 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt @@ -23,6 +23,7 @@ import com.mogo.eagle.core.function.api.devatools.mofang.* import com.mogo.eagle.core.function.api.devatools.perf.IMoGoCpuUsageProvider import com.mogo.eagle.core.function.api.lookaround.* import com.mogo.eagle.core.function.api.upgrade.* +import com.mogo.eagle.core.function.api.driver.video.IDriveSeatVideoProvider /** * 开发套件工具接口 @@ -367,4 +368,9 @@ interface IDevaToolsProvider : IProvider { * 接管 */ fun takeOver(@TakeOverAnnotation takeOverAnnotation: Int) + + /** + * 驾驶位视频流相关业务逻辑提供者 + */ + fun driveSeatVideoProvider(): IDriveSeatVideoProvider } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/driver/video/IDriveSeatVideoProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/driver/video/IDriveSeatVideoProvider.kt new file mode 100644 index 0000000000..ac4bf34c29 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/driver/video/IDriveSeatVideoProvider.kt @@ -0,0 +1,34 @@ +package com.mogo.eagle.core.function.api.driver.video + +import android.view.View +import com.zhjt.mogo_core_function_devatools.driver.video.vo.VideoUrlData + +interface IDriveSeatVideoProvider { + + /** + * 视频直播是否可用 + * @return true: 可用; false: 不可用 + */ + suspend fun requestVideoInfo(): VideoUrlData? + + /** + * 获取司机位视频展示控件 + */ + fun getDriveVideoView(playUrl: String, playCallback: ((Event) -> Unit)? = null): View? + + + /** + * 获取最新的视频数据 + */ + fun getLastData(): VideoUrlData? + + + sealed class Event { + + object Loading: Event() + + object Playing: Event() + + data class Failed(val msg: String): Event() + } +} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/driver/video/vo/VideoUrlData.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/driver/video/vo/VideoUrlData.kt new file mode 100644 index 0000000000..f0540bd153 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/driver/video/vo/VideoUrlData.kt @@ -0,0 +1,6 @@ +package com.zhjt.mogo_core_function_devatools.driver.video.vo + +import androidx.annotation.Keep + + +@Keep data class VideoUrlData(var cameraType: Int? = null, var livePlayUrl: String? = null) \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt index fc7d401cf0..5e9e91e923 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt @@ -28,6 +28,7 @@ import com.mogo.eagle.core.function.api.devatools.strict.* import com.mogo.eagle.core.function.api.lookaround.* import com.mogo.eagle.core.function.call.base.CallerBase import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.function.api.driver.video.IDriveSeatVideoProvider object CallerDevaToolsManager { @@ -470,4 +471,8 @@ object CallerDevaToolsManager { fun takeOver(@TakeOverAnnotation takeOverAnnotation: Int) { devaToolsProviderApi?.takeOver(takeOverAnnotation) } + + fun driveSeatVideoProvider(): IDriveSeatVideoProvider? { + return devaToolsProviderApi?.driveSeatVideoProvider() + } } \ No newline at end of file