From 4480001fba9e0eb3ff968927c11d0a63d7752996 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Wed, 24 Nov 2021 10:30:29 +0800 Subject: [PATCH] =?UTF-8?q?[Fix]=E8=A7=A3=E5=86=B3=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E6=B5=81=E5=8A=9F=E8=83=BD=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/camera/CameraListAdapter.kt | 2 +- .../function/hmi/ui/camera/CameraListView.kt | 29 ++-- .../function/monitoring/CronTaskManager.kt | 134 ++++++++++-------- .../monitoring/MoGoMonitoringProvider.java | 6 +- .../monitoring/net/CameraListServices.kt | 3 + .../redlightwarning/RedLightWarningManager.kt | 16 ++- .../data/camera/OpenCameraStreamEntity.kt | 11 ++ .../function/call/hmi/CallerHmiManager.kt | 3 + .../widget/media/video/SimpleVideoPlayer.kt | 16 +++ 9 files changed, 147 insertions(+), 73 deletions(-) create mode 100644 core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/camera/OpenCameraStreamEntity.kt diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListAdapter.kt index ce7a1976b3..63cd6d1e05 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListAdapter.kt @@ -36,7 +36,7 @@ class CameraListAdapter : Adapter { data?.let { val cameraEntity = it[position] holder.cameraInfo.text = with(cameraEntity) { - if (!isCarLive()) "${roadName}${crossingName}${getHeadingStr()}" else "${street}${township}" + if (!isCarLive()) "${crossingName}${headingDesc}${getHeadingStr()}" else "${street}${township}" } holder.bottomLine.visibility = if (it.size - 1 == position) View.INVISIBLE else View.VISIBLE diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListView.kt index 1b80f54363..753137155f 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListView.kt @@ -23,8 +23,12 @@ import com.mogo.eagle.core.widget.media.video.SimpleVideoPlayer import com.mogo.utils.logger.Logger 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.view_camera_list.view.* +import tv.danmaku.ijk.media.player.IjkMediaPlayer import java.lang.Exception /** @@ -88,16 +92,14 @@ class CameraListView : FrameLayout { if (cameraEntity is CameraEntity) { when { !cameraEntity.isCarLive() -> { - // 开启摄像头推流 - cameraEntity.ip?.let { ip -> - // 华哥那边现在只支持一个ip"183.242.46.150",现在不用这一套 -// CallerMonitorManager.openCameraStream(ip) - // 测试一直打开的顺义摄像头,不需要调接口让摄像头开启推流,现在走这一套流程 - if (!cameraEntity.flvUrl.isNullOrEmpty()) { - gsyVideoPlay(cameraEntity.flvUrl!!) - } else { - Logger.e(TAG, "视频播放地址为空!") - } + if (!cameraEntity.flvUrl.isNullOrEmpty()) { + Logger.d(TAG, "播放地址为:${cameraEntity.flvUrl!!},ip为:${cameraEntity.ip}") + gsyVideoPlay(cameraEntity.flvUrl!!) + } else if (!cameraEntity.ip.isNullOrEmpty()) { + Logger.d(TAG, "打开推流的摄像头ip为:${cameraEntity.ip}") + CallerMonitorManager.openCameraStream(cameraEntity.ip!!) + } else { + Logger.e(TAG, "摄像头视频播放地址和ip均为空") } } else -> { @@ -132,7 +134,12 @@ class CameraListView : FrameLayout { isPlaySuccess = false isFirstPage = true } + val list: MutableList = ArrayList() + list.add(VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "reconnect", 3)) + GSYVideoManager.instance().optionModelList = list GSYVideoType.setShowType(GSYVideoType.SCREEN_MATCH_FULL) + PlayerFactory.setPlayManager(IjkPlayerManager::class.java) + IjkPlayerManager.setLogLevel(IjkMediaPlayer.IJK_LOG_DEBUG) svpPlayer.setPlayListener(object : SimpleVideoPlayer.PlayListener { override fun onPlayEvent(event: Int) { Logger.d(TAG, "onPlayEvent: event is:$event") @@ -284,6 +291,8 @@ class CameraListView : FrameLayout { gsyVideoOptionBuilder.setUrl(flvUrl) .setCacheWithPlay(false) .setAutoFullWithSize(false) + .setIsTouchWigetFull(false) + .setIsTouchWiget(false) .setPlayTag(TAG).build(svpPlayer) svpPlayer.startButton.performClick() } diff --git a/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt b/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt index 0568636a17..b87e3adef6 100644 --- a/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt +++ b/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.monitoring +import android.content.Context import android.os.Handler import android.os.Looper import android.os.Message @@ -14,17 +15,20 @@ import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers -class CronTaskManager { +class CronTaskManager(private var context: Context?) { private val TAG = "CronTaskManager" private val CRON_TASK_TYPE = 1011 private val netWork by lazy { MogoApisHandler.getInstance().apis.networkApi } + // 请求路侧摄像头 private var disposable: Disposable? = null + // 请求车侧摄像头 private var carDisposable: Disposable? = null + // 开启路侧摄像头推流 private var streamDisposable: Disposable? = null private var cameraList: List? = null @@ -36,7 +40,7 @@ class CronTaskManager { when (msg.what) { CRON_TASK_TYPE -> { removeMessages(CRON_TASK_TYPE) - // 路测和车侧摄像头列表分开调用 + // 路测和车侧摄像头列表分开调用 // requestCameraList() requestDeviceList() requestCarCameraList() @@ -57,8 +61,10 @@ class CronTaskManager { crossing.cameras.filter { camera -> !camera.flvUrl.isNullOrEmpty() }.map { - CameraEntity(it.flvUrl, "", it.roadName, - it.crossingName, it.getHeadingStr(), it.ip) + CameraEntity( + it.flvUrl, "", it.roadName, + it.crossingName, it.getHeadingStr(), it.ip + ) } } ?: ArrayList() } @@ -76,9 +82,8 @@ class CronTaskManager { * 请求路口一定范围内的设备信息(包含:摄像头、灯) */ private fun requestDeviceList() { - CallerMapLocationListenerManager.getCurrentLocation()?.let { location -> - // 办公室测试顺义摄像头(116.74071467, 40.20051636) - disposable = netWork.create(CameraListServices::class.java, HostConst.MEC_ETL_HOST) + MogoApisHandler.getInstance().apis.mapServiceApi.getSingletonLocationClient(context).lastKnowLocation?.let { location -> + disposable = netWork.create(CameraListServices::class.java, HostConst.CITY_HOST) .getDeviceList(location.longitude, location.latitude, 500) .subscribeOn(Schedulers.io()) .map { cameraListInfo -> @@ -86,8 +91,10 @@ class CronTaskManager { crossing.cameras.filter { camera -> !camera.ip.isNullOrEmpty() }.map { - CameraEntity(it.flvUrl, "", it.roadName, - it.crossingName, it.getHeadingStr(), it.ip) + CameraEntity( + it.flvUrl, "", it.roadName, + it.crossingName, it.getHeadingStr(), it.ip + ) } } ?: ArrayList() } @@ -97,7 +104,10 @@ class CronTaskManager { Logger.d(TAG, "requestDeviceList返回结果为:$it") }, { it.printStackTrace() - Logger.e(TAG, "requestDeviceList:message is:${it.message}, cause is:${it.cause}") + Logger.e( + TAG, + "requestDeviceList:message is:${it.message}, cause is:${it.cause}" + ) }) } ?: run { Logger.e(TAG, "CurrentLocation is null!") @@ -105,25 +115,30 @@ class CronTaskManager { } private fun requestCarCameraList() { - CallerMapLocationListenerManager.getCurrentLocation()?.let { location -> - carDisposable = netWork.create(CameraListServices::class.java, HostConst.LAUNCHER_SNAPSHOT_HOST) - .getCarCameraList(ReqLiveCarBean(location.longitude, location.latitude)) - .subscribeOn(Schedulers.io()) - .map { liveCarCameraInfo -> - liveCarCameraInfo.result?.liveCamera?.filter { liveCarCamera -> - !liveCarCamera.videoSn.isNullOrEmpty() - }?.map { cameraInfo -> - CameraEntity(sn = cameraInfo.videoSn, street = cameraInfo.street, township = cameraInfo.township) - } ?: ArrayList() - } - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ - carCameraList = it - Logger.d(TAG, "requestCarCameraList返回结果为:$it") - }, { - Logger.e(TAG, "message is:${it.message}, cause is:${it.cause}") - it.printStackTrace() - }) + MogoApisHandler.getInstance().apis.mapServiceApi.getSingletonLocationClient(context).lastKnowLocation?.let { location -> + carDisposable = + netWork.create(CameraListServices::class.java, HostConst.CITY_HOST) + .getCarCameraList(ReqLiveCarBean(location.longitude, location.latitude)) + .subscribeOn(Schedulers.io()) + .map { liveCarCameraInfo -> + liveCarCameraInfo.result?.liveCamera?.filter { liveCarCamera -> + !liveCarCamera.videoSn.isNullOrEmpty() + }?.map { cameraInfo -> + CameraEntity( + sn = cameraInfo.videoSn, + street = cameraInfo.street, + township = cameraInfo.township + ) + } ?: ArrayList() + } + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + carCameraList = it + Logger.d(TAG, "requestCarCameraList返回结果为:$it") + }, { + Logger.e(TAG, "message is:${it.message}, cause is:${it.cause}") + it.printStackTrace() + }) } ?: run { Logger.e(TAG, "CurrentLocation is null!") } @@ -132,21 +147,46 @@ class CronTaskManager { /** * 开启从摄像头拉流 */ + @Deprecated("已废弃", ReplaceWith("requestDeviceList()"), DeprecationLevel.WARNING) fun requestOpenCamera(cameraIp: String) { streamDisposable?.let { if (!it.isDisposed) it.dispose() } - streamDisposable = netWork.create(CameraListServices::class.java, HostConst.OPEN_CAMERA_STREAM_HOST) - .openCameraStream(cameraIp) + streamDisposable = + netWork.create(CameraListServices::class.java, HostConst.OPEN_CAMERA_STREAM_HOST) + .openCameraStream(cameraIp) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + Logger.d(TAG, "openCameraStream返回结果为:$it") + it.result?.let { streamResult -> + if (!streamResult.flvUrl.isNullOrEmpty()) CallerHmiManager.startRoadCameraLive( + streamResult.flvUrl!! + ) + } + }, { + Logger.e(TAG, "openCameraStream&message is:${it.message}, cause is:${it.cause}") + CallerHmiManager.showNoSignalView() + it.printStackTrace() + }) + } + + /** + * 打开单个视频推流 + */ + fun reqOpenCameraStream(cameraIp: String) { + streamDisposable?.let { + if (!it.isDisposed) it.dispose() + } + streamDisposable = netWork.create(CameraListServices::class.java, HostConst.CITY_HOST) + .reqOpenCameraStream(cameraIp) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ - Logger.d(TAG, "openCameraStream返回结果为:$it") - it.result?.let { streamResult -> - if (!streamResult.flvUrl.isNullOrEmpty()) CallerHmiManager.startRoadCameraLive(streamResult.flvUrl!!) - } + Logger.d(TAG, "reqOpenCameraStream返回结果为:$it") + if (!it.flvUrl.isNullOrEmpty()) CallerHmiManager.startRoadCameraLive(it.flvUrl!!) }, { - Logger.e(TAG, "openCameraStream&message is:${it.message}, cause is:${it.cause}") + Logger.e(TAG, "reqOpenCameraStream&message is:${it.message}, cause is:${it.cause}") CallerHmiManager.showNoSignalView() it.printStackTrace() }) @@ -159,27 +199,6 @@ class CronTaskManager { fun getCameraList() = ArrayList().apply { cameraList?.let { addAll(it) } carCameraList?.let { addAll(it) } -// // 不需要走华哥打开推流的接口,顺义直接就可以播放的摄像头直播地址 -// add( -// CameraEntity("https://video.zhidaohulian.com/live/origin_13_44.flv?txSecret=dc913522389abfc2ab1f2b72f9f4ef41&txTime=6AABBEB2", -// "", "顺义测试道路", -// "路口1", "朝向1", "183.242.46.150") -// ) -// add( -// CameraEntity("https://video.zhidaohulian.com/live/origin_13_45.flv?txSecret=7fee9c4ae986169d0e9bd0e1c1b7fab8&txTime=6AABBEB2", -// "", "顺义测试道路", -// "路口2", "朝向2", "183.242.46.150") -// ) -// add( -// CameraEntity("https://video.zhidaohulian.com/live/origin_13_46.flv?txSecret=d5ddbd2236743bcf177563bb6680a462&txTime=6AABBEB2", -// "", "顺义测试道路", -// "路口3", "朝向3", "183.242.46.150") -// ) -// add( -// CameraEntity("https://video.zhidaohulian.com/live/origin_13_48.flv?txSecret=397b1296eb548c737871fca242ff7ec5&txTime=6AABBEB2", -// "", "顺义测试道路", -// "路口4", "朝向4", "183.242.46.150") -// ) } fun clear() { @@ -189,6 +208,7 @@ class CronTaskManager { } fun onDestroy() { + context = null disposable?.dispose() carDisposable?.dispose() streamDisposable?.let { diff --git a/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/MoGoMonitoringProvider.java b/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/MoGoMonitoringProvider.java index b2241b9148..672ee0cd64 100644 --- a/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/MoGoMonitoringProvider.java +++ b/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/MoGoMonitoringProvider.java @@ -31,7 +31,7 @@ public class MoGoMonitoringProvider implements IMoGoMonitoringProvider { @Override public void init(Context context) { Logger.d(TAG, "初始化……"); - mCronTaskManager = new CronTaskManager(); + mCronTaskManager = new CronTaskManager(context); mCronTaskManager.startCronTask(); } @@ -42,7 +42,9 @@ public class MoGoMonitoringProvider implements IMoGoMonitoringProvider { @Override public void openCameraStream(String cameraIp) { - mCronTaskManager.requestOpenCamera(cameraIp); + // 现在不用华哥接口,改用卫明的打开视频推流接口 +// mCronTaskManager.requestOpenCamera(cameraIp); + mCronTaskManager.reqOpenCameraStream(cameraIp); } @Override diff --git a/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/net/CameraListServices.kt b/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/net/CameraListServices.kt index c4aad2e21a..bfd67c564d 100644 --- a/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/net/CameraListServices.kt +++ b/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/net/CameraListServices.kt @@ -14,6 +14,9 @@ interface CameraListServices { @GET("/openStream/{cameraIp}") fun openCameraStream(@Path("cameraIp") cameraIp: String): Single + @GET("/camera-stream/stream/camera/openStream") + fun reqOpenCameraStream(@Query("ip") cameraIp: String): Single + @GET("/mec-etl-server/crossing/geo/device") fun getDeviceList( @Query("lon") lon: Double, @Query("lat") lat: Double, diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/RedLightWarningManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/RedLightWarningManager.kt index 525060c745..b95ddaf5af 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/RedLightWarningManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/RedLightWarningManager.kt @@ -3,9 +3,11 @@ package com.mogo.eagle.core.function.v2x.redlightwarning import com.mogo.eagle.core.data.trafficlight.* import com.mogo.eagle.core.data.trafficlight.TrafficLightStatusHelper.getCurrentRoadTrafficLight import com.mogo.eagle.core.function.api.trafficlight.IMoGoTrafficLightListener +import com.mogo.eagle.core.function.api.vip.IMoGoVipSetListener import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager import com.mogo.eagle.core.function.call.trafficlight.CallTrafficLightListenerManager +import com.mogo.eagle.core.function.call.vip.CallVipSetListenerManager import com.mogo.eagle.core.utilcode.util.SPUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.module.common.enums.EventTypeEnum @@ -15,7 +17,9 @@ import kotlin.math.ceil import kotlin.math.floor -class RedLightWarningManager : IMoGoTrafficLightListener { +class RedLightWarningManager : IMoGoTrafficLightListener, IMoGoVipSetListener { + + private var vip: Boolean = false companion object { @@ -32,14 +36,19 @@ class RedLightWarningManager : IMoGoTrafficLightListener { } } + override fun onVipSet(status: Boolean) { + vip = status + } + fun listenTrafficLight() { CallTrafficLightListenerManager.registerTrafficLightListener(TAG, this) + CallVipSetListenerManager.registerVipSetListener(TAG, this) } private fun handleRedLightWarning(trafficLightStatus: TrafficLightStatus, yellowLightTime: Int = 0) { // 如果是Vip则不处理 - if (SPUtils.getInstance().getLong("vip") > 0) { - Logger.w(TAG, "Vip用户不处理闯红灯预警逻辑!") + if (vip) { + Logger.w(TAG, "Vip用户不处理闯红灯、绿灯通行预警逻辑!") return } // 路口100m闯红灯预警 @@ -147,5 +156,6 @@ class RedLightWarningManager : IMoGoTrafficLightListener { fun onDestroy() { CallTrafficLightListenerManager.unRegisterTrafficLightListener(TAG) + CallVipSetListenerManager.unRegisterVipSetListener(TAG) } } \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/camera/OpenCameraStreamEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/camera/OpenCameraStreamEntity.kt new file mode 100644 index 0000000000..e35fdf4aff --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/camera/OpenCameraStreamEntity.kt @@ -0,0 +1,11 @@ +package com.mogo.eagle.core.data.camera + +import androidx.annotation.Keep +import com.google.gson.annotations.SerializedName +import com.mogo.eagle.core.data.BaseData + +@Keep +data class OpenCameraStreamEntity ( + @SerializedName("data") + var flvUrl: String? + ): BaseData() \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt index 03a802ce74..70705c09a5 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt @@ -190,6 +190,9 @@ object CallerHmiManager : CallerBase() { waringProviderApi.vipIdentification(visible) } + /** + * 开启道路视频直播 + */ fun startRoadCameraLive(flvUrl: String) { waringProviderApi.startRoadCameraLive(flvUrl) } diff --git a/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/SimpleVideoPlayer.kt b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/SimpleVideoPlayer.kt index 52f51d3f69..8c89792bba 100644 --- a/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/SimpleVideoPlayer.kt +++ b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/SimpleVideoPlayer.kt @@ -5,6 +5,7 @@ import android.util.AttributeSet import android.view.Surface import android.view.View import android.widget.ImageView +import androidx.core.view.postDelayed import com.mogo.eagle.core.widget.R import com.shuyu.gsyvideoplayer.GSYVideoManager import com.shuyu.gsyvideoplayer.utils.GSYVideoType @@ -27,6 +28,7 @@ class SimpleVideoPlayer : StandardGSYVideoPlayer { private var playListener: PlayListener? = null private lateinit var start: ImageView + private var updateTimer = 0L interface PlayListener { fun onPlayEvent(event: Int) @@ -136,11 +138,25 @@ class SimpleVideoPlayer : StandardGSYVideoPlayer { isPostBufferUpdate = false } + private var runnable = object :Runnable { + override fun run() { + updateTimer++ + postDelayed(this, 1000) + if (updateTimer >= 3) { + removeCallbacks(this) + playListener?.onPlayEvent(PLAY_EVT_PLAY_ERROR) + } + } + } + override fun onSurfaceUpdated(surface: Surface) { super.onSurfaceUpdated(surface) if (mThumbImageViewLayout != null && mThumbImageViewLayout.visibility == View.VISIBLE) { mThumbImageViewLayout.visibility = View.INVISIBLE } + updateTimer = 0 + removeCallbacks(runnable) + postDelayed(runnable, 1000) } override fun onPrepared() {