From d73275ae374756ea45c09ec94c3f314930de3cb2 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Thu, 4 Nov 2021 15:41:22 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=8C=E8=BD=A6=E8=B6=85=E8=A7=86=E8=B7=9D?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chenfufeng --- .../mogo-core-function-hmi/build.gradle | 1 + .../core/function/hmi/ui/MoGoHmiFragment.kt | 85 ++++++- .../hmi/ui/camera/CameraListAdapter.kt | 55 +++++ .../function/hmi/ui/camera/CameraListView.kt | 216 ++++++++++++++++++ .../hmi/warning/MoGoWarningProvider.kt | 1 + .../icon_camera_selected.png | Bin 0 -> 7145 bytes .../main/res/drawable-xxhdpi/icon_back.png | Bin 0 -> 2189 bytes .../res/drawable-xxhdpi/icon_camera_nor.png | Bin 0 -> 7589 bytes .../drawable-xxhdpi/icon_camera_selected.png | Bin 0 -> 7145 bytes .../res/drawable-xxhdpi/icon_close_nor.png | Bin 0 -> 2543 bytes .../res/drawable-xxhdpi/icon_rideo_nor.png | Bin 0 -> 3031 bytes .../main/res/drawable-xxhdpi/icon_signal.png | Bin 0 -> 6594 bytes .../src/main/res/layout/fragment_hmi.xml | 12 +- .../src/main/res/layout/item_camera_info.xml | 44 ++++ .../src/main/res/layout/view_camera_list.xml | 91 ++++++++ .../build.gradle | 4 + .../function/monitoring/CronTaskManager.kt | 67 ++++++ .../monitoring/MoGoMonitoringProvider.java | 14 +- .../monitoring/net/CameraListServices.kt | 11 + .../eagle/core/data/camera/CameraListInfo.kt | 86 +++++++ .../api/hmi/warning/IMoGoWaringProvider.kt | 1 + .../monitoring/IMoGoMonitoringProvider.java | 5 +- .../function/call/hmi/CallerHmiManager.kt | 2 +- .../call/monitor/CallerMonitorManager.kt | 17 ++ .../core/widget/RoundConstraintLayout.java | 3 + .../module/common/constants/HostConst.java | 1 + 26 files changed, 709 insertions(+), 7 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListAdapter.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi-2560x1440/icon_camera_selected.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_back.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_camera_nor.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_camera_selected.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_close_nor.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_rideo_nor.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_signal.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_camera_info.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_camera_list.xml create mode 100644 core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt create mode 100644 core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/net/CameraListServices.kt create mode 100644 core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/camera/CameraListInfo.kt create mode 100644 core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/monitor/CallerMonitorManager.kt diff --git a/core/function-impl/mogo-core-function-hmi/build.gradle b/core/function-impl/mogo-core-function-hmi/build.gradle index fbd29ca4bc..ebcb8b0017 100644 --- a/core/function-impl/mogo-core-function-hmi/build.gradle +++ b/core/function-impl/mogo-core-function-hmi/build.gradle @@ -70,6 +70,7 @@ dependencies { implementation project(':core:mogo-core-res') implementation project(':core:mogo-core-data') implementation project(':core:mogo-core-utils') + implementation project(':core:mogo-core-res') implementation project(':core:mogo-core-function-api') implementation project(':core:mogo-core-function-call') // implementation project(':core:mogo-core-res') diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt index 16cd74ee96..c012eac757 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt @@ -8,16 +8,19 @@ import android.view.WindowManager import android.view.animation.OvershootInterpolator import com.mogo.commons.mvp.MvpFragment import com.mogo.commons.voice.AIAssist +import com.mogo.eagle.core.data.camera.Camera import com.mogo.eagle.core.data.enums.WarningDirectionEnum import com.mogo.eagle.core.data.notice.NoticeNormalData import com.mogo.eagle.core.data.notice.NoticeTrafficStylePushData import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener +import com.mogo.eagle.core.function.call.monitor.CallerMonitorManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.notification.WarningFloat import com.mogo.eagle.core.function.hmi.notification.anim.DefaultAnimator import com.mogo.eagle.core.function.hmi.notification.enums.SidePattern import com.mogo.eagle.core.function.hmi.ui.notice.NoticeBannerView import com.mogo.eagle.core.function.hmi.ui.notice.NoticeFloatView +import com.mogo.eagle.core.function.hmi.ui.camera.CameraListView import com.mogo.eagle.core.function.hmi.ui.widget.V2XNotificationView import com.mogo.module.common.enums.EventTypeEnum import com.mogo.utils.logger.Logger @@ -32,9 +35,15 @@ class MoGoHmiFragment : MvpFragment MoGoWarningContract.View { var mWarningFloat: WarningFloat.Builder? = null + private var cameraListView: CameraListView? = null + private var cameraViewFloat: WarningFloat.Builder? = null override fun initViews() { - + ivCameraIcon.setOnClickListener { + if (cameraViewFloat == null) { + showCameraList(CallerMonitorManager.getCameraList()) + } + } } override fun getLayoutId(): Int { @@ -61,7 +70,6 @@ class MoGoHmiFragment : MvpFragment viewCheckStatus.visibility = visibility } - /** * 展示VR下V2X预警 * @@ -289,9 +297,80 @@ class MoGoHmiFragment : MvpFragment */ override fun showNoticeNormal(normalData: NoticeNormalData) { if (floatView == null) { - floatView = this.getContext()?.let { NoticeFloatView(it) } + floatView = this.context?.let { NoticeFloatView(it) } } floatView?.pushBeanChanged(normalData) } + private fun showCameraList(cameraList: List?) { + context?.let { + if (cameraViewFloat == null) { + if (cameraListView == null) { + cameraListView = CameraListView(it) + cameraListView!!.updateCameraData(cameraList) + } + cameraListView!!.setClickListener(object : CameraListView.ClickListener { + override fun onClose(v: View) { + dismissFloatView() + } + + override fun onShowLive(isShow: Boolean) { + when { + isShow -> ivCameraIcon.setBackgroundResource(R.drawable.icon_camera_selected) + else -> ivCameraIcon.setBackgroundResource(R.drawable.icon_camera_nor) + } + } + }) + cameraViewFloat = WarningFloat.with(it) + .setTag("CameraListFloat") + .setLayout(cameraListView!!) + .setSidePattern(SidePattern.RIGHT) + .setLocation(1742, 280) + .setImmersionStatusBar(true) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: WindowManager.LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern) + ?.apply { + interpolator = OvershootInterpolator() + } + + override fun exitAnim( + view: View, + params: WindowManager.LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + }) + .addWarningStatusListener(object : IMoGoWarningStatusListener { + override fun onDismiss() { + cameraViewFloat = null + cameraListView = null + ivCameraIcon.setBackgroundResource(R.drawable.icon_camera_nor) + } + }) + .show() + } else { + cameraViewFloat?.show() + } + } + } + + private fun dismissFloatView() { + cameraViewFloat?.let { + WarningFloat.dismiss(it.config.floatTag, false) + cameraViewFloat = null + cameraListView = null + } + } + + override fun onDestroy() { + super.onDestroy() + } } \ 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/camera/CameraListAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListAdapter.kt new file mode 100644 index 0000000000..9b3e5a6e07 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListAdapter.kt @@ -0,0 +1,55 @@ +package com.mogo.eagle.core.function.hmi.ui.camera + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView.Adapter +import androidx.recyclerview.widget.RecyclerView.ViewHolder +import com.mogo.eagle.core.data.camera.Camera +import com.mogo.eagle.core.function.hmi.R + +class CameraListAdapter: Adapter { + + private var context: Context? = null + var data: List? = null + private var clickListener: View.OnClickListener? = null + + constructor(context: Context, data: List?, clickListener: View.OnClickListener? = null) { + this.context = context + this.data = data + this.clickListener = clickListener + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CameraListHolder { + var view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_camera_info, parent, false) + return CameraListHolder(view) + } + + override fun onBindViewHolder(holder: CameraListHolder, position: Int) { + data?.let { + holder.cameraInfo.text = with(it[position]) { + "${roadName}${crossingName}" + } + holder.bottomLine.visibility = if (it.size - 1 == position) View.INVISIBLE else View.VISIBLE + if (position == 0) { + // 顺义可直接查看摄像头视频的地址,用来测试 + holder.itemView.tag = "https://video.zhidaohulian.com/live/origin_13_48.flv?txSecret=397b1296eb548c737871fca242ff7ec5&txTime=6AABBEB2" + } else { + holder.itemView.tag = it[position].flvUrl + } + holder.itemView.setOnClickListener(clickListener) + } + } + + override fun getItemCount() = data?.size ?: 0 + + class CameraListHolder : ViewHolder { + var cameraInfo: TextView = itemView.findViewById(R.id.tvCameraInfo) + var bottomLine: View = itemView.findViewById(R.id.viewBottomLine) + + constructor(itemView: View): super(itemView) + } +} \ 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/camera/CameraListView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListView.kt new file mode 100644 index 0000000000..80133aa45c --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListView.kt @@ -0,0 +1,216 @@ +package com.mogo.eagle.core.function.hmi.ui.camera + +import android.animation.ValueAnimator +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Color +import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.style.ForegroundColorSpan +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.FrameLayout +import androidx.recyclerview.widget.LinearLayoutManager +import com.mogo.eagle.core.data.camera.Camera +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.eagle.core.widget.media.video.SimpleVideoPlayer +import com.shuyu.gsyvideoplayer.GSYVideoManager +import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder +import com.shuyu.gsyvideoplayer.utils.GSYVideoType +import kotlinx.android.synthetic.main.view_camera_list.view.* +import java.lang.Exception + +/** + * @author ChenFufeng + * 行车超视距摄像头列表View + */ +class CameraListView : FrameLayout { + + private val TAG = "CameraListView" + + var cameraInfoList = ArrayList() + private var clickListener: ClickListener? = null + private val gsyVideoOptionBuilder by lazy { + GSYVideoOptionBuilder() + } + private val spannableStringBuilder by lazy { + SpannableStringBuilder("当前设备暂无信号,切换其他摄像头 3S") + } + + private val spannableStringBuilder2 by lazy { + SpannableStringBuilder("当前路口信号丢失,3S 后自动关闭") + } + private var isCloseStatus = true + private val valueAnimator by lazy { + ValueAnimator.ofInt(3, 0) + } + + @JvmOverloads + constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : super( + context, + attrs, + defStyleAttr + ) + + init { + LayoutInflater.from(context).inflate(R.layout.view_camera_list, this, true) + initView() + } + + private fun initView() { + rvCameraList.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + rvCameraList.adapter = CameraListAdapter(context, cameraInfoList) { + it.tag?.let { tag -> + isCloseStatus = false + showLiveView() + clickListener?.onShowLive(true) + val flvUrl = tag as String + gsyVideoOptionBuilder.setUrl(flvUrl) + .setCacheWithPlay(false) + .setAutoFullWithSize(false) + .setPlayTag(TAG).build(svpPlayer) + svpPlayer.startButton.performClick() + } + } + ivCloseIcon.setOnClickListener { + when { + isCloseStatus -> clickListener?.onClose(it) + else -> { + hideLiveView() + isCloseStatus = true + } + } + clickListener?.onShowLive(false) + } + GSYVideoType.setShowType(GSYVideoType.SCREEN_MATCH_FULL) + svpPlayer.setPlayListener(object : SimpleVideoPlayer.PlayListener { + override fun onPlayEvent(event: Int) { + when (event) { + SimpleVideoPlayer.PLAY_EVT_PLAY_LOADING -> { + + } + SimpleVideoPlayer.PLAY_EVT_PLAY_BEGIN -> { + progressBar.visibility = View.GONE + } + else -> { + showNoSignalView() + valueAnimator.start() + } + } + } + }) + // 后期可改为动态获取3s起始位置,暂时写死 + spannableStringBuilder.setSpan( + ForegroundColorSpan(Color.parseColor("#2966EE")), + spannableStringBuilder.length - 2, + spannableStringBuilder.length, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + ) + spannableStringBuilder2.setSpan( + ForegroundColorSpan(Color.parseColor("#2966EE")), + spannableStringBuilder2.length - 8, + spannableStringBuilder2.length - 6, + Spanned.SPAN_INCLUSIVE_INCLUSIVE + ) + valueAnimator.duration = 3000 + valueAnimator.addUpdateListener { + when (val currentValue = it.animatedValue as Int) { + 0 -> { + if (cameraInfoList.isNullOrEmpty()) { + clickListener?.onClose(ivSignalIcon) + } else { + hideNoSignalView() + } + } + else -> { + if (cameraInfoList.isNullOrEmpty()) { + spannableStringBuilder2.replace(9, 10, currentValue.toString()) + tvTipContent.text = spannableStringBuilder2 + } else { + spannableStringBuilder.replace(17, 18, currentValue.toString()) + tvTipContent.text = spannableStringBuilder + } + } + } + } + } + + fun updateCameraData(cameraInfoList: List?) { + if (cameraInfoList.isNullOrEmpty()) { + showNoSignalView() + valueAnimator.start() + } else { + this.cameraInfoList.clear() + this.cameraInfoList.addAll(cameraInfoList) + } + } + + fun setClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + + @SuppressLint("NotifyDataSetChanged") + fun refreshCameraList() { + rvCameraList.adapter?.notifyDataSetChanged() + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + stopLive() + valueAnimator.cancel() + } + + private fun stopLive() { + svpPlayer.removeAllViews() + try { + GSYVideoManager.releaseAllVideos() + } catch (e: Exception) { + e.printStackTrace() + } + } + + private fun showLiveView() { + tvCameraTitle.visibility = View.GONE + rvCameraList.visibility = View.GONE + svpPlayer.visibility = View.VISIBLE + progressBar.visibility = View.VISIBLE + ivCloseIcon.setBackgroundResource(R.drawable.icon_back) + } + + private fun hideLiveView() { + tvCameraTitle.visibility = View.VISIBLE + rvCameraList.visibility = View.VISIBLE + svpPlayer.visibility = View.GONE + progressBar.visibility = View.GONE + stopLive() + ivCloseIcon.setBackgroundResource(R.drawable.icon_close_nor) + } + + private fun showNoSignalView() { + ivSignalIcon.visibility = View.VISIBLE + tvTipContent.visibility = View.VISIBLE + tvCameraTitle.visibility = View.GONE + rvCameraList.visibility = View.GONE + svpPlayer.visibility = View.GONE + progressBar.visibility = View.GONE + } + + private fun hideNoSignalView() { + ivSignalIcon.visibility = View.GONE + tvTipContent.visibility = View.GONE + hideLiveView() + clickListener?.onShowLive(false) + } + + interface ClickListener { + fun onShowLive(isShow: Boolean) + fun onClose(v: View) + } +} \ 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/warning/MoGoWarningProvider.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/warning/MoGoWarningProvider.kt index 32e8748110..884d2cc8db 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/warning/MoGoWarningProvider.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/warning/MoGoWarningProvider.kt @@ -5,6 +5,7 @@ import android.util.Log import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import com.alibaba.android.arouter.facade.annotation.Route +import com.mogo.eagle.core.data.camera.Camera import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.enums.WarningDirectionEnum import com.mogo.eagle.core.data.notice.NoticeNormalData diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi-2560x1440/icon_camera_selected.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi-2560x1440/icon_camera_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..117d57346bb6147f2272c838b34d789c53055033 GIT binary patch literal 7145 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 actX1=h)Wo$ryuxF%%-BKsZb+l5%NEYW~HD2 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_back.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_back.png new file mode 100644 index 0000000000000000000000000000000000000000..e305deb3f43495413144c94cf30a27bdef5dd72f GIT binary patch literal 2189 zcmV;82y*v{P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91R-gj_1ONa40RR91R{#J203`G$R{#J9_en%SRCodHoZD{{RUF4zX}dux zmTRyGwl)o-wHnmWYAq7urM3D{Bjtg_#2EhuUPxb>KJj7#2{8r=!L%4JiHS8PYGMkC z7!08Z6=Pdn3beKjN-wl!i{I~LXPnuco!ictIWzD}zMb2-{LZIm&TVEku|!^54%e1J zB^f0%uFhdQpV2I~)0y*9Z4wfAvlKo&2yKMcWV9Mv0(D}9JOPbol*0Bhl!ijHu)wZD ziMK$N5P=p!e%dW0M!-YRMQ9QV)Pe-d+xk(c7Gezz(pZDfK^Gu4AHppNuw^L4v(S?e zZ~HKf&BIyf2k5#;M?`{UJNX>M8Y(g$FMMtz5^L~Di0!lQCZfRXbe@OmpnH7x*xv*f zk=!Y$4`L_ioB0j)5qS0rw8A$JgGuOLWb-vN;8%8jfn_ay4XW|Wv5?X^k9@y`3a-6= zfL#wq-h?=Wii2@z_9=9&kirz&OFx0k+aS)8;$j>Yas@`2^~cc5~!NV1*VwQE;-S6A2D$z+m)dCg{KW~OUu zYTh3j8oH^S^mpe9k~;)(eb-?5ngUJ$wi-f8da!fn&hjHij^se4yT!%DC1Yb_slL8G z+g{vb@z^9xK{>V7tn*^qvBP6Vfkq?LqeqXLLJiOnvLZ8snSo_(HQZ8$7?K<~fy$u*+mcW(La!%g4}lh7b}SIDxvjxR`ElZ~shS`>H2HW`;-j*^_Br^s8&a{OVoePhDv^<)!c+yz zRq}gzMJCHPqtg2*5mdTGhRSSJ1zW+hGFb$ns`x6oBPG}fLnYG+{vlWnZ28zh3X3>Y zG9=3)f?WsYTa3Y_;4B7E35zV(66|Uog>5l`s$yIt1=yHDCEV4agN-3n4Q!cOe}mq} z6e=;6vBrk-1UAM{2{uWvIji5iBGR^R-@el98I?Xy$!1h~*PQH^gi>So@892?{oqgU zZN#CnC<<7<>=me0S66Sc$ndr#3n~^a+Fnw?rfq}y9AIv4ZowkSL_3oUTbPDDXVg`4NHFgI2J9M&eASQ6ha)w}O!^&R?{=@*T!cqk*@^y08|E`F` zRamNE|3v9UeF)(iEF(k|E*X-g_FlnF><9JABlC4+5rj*IWT}DW{yF}U%_0U@W2iO- zXH*kA;dK$HoirpbIvePUZEH9jda=x_FVo0##6fWKb-+{+GqTib!D>5^f8Q4jL zIBN(c;eivli9}*)b8|D_{u60rMP>#w1Iqy4L4o{grNJAQ2TtJPDFr{t6lG*YRymdr zEEi_J%?T~x2`ji)VTTVNR%SwiTqh&4%CUT48IV={a!w2hPY`Z>ef^;mCr+GMSXh`( zr_;Ck`}+r4T3U|bvrqQeB8+VEHkk>V9LsS1Jt&m-yKH(1+?-ADnb>1yk!3uG*OQi@)`}k0e2%hP-pzJk$&Sy&_?gWH9^ADhKZAi` zGGNBU30TJC8Y98l{(27s$Jho@wl5&tJHjbgCiENhFvMS#xD)LP3f&Fy7wc`!DOe`N z1qQ<13`zGDBYYBR>}QTa%37~KC_1qJ@0i0Xt-TehRDr3J4^`vI0^;v#Q9#5R}BLllio z+s6<)tAb6$?OO@2nxLq(y&OvMwjY9gGZA3v9Pfl}P(38;n3v0aKSDo2p4(EyH8oLS z)y#^qvlSv>S!QfE;0uBN0&!d}#6*Kton{T@57E>@6;K#9j7-@norip{p-9tUL4nn0 zdOr>xhqgfL^%n%}UqhM~A$F{Wr>Fw*G9(!WSiJ+wa8QxaMr_&P6+vE%lNNSFDQGyO zS!_eGu)$^*n*Ojx6YwgC;5jxdLEi1Cz%!mR5iGEZ_|divUl zv{`<1_OaW*vp&iFBXN`Sl=JS`32Ae`OPVgmpX4rHN5PukUt7V2+`$yUqZ@tU%tgQh z;u+;*=^^mNTO1L11ub?UeR$7_Xneu-E`FzlL!qxXzocSo{gLxSl1+EaZr3`d+Ht94 zllmsbEOXk9B0Q#66nXLs%B{oi%#>o%Uw6n)+IO@Si~Kvbb7NtsYp#WjsINCs(=TyH zJ6LDE;1Y=1$#hPXDPBO!u;4Jtn;)&5m&7Pp30YV;DljTMh$gvc{r;)9SH}D7_(I2z z)c}hzf9#?iH5!g!0FBn_BkdZ$Qt4^+h+rIXaBz5pqZVil7~at{Ur&r~=e%c-xVu;z z*4T58=`#e_M~nX;f$CB_>{Nv7y(1do-`)Lw!~c7-5fL84N0jSgV$J%QXS=cW_q%>W?Y8Qu%=7Y zrc(?IkJk(XvF(EyP?jz2s=z8Y{rORR5e4sQqs1+9av zTwx%j8#~VU;+5=CNLW%?{!dDNdTZ-V)`t1JE$Rt!?Khp{)zLOFuf(sz_xF>LN~dtr zW0m}%M}IvTmB(IvXpsi6e=E|3( z9R2|bpc<*9!18falaZs3cS9Nv2xvg)4lJ)EW#8)?2$2XA+psq<;BK>Kii}a}@9>Uh zbN;-)LAvI^WmwFy8{Gk^j|*GLL%S=&vO(1DkEoXxv>}U9(@sK6YcwC7HQ7kS z65VSqy>e%@O=;-VYIzR zIHYU>DW-h>)!5)18GRopW}k|G349*CE&`=PpBTj?`krxug+mv86et1ns){O6kL%z5 zIdc+>e!pzNsXH~C1{zN1eOcM#CP5b28%zZxC|)=E2BSg?gtYJU46Z< zc)aiYFI=_(>&?92*8AD$*p+Sm*YV#g8>2W~R9%kKlj{-O?h3Fz;7wXd<#?}*jwfmT z6o^(d+5P$TSBb#W0wC2=AyD;ejYhl;^)t+;pNrWGEB?N!ZPTQrZ>!H(vlAmwue2I9 zPxV)N|N7v&wQln!)^xpn)3VGPbRF@vND+Tl3qt<^3*2Bl7T+Rf^3uhzv$JBqz3$pW z_Ddd7GSpoBQ-n=K_x|Q$r-L{kq`fY3BWOEY)Aa`Tq-#|4W}H%i9V=0xkT}xEA_D=g z+i#rL!7pc5t~j@1&GBiIbsdWYOa4`Jr(9exaoR6V^#z3fPJ9$COZ++|=W(HtHtV+wuMYyjg zkVD-3w7jeL^ddhVt);*-LAqV<&Z7J}%y4T5pX4wTw>2TF_~>X+!HXFbpqDNxoq@X7 zaaqwLI`NeTi+~gJ=@=V~v5pT@Pc+hjOJg8j`kB}K8XIDdz?NE8mVu#%vm1^6(&9@d z#{vO}1(c7LCMus&w5IF6`lTI}#g34Uk^cg=P7TFh@3vQVJZ6&CE>%*h&|`G)E?HhE z)_mva?%hsWhG*^DAKGfcaRtl3d#&Tb(`6oPGQiriY5N)H-_2UBG z`+f~)%rxu%)NXB>#0MAg)A-Qy*SLNK0Tow>+oyxqz_wL zKV3%HtrLG-Upw+FJPieeK=}j-ti5+iEj-#NA~@vOf=&y(t{(i+6~?#L6ZGD%A@+P) zYM3s)YGQ$hh^88gsep&yz_(x537tZqs4ul9&pRL1iMJmfCdI$MLd2}2m80Btb>iJc z4d~4v+=4wDIQ)JZPke}hB05cEJjHgWrFy>9#>3c&SzEy8b6s;GT0h}|#ITiYdMXBm zba9XyZzYIxEcon{b)ByBl93rQ z{rvg!itS}Ri&rWtnlw@Y)MUfz67jN$&-irIDIg(ODvJ_4QK z#AR(V1aB}b3o3*?pxmI035ldsqU@$g&9XUWZy#&+|2y(6^zCn%`j7SB?QeAEiRmNr zyOM0OH8nT$* z>ai_$+%)d?5tM(a2K395Mc>Fb%r21?B^O*O@=rWT9aLS&ftRMzsU}PnPL3@V6}aPT zeP4ck>+dJZo8|$cv*8d@!_RkBHoi(yupm^)i@@~s6o~d?G{hwUz>ly;J9&^X70*q} z^%|vEzH}hI98AcM-_KO8!H>KD*7LUPiXY@b5g&3xH+&)z~ANC^^KfDPW~k45UF z56I$4Y=!!`N#DE)$Rdj==Ez5`os#@z9v6_sh8Ob)`_8x>wYLc1lk)~{-JgH&-!<9Z z&d_e?Nx|+@F#Gvdl}<$1#N@VW5s%ZL(`vq@?OVJ>cPXK~20Efz(E^P^4o(P6t`8*& zdFP(NMnazgGz~Q-sjcT4rbcJS+^8{r=)nyMPoJkQYPA{{>>Ell%Bqzmjc;tcF3XHU z3(V1nzL|2L_h)m6!wYhI>ZUUf*f#UrwKMFB6}3%UC_O%5e@uV4#zT!WO)ZoF>jf7j*r;nJI@Xh5~1 zU)Wyb8B%ZqEq9gc0p=eclwD$nZ>0)^a~rjJTxD`HKODX7Qjbg^_bDbEi0P&HAuS*G z;YGCN?7;!|V&lozPXtPOJ>ntA3J(quxS?*OD>g9-*9M1MfniG8!89WbhoV;*&YZh? zHAT{SH?93~W(7H1cIzi#;-l0#z-$P^=W|pFqM*v)s*#oI($CJlTc0r++|}x zcV#cq5_R1DF}Nh5ZNleSNGnp(dG~YRT4gR&*m>@XN{~Z7DMo{PL<0{Pfs^KgtqZj{ zSayHoAt=ai_`r0A#Y4mFhswE^zVIR+Kys=r-QzF1 zWQ&~CWNo~vSSw&Ke9f1LRrT+y{G&A#sw#m6=waF=|Kg{D+p67_XwHUIuz0}dTW>k} z{W9)|j5DbC;Ua#zlv&j;sKCk1^4F=Lt}61)T2-f0gOG6JX#tIM)oJ}sJZ;Hr2wVXk z{CsWNiEnpE-DWPKjGJ9@d#-(pc(HoaiJABQSH488bPf|swB*Exm8|c4G zPPHLeHWnNjbc}I>G;^YQlAa54ePGQ(*I= zFr=}8fHp^+B^}(u@GCsX{?+e}Reh$*=ilQsR1cr#4V_=UJ1!K!L}s5A6uK+1q7#xz zpobWyL&1I;DrE4`o5u?#QNFa-p&EFJKSRFyebINCi;n&nPi&qOwaZKb8Toh9nw(bT znruW_cJ|_GyX|Vkw>J(uO+od)%&xZ3chp*#>c4)q_S+LOC_o-t9L{OA&eyRVXc*-B z9xa$|`<+PBHG2M-jYa#@<8+YC##OFHKNKx9s@m-uw?DdXIab&xq~x zBztu2%(}f?oO(|1Z3%yIG;%IdGYY)4Rmj))a6^2+85CI5@U_e(!4EiBknLSK`K-Hx@0=I@)b*yvJHH*O0;ls z85jc--^JQ~PWGp6s zFtJKAm^)jZ70%?BCt=MoiS@Rcpp1|<=u&Drw`qcJJcQ}Aw1A-c;h~;5BFoJp9Ey9Q z+%1H|@yc50zQI@s@FwNB(MU&$Hs>si_1Ck}<;DY~b;a2hwA24IZ~NvpoSr{4CC+5; zCz(qFSHLE@nwtXS`T#wu>LVS@4V_0eA#M7FAR64!kD+gJDqVWj|2u$flJkt~B`JgxG5)c$o zb?!&{>Mg-6%eQPe3TqkYom3iXzFEDwE%-T}C(zk{y6dr{d>LbUbJDHng%|&^<_O@8 zO&!0@r0k5sDIcAX3_X4D>Xkr=+Nn5kCO)Rk&i5=w(X;;aXB2Nd`uS$SnxfsJGg+3) zXmrjgxqgHMhrv^UxZAYVf{o2mn2T%Q=VPjcoSqhcyEdG)wDdIu%+bhS&}&N0qi_7M zZMgVSZMfWeSjyY*`g3)viwF#QbaZ}Fapg{_Am*a??iSTc!L02!1hzy~{M~^*wjoRN zUt6oIs-8J(6WTqqoYfB38Fz6Z>!cpoZ$5HazIQoN;G=M7z(qub6R&9lq4;ixF57al zfo9d$yOR?%_;G3vsJ>LbrhPl;`3XU?lQ~vZt3=Jk`2?it z@cOpiz<#%mdTsNw!@zVrx;;uT2ea5Hm;jzbF(c3M5-a zDAGG6>Q$%syTE_VKy|DpAq0!85B$17BSQ#*ANjCiP~~KDw?Gxs$BuVrshVYb=b4a+ zX?txTA}Hv2ia~bVab>b7^5GPlG9IU;==4{?7{ijP(s*Ucs4vB{W20;?32)k-!c#aU zF*idErHq`MX2ESdAKxcFjl-{T`Dz~epbR*owi zeO%=7mZk43p!KUh6}PW+lB5I0L@jV-5_+t!83F+)!RRGWf+=3d2*DXJ2|)0KGbo_L zdvF{C&pe!Sk*L2VAJdTf`)8XoZj726WGa3VOp0P?sq^zbpU4lG0~6~MyLtuP^lE&s zG!H5_S8oy?$7W*59r83-;hmPJzM)Q?U-|b4 zcXYiP`T`={lQ{Kqff>S3Mdz!mk?9{KiDyuRjdyHy#yGmBL&v_+DBF}Nn@PpqG_j>Xhw;m*(G{Z4hLT@wN^kRDbI3lSJ-n(?g`^_53pIu;Xa_ENpb&$)clM!5Z7Dr8sX@2wFVFgoem(Tk3GqZQFuzid8Yqr< zR?qbF^YR;`+CvfUydS%#$~MQe#}pZXn4g`CNU3Zitp&=2-KGHvW?+)gwt#&jd?(Ds z=$kn+!$&61ocZsxQrdfL;c5*w5uDUjRb(0a(bc%L!ki=RM$C&YOskTI`o`F*$rp_C z#eJARW9+!V-~u1F7V3xQsBp^$LdM}Rw;B9|Ujy6sQ-k)V$JIcPVO&L|g4}rjj`v)GsQW8#?DBmY0bK*`m}pCQTn4xgY)VT~*=T!UX=W?yVcZW}g5&C*B3?jtngi6Ok>c+cl`( z-T7aptn4{Z1HKWF|K`n$wOI=Zqg))_U?N%?YE6L(a)MOSAhO7XfBc%j=JvPGVS)W8 zO$ZQa8Dca6#3q|!W0!I#MD~gDe;MfJ9Kw9-!IGfSymF&LLx6fdJEj(_Cv~D_QSXVe@o#h^_G6968MU2dOI6=jIpxy27&|$IJXR zgJn20TRD5ApkvEP5x;_0qWL^dLKN_aEy(mnZ}`!o3|ocC0zOKce?cbtyoaQsI0+q7 zMJ^Lv{<~0|yaW62@W-j#*bYOU(!%0;_CNy6)5~P!B&oOR=Q-Qo87kTym z7$xi41}m<8#`;Ji$kE5$YB?m>6XTKXmcVsWz3b^&XzEt6$r5~hricX9q-j?E z$KCexBx)~k#|5KXgi}>*o6Q+6Fmh|2MdX9nKq>OR@L&>OC{{)b%JvD{Z|q10Rz!M| z%K1PI`(1>mNhVp|F*;EA)q1XhNVK5ozw0#_aEPfdRtyxb{ zmaUk$0B;8Tqf&Za+q{+qmdt}0frn)%0F-sMeO_Q8yyP>-uxzuRf=447EDZF)L`{L~ zL(Tj>+zCMKegQ&U+Qa9>@cOgK?c_-y74p}d$&Xy0D;!8-V)12EU+%LVDw{mi%Qt%& zm^;{Rk#p0N@WJHpL|S}05NY(95}&#on?Pc&JA1R}Cc}Ac6D(Nwk_uAemb2Q-K3ETU zCi3OmyRCf;%wXT4zPwjt=sHecyzx6z2TQlctWCe;*kCWF3p}2{aRtvEZ5=#a_68qy z5W@8aLZK_#Y0w2qevZ9GKZRsnZQBx9Bp)?PQdX@Bg zhv#~e|+k~Fx%0HSJFtOhMo6SbJrd$rCq{DqZ!hfK~Fw_VqMZRgbzBlz-sH#~G zf_4r<%q>}2uTE4eFQpuV>7R>pAL)Ngb;#*%y&W!KX9+3k2DK(R;=cbAT8>~1;_Y0d zFn2OBY3oo^c`JC!)Zd4<-Je?1__}nzGJ& zFyuiw_9ne}jgA`QBde>e98TF<1D3BbDD`cEQNmRFanmaz!^ EA9Q9wQ2+n{ literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_camera_selected.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_camera_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..117d57346bb6147f2272c838b34d789c53055033 GIT binary patch literal 7145 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 actX1=h)Wo$ryuxF%%-BKsZb+l5%NEYW~HD2 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_close_nor.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_close_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..5cce370a5196a89f86d763761be675a2bd8d3fdd GIT binary patch literal 2543 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 Z{s&opGmSD;Mydb+002ovPDHLkV1oKK(WL+Y literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_signal.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_signal.png new file mode 100644 index 0000000000000000000000000000000000000000..2a927ad2ba7b87c2dc24ae0011bf8e1b808ba5be GIT binary patch literal 6594 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 a!s8NYV!|c++w@=mL_t - + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_camera_info.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_camera_info.xml new file mode 100644 index 0000000000..e291851262 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_camera_info.xml @@ -0,0 +1,44 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_camera_list.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_camera_list.xml new file mode 100644 index 0000000000..8601e80aef --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_camera_list.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-monitoring/build.gradle b/core/function-impl/mogo-core-function-monitoring/build.gradle index 3f661075a1..9b0b62b968 100644 --- a/core/function-impl/mogo-core-function-monitoring/build.gradle +++ b/core/function-impl/mogo-core-function-monitoring/build.gradle @@ -56,11 +56,15 @@ dependencies { implementation rootProject.ext.dependencies.mogo_core_res implementation rootProject.ext.dependencies.mogo_core_data implementation rootProject.ext.dependencies.mogo_core_function_api + implementation rootProject.ext.dependencies.mogo_core_function_call + implementation rootProject.ext.dependencies.modulecommon } else { implementation project(':core:mogo-core-utils') implementation project(':core:mogo-core-res') implementation project(':core:mogo-core-data') implementation project(':core:mogo-core-function-api') + implementation project(':core:mogo-core-function-call') + implementation project(':modules:mogo-module-common') } } 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 new file mode 100644 index 0000000000..ed2abeda53 --- /dev/null +++ b/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt @@ -0,0 +1,67 @@ +package com.mogo.eagle.core.function.monitoring + +import android.os.Handler +import android.os.Looper +import android.os.Message +import com.mogo.eagle.core.data.camera.Camera +import com.mogo.eagle.core.function.monitoring.net.CameraListServices +import com.mogo.module.common.MogoApisHandler +import com.mogo.module.common.constants.HostConst +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers + +class CronTaskManager { + 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 cameraList: List? = null + + private val cronHandler: Handler = object : Handler(Looper.getMainLooper()) { + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + when (msg.what) { + CRON_TASK_TYPE -> { + removeMessages(CRON_TASK_TYPE) + requestCameraList() + sendEmptyMessageDelayed(CRON_TASK_TYPE, 10000) + } + } + } + } + + private fun requestCameraList() { + // 衡阳可直播的摄像头有限,先写死roadId便于调试 + disposable = netWork.create(CameraListServices::class.java, HostConst.CAMERA_STREAM_HOST) + .getCameraList("10849") + .subscribeOn(Schedulers.io()) + .map { cameraListInfo -> + cameraListInfo.result?.crossings?.flatMap { crossing -> + crossing.cameras.filter { camera -> + !camera.flvUrl.isNullOrEmpty() && !camera.rtmpUrl.isNullOrEmpty() + } + } ?: ArrayList() + } + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + cameraList = it + }, { + it.printStackTrace() + }) + } + + fun startCronTask() { + cronHandler.sendEmptyMessageDelayed(CRON_TASK_TYPE, 0) + } + + fun getCameraList() = cameraList + + fun clear() { + disposable?.dispose() + cronHandler.removeMessages(CRON_TASK_TYPE) + } +} \ No newline at end of file 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 3b1e2d4fa0..30c93c14b2 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 @@ -5,17 +5,22 @@ import android.content.Context; import androidx.annotation.NonNull; import com.alibaba.android.arouter.facade.annotation.Route; +import com.mogo.eagle.core.data.camera.Camera; import com.mogo.eagle.core.data.constants.MogoServicePaths; import com.mogo.eagle.core.function.api.monitoring.IMoGoMonitoringProvider; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; +import java.util.List; + /** * @author xiaoyuzhou * @date 2021/10/29 11:09 上午 */ @Route(path = MogoServicePaths.PATH_AI_MONITORING) public class MoGoMonitoringProvider implements IMoGoMonitoringProvider { + public String TAG = "MoGoMonitoringProvider"; + private CronTaskManager mCronTaskManager; @NonNull @Override @@ -26,11 +31,18 @@ public class MoGoMonitoringProvider implements IMoGoMonitoringProvider { @Override public void init(Context context) { Logger.d(TAG, "初始化……"); + mCronTaskManager = new CronTaskManager(); + mCronTaskManager.startCronTask(); + } + + @Override + public List getCameraList() { + return mCronTaskManager.getCameraList(); } @Override public void onDestroy() { - + mCronTaskManager.clear(); } } 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 new file mode 100644 index 0000000000..03cde67570 --- /dev/null +++ b/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/net/CameraListServices.kt @@ -0,0 +1,11 @@ +package com.mogo.eagle.core.function.monitoring.net + +import com.mogo.eagle.core.data.camera.CameraListInfo +import io.reactivex.Single +import retrofit2.http.GET +import retrofit2.http.Query + +interface CameraListServices { + @GET("/yycp-smartTransportationAiCloud-service/eagle/device/list") + fun getCameraList(@Query("roadId") roadId: String?): Single +} \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/camera/CameraListInfo.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/camera/CameraListInfo.kt new file mode 100644 index 0000000000..9610c0b543 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/camera/CameraListInfo.kt @@ -0,0 +1,86 @@ +package com.mogo.eagle.core.data.camera + +import androidx.annotation.Keep + +import com.google.gson.annotations.SerializedName +import com.mogo.eagle.core.data.BaseData +import java.io.Serializable + + +@Keep +data class CameraListInfo ( + @SerializedName("result") + var result: Result? +): BaseData() + +@Keep +data class Result( + @SerializedName("crossings") + var crossings: List +) + +@Keep +data class Crossing( + @SerializedName("cameras") + var cameras: List, + @SerializedName("id") + var id: Int, + @SerializedName("lat") + var lat: Double, + @SerializedName("lights") + var lights: List, + @SerializedName("lon") + var lon: Double +) + +@Keep +data class Camera( + @SerializedName("areaName") + var areaName: String, + @SerializedName("bindingStat") + var bindingStat: String, + @SerializedName("category") + var category: String, + @SerializedName("cityName") + var cityName: String, + @SerializedName("createTime") + var createTime: Long, + @SerializedName("creator") + var creator: String, + @SerializedName("crossingId") + var crossingId: Int, + @SerializedName("crossingName") + var crossingName: String, + @SerializedName("desc") + var desc: String, + @SerializedName("flvUrl") + var flvUrl: String?, + @SerializedName("heading") + var heading: Int, + @SerializedName("headingDesc") + var headingDesc: Any?, + @SerializedName("id") + var id: String, + @SerializedName("ip") + var ip: String, + @SerializedName("lat") + var lat: Double, + @SerializedName("lon") + var lon: Double, + @SerializedName("mac") + var mac: String, + @SerializedName("name") + var name: String, + @SerializedName("proviceName") + var proviceName: String, + @SerializedName("roadName") + var roadName: String, + @SerializedName("rtmpUrl") + var rtmpUrl: String?, + @SerializedName("sn") + var sn: String, + @SerializedName("stat") + var stat: String, + @SerializedName("subCategory") + var subCategory: Any? +): Serializable \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt index e699268afe..88e703e84c 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.api.hmi.warning +import com.mogo.eagle.core.data.camera.Camera import com.mogo.eagle.core.data.enums.WarningDirectionEnum import com.mogo.eagle.core.data.notice.NoticeNormalData import com.mogo.eagle.core.data.notice.NoticeTrafficStylePushData diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/monitoring/IMoGoMonitoringProvider.java b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/monitoring/IMoGoMonitoringProvider.java index b2269157a7..1719b456b1 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/monitoring/IMoGoMonitoringProvider.java +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/monitoring/IMoGoMonitoringProvider.java @@ -1,12 +1,15 @@ package com.mogo.eagle.core.function.api.monitoring; +import com.mogo.eagle.core.data.camera.Camera; import com.mogo.eagle.core.function.api.base.IMoGoFunctionServerProvider; +import java.util.List; + /** * @author xiaoyuzhou * @date 2021/10/29 10:35 上午 * 超视距功能,路测摄像头,前车摄像头监控 */ public interface IMoGoMonitoringProvider extends IMoGoFunctionServerProvider { - + List getCameraList(); } 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 124e93fdeb..1fa8193f60 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 @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.call.hmi +import com.mogo.eagle.core.data.camera.Camera import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.enums.WarningDirectionEnum import com.mogo.eagle.core.data.notice.NoticeNormalData @@ -173,5 +174,4 @@ object CallerHmiManager : CallerBase() { fun showNormalBanner(noticeNormal: NoticeNormalData) { waringProviderApi.showNoticeNormalData(noticeNormal) } - } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/monitor/CallerMonitorManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/monitor/CallerMonitorManager.kt new file mode 100644 index 0000000000..9daa97ca9a --- /dev/null +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/monitor/CallerMonitorManager.kt @@ -0,0 +1,17 @@ +package com.mogo.eagle.core.function.call.monitor + +import com.mogo.eagle.core.data.camera.Camera +import com.mogo.eagle.core.data.constants.MogoServicePaths +import com.mogo.eagle.core.function.api.monitoring.IMoGoMonitoringProvider +import com.mogo.eagle.core.function.call.base.CallerBase + +object CallerMonitorManager { + private val providerApi: IMoGoMonitoringProvider + get() = CallerBase.getApiInstance( + IMoGoMonitoringProvider::class.java, + MogoServicePaths.PATH_AI_MONITORING) + + fun getCameraList(): List? { + return providerApi.cameraList + } +} \ No newline at end of file diff --git a/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/RoundConstraintLayout.java b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/RoundConstraintLayout.java index 74f6ab1fbd..a1737215ed 100644 --- a/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/RoundConstraintLayout.java +++ b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/RoundConstraintLayout.java @@ -9,6 +9,8 @@ import android.util.AttributeSet; import androidx.constraintlayout.widget.ConstraintLayout; +import com.mogo.eagle.core.utilcode.mogo.logger.Logger; + /** * author : donghongyu @@ -49,6 +51,7 @@ public class RoundConstraintLayout extends ConstraintLayout { private void setRoundPath() { //添加一个圆角矩形到path中, 如果要实现任意形状的View, 只需要手动添加path就行 + roundPath.reset(); roundPath.addRoundRect(rectF, roundLayoutRadius, roundLayoutRadius, Path.Direction.CW); } diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/HostConst.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/HostConst.java index 1aacef7d33..db20c0ebc3 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/HostConst.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/HostConst.java @@ -20,6 +20,7 @@ public class HostConst { public static final String TMC_HOST = "http://dzt-tmcServer.zhidaozhixing.com"; public static final String IM_SOCKET_DOMAIN = "dzt-im.zhidaozhixing.com"; public static final String WEBSOCKET_DOMAIN = "dzt-Instant.zhidaozhixing.com"; + public static final String CAMERA_STREAM_HOST = "http://dzt-smartTransportationAiCloud.zhidaozhixing.com"; public static final String SOCKET_CENTER_DOMAIN = "socketRegion";