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 index 0669d5e034..8344aa300b 100644 --- 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 @@ -16,6 +16,8 @@ import com.mogo.eagle.core.function.api.driver.video.IDriveSeatVideoProvider.Eve import com.mogo.eagle.core.function.api.driver.video.IDriveSeatVideoProvider.Event.Playing import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.eagle.core.network.apiCall +import com.mogo.eagle.core.network.request import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.util.AppStateManager import com.tencent.liteav.basic.log.TXCLog @@ -48,9 +50,11 @@ class DriveSeatVideoProviderImpl : IDriveSeatVideoProvider { private const val TAG = "DriveSeatVideoProvider" } - @Volatile private var target: WeakReference? = null + @Volatile + private var target: WeakReference? = null - @Volatile private var timer: Job? = null + @Volatile + private var timer: Job? = null private val scope by lazy { CoroutineScope(Dispatchers.IO + SupervisorJob()) } @@ -63,22 +67,40 @@ class DriveSeatVideoProviderImpl : IDriveSeatVideoProvider { 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 + suspend fun requestVideoLiveUrl( + @Query(value = "numberPlate") numberPlate: String, + @Query("cameraType") cameraType: Int, + @Query("protocolType") protocolType: Int + ): BaseResponse } - - override suspend fun requestVideoInfo(): VideoUrlData? { + override fun requestVideoInfo(onSuccess: (VideoUrlData) -> Unit, onError: (String) -> Unit) { val plateNumber = CallerDataCenterBizListener.getPlateNumber() // val plateNumber = "京A40188D" Log.d(TAG, "requestVideoInfo -> $plateNumber") if (plateNumber == null || TextUtils.isEmpty(plateNumber)) { Log.e(TAG, "-- isVideoLiveUsable -- plate number is empty.") - return null + onError.invoke("plate number is empty.") + } + request> { + loader { + apiCall { + getApi().requestVideoLiveUrl(plateNumber!!, 2, 2) + } + } + onSuccess { + data = it.result + Log.e( + TAG, + "-- isVideoLiveUsable -- receive 请求成功: { msg: ${it.msg}, result: ${it.result}}" + ) + onSuccess.invoke(it.result) + } + onError { + Log.e(TAG, "-- isVideoLiveUsable -- receive 请求失败: { msg: ${it.message}") + onError.invoke("请求失败 , ${it.message}") + } } - 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? { @@ -148,7 +170,8 @@ class DriveSeatVideoProviderImpl : IDriveSeatVideoProvider { } - @OptIn(ExperimentalCoroutinesApi::class) override fun poller(): Flow = channelFlow { + @OptIn(ExperimentalCoroutinesApi::class) + override fun poller(): Flow = channelFlow { if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { throw AssertionError("此方法不支持司机屏使用") } @@ -174,13 +197,12 @@ class DriveSeatVideoProviderImpl : IDriveSeatVideoProvider { Log.d(TAG, "开启定时轮询请求...") while (true) { Log.d(TAG, "当次请求开始...") - val result = requestVideoInfo() - if (result != null) { - data = result + requestVideoInfo({ + data = it chl.get()?.trySend(true) - } else { + },{ chl.get()?.trySend(false) - } + }) Log.d(TAG, "当次请求结束...") delay(5000) } @@ -200,7 +222,8 @@ class DriveSeatVideoProviderImpl : IDriveSeatVideoProvider { return isPlaying.get() } - private fun getApi(): IVideoLiveUrlApi? { - return MoGoRetrofitFactory.getInstanceNoCallAdapter(HostConst.HOST_RELEASE).create(IVideoLiveUrlApi::class.java) + private fun getApi(): IVideoLiveUrlApi { + return MoGoRetrofitFactory.getInstanceNoCallAdapter(HostConst.HOST_RELEASE) + .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 5028ea6cd0..4d7332c31a 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 @@ -700,7 +700,11 @@ class OperatePanelLayout : LinearLayout { CallerTelematicListenerManager.addListener(TAG, this) lifecycleScope.launchWhenResumed { val p = preferenceScreen.findPreferenceReal(KEY_DRIVE_SEAT_VIDEO_STREAM)?.also { - it.isEnabled = CallerDevaToolsManager.driveSeatVideoProvider()?.requestVideoInfo()?.livePlayUrl?.isNotEmpty() ?: false + CallerDevaToolsManager.driveSeatVideoProvider()?.requestVideoInfo({ data -> + it.isEnabled = !data.livePlayUrl.isNullOrEmpty() + },{ _ -> + it.isEnabled = false + }) } if (FunctionBuildConfig.isDriveSeatVideoStream && p?.isEnabled == true) { 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 index 5e10c2a4e7..2f34693f24 100644 --- 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 @@ -10,7 +10,7 @@ interface IDriveSeatVideoProvider { * 视频直播是否可用 * @return true: 可用; false: 不可用 */ - suspend fun requestVideoInfo(): VideoUrlData? + fun requestVideoInfo(onSuccess: (VideoUrlData) -> Unit, onError: (String) -> Unit) /** * 获取司机位视频展示控件