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 aaac4581d0..16cd74ee96 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 @@ -243,7 +243,7 @@ class MoGoHmiFragment : MvpFragment .setTag(tag) .setLayout(it2) .setSidePattern(SidePattern.TOP) - .setCountDownTime(5000) + .setCountDownTime(60000) .setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110) .setImmersionStatusBar(true) .addWarningStatusListener(null) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeBannerView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeBannerView.java index d424a7c4f4..20a580b6f3 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeBannerView.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeBannerView.java @@ -54,7 +54,7 @@ public class NoticeBannerView extends ConstraintLayout { mPushData = pushData; noticePushTitle.setText(pushData.getMsg()); noticePushContent.setText(pushData.getContent()); - if (pushData.getIsVideo()) { + if (pushData.getType() == 1) { iconImageView.setVisibility(View.VISIBLE); } else { iconImageView.setVisibility(View.INVISIBLE); diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeCheckDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeCheckDialog.kt index 41165b2633..f8eb5d491c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeCheckDialog.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeCheckDialog.kt @@ -1,32 +1,28 @@ package com.mogo.eagle.core.function.hmi.ui.notice import android.content.Context +import android.graphics.Bitmap import android.text.TextUtils +import android.util.Log import android.view.View import android.widget.ImageView import android.widget.TextView import com.mogo.eagle.core.data.notice.NoticeNormalData import com.mogo.eagle.core.function.hmi.R -import com.mogo.eagle.core.widget.media.video.SimpleVideoPlayer +import com.mogo.eagle.core.widget.media.video.NoticeSimpleVideoPlayer import com.mogo.module.common.dialog.BaseFloatDialog +import com.mogo.utils.BitmapHelper import com.mogo.utils.glide.GlideApp import com.mogo.utils.logger.Logger import com.shuyu.gsyvideoplayer.GSYVideoManager import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder -import com.shuyu.gsyvideoplayer.cache.CacheFactory -import com.shuyu.gsyvideoplayer.cache.ProxyCacheManager -import com.shuyu.gsyvideoplayer.listener.GSYMediaPlayerListener -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 tv.danmaku.ijk.media.player.IjkMediaPlayer -import java.util.* +import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack +import com.shuyu.gsyvideoplayer.video.base.GSYVideoView /** - * 点击查看对话框,需要做接口的请求 - * + * @brief 点击查看对话框 + * @author lixiaopeng */ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context) { @@ -35,9 +31,11 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context) { private var pushCheckTitle: TextView? = null private var pushCheckContent: TextView? = null private var pushImageView: ImageView? = null - private var pushVideo: SimpleVideoPlayer? = null + private var pushVideo: NoticeSimpleVideoPlayer? = null private val gsyVideoOptionBuilder = GSYVideoOptionBuilder() -// private var mLoading: ProgressBar? = null + private var playImageView: ImageView? = null + private var thumbnailImageView: ImageView? = null + private var mVideoUrl: String = "" init { setContentView(R.layout.notice_dialog_check_with_accessory) @@ -47,19 +45,28 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context) { pushCheckContent = findViewById(R.id.module_push_dialog_bottom_title) pushImageView = findViewById(R.id.notice_image) pushVideo = findViewById(R.id.notice_video_layout) -// mLoading = findViewById(R.id.loading) -// mLoading!!.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(context, R.color.notice_video_progressbar_loading_color), PorterDuff.Mode.MULTIPLY) + playImageView = findViewById(R.id.notice_video_play) + thumbnailImageView = findViewById(R.id.thumbnail_image) pushCheckClose?.setOnClickListener { + stopLive() dismiss() } + + playImageView!!.setOnClickListener { + if (pushVideo!!.currentState == GSYVideoView.CURRENT_STATE_PAUSE) { /*播放中*/ + resume() + } else { + pause() + } + } + } /** * 展示详情页面 */ fun showCheckDialog(noticeNormal: NoticeNormalData) { - Logger.d("liyz", "------1--------") if (isShowing || noticeNormal == null) { return } @@ -72,18 +79,17 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context) { pushCheckContent?.text = noticeNormal.content if (!TextUtils.isEmpty(noticeNormal.imageUrl) && noticeNormal.fileType == 1) { - Logger.d("liyz", "------2--------") pushVideo?.visibility = View.GONE pushImageView?.visibility = View.VISIBLE pushImageView?.let { GlideApp.with(context!!).load(noticeNormal.imageUrl).into(it) } } if (!TextUtils.isEmpty(noticeNormal.videoUrl) && noticeNormal.fileType == 2) { - Logger.d("liyz", "------3--------") pushImageView?.visibility = View.GONE pushVideo?.visibility = View.VISIBLE //加载视频播放 - playLiveVideo(noticeNormal.videoUrl) + playVideo(noticeNormal.videoUrl) + mVideoUrl = noticeNormal.videoUrl } show() @@ -91,26 +97,19 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context) { /** - * 播放直播流,且开始心跳 + * 播放视频 */ - private fun playLiveVideo(videoUrl: String) { -// pushVideo?.setPlayListener(object : PlayListener { -// override fun onPlayEvent(event: Int) { -// Logger.d("liyz", "event ----- $event") -// if (event == SimpleVideoPlayer.PLAY_EVT_PLAY_LOADING) { -//// mLoading!!.visibility = View.VISIBLE -// } else if (event == SimpleVideoPlayer.PLAY_EVT_PLAY_BEGIN) { -//// mLoading!!.visibility = View.GONE -// } else if (event < 0) { -// stopLive() -//// mLoading!!.visibility = View.GONE -// } -// } -// }) - - gsyVideoOptionBuilder.setUrl(videoUrl).setCacheWithPlay(false).setPlayTag(TAG) - .build(pushVideo) - pushVideo!!.startButton.performClick() + private fun playVideo(videoUrl: String) { + try { + gsyVideoOptionBuilder.setUrl(videoUrl).setCacheWithPlay(false).setPlayTag(TAG) + .build(pushVideo) + pushVideo!!.startButton.performClick() + playImageView!!.visibility = View.GONE + thumbnailImageView!!.visibility = View.GONE + startVideoCallBack(videoUrl) + } catch (e: Exception) { + e.printStackTrace() + } } fun stopLive() { @@ -121,7 +120,78 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context) { } } - //播放完成的回调 TODO + /** + * 暂停 + */ + private fun pause() { + playImageView!!.visibility = View.VISIBLE + playImageView!!.setImageResource(R.drawable.notice_video_play) + thumbnailImageView!!.visibility = View.GONE + } + + /** + * 继续 + */ + private fun resume() { + playImageView!!.visibility = View.VISIBLE + playImageView!!.setImageResource(R.drawable.notice_video_pause) + thumbnailImageView!!.visibility = View.GONE + } + + /** + * 播放结束后 + */ + private fun complete(firstbitmap: Bitmap, path: String) { + thumbnailImageView!!.visibility = View.VISIBLE + thumbnailImageView!!.setImageBitmap(firstbitmap) + playImageView!!.setImageResource(R.drawable.notice_video_play) + playImageView!!.visibility = View.VISIBLE + } + + private fun startVideoCallBack(path: String) { + Thread(Runnable { + val firstBitmap = BitmapHelper.getVideoThumbnail(path) /*获取第一帧图*/ + pushVideo!!.setVideoAllCallBack(object : VideoAllCallBack { + override fun onAutoComplete(url: String, vararg objects: Any) { + complete(firstBitmap, path) + } + + override fun onClickResume(url: String, vararg objects: Any) { + thumbnailImageView!!.visibility = View.GONE + playImageView!!.visibility = View.GONE + } + + override fun onClickStop(url: String, vararg objects: Any) { + Log.d(TAG, "onClickStop") + } + + override fun onStartPrepared(url: String, vararg objects: Any) { + Log.d(TAG, "onStartPrepared") + } + + override fun onPrepared(url: String, vararg objects: Any) {} + override fun onClickStartIcon(url: String, vararg objects: Any) {} + override fun onClickStartError(url: String, vararg objects: Any) {} + override fun onClickStopFullscreen(url: String, vararg objects: Any) {} + override fun onClickResumeFullscreen(url: String, vararg objects: Any) {} + override fun onClickSeekbar(url: String, vararg objects: Any) {} + override fun onClickSeekbarFullscreen(url: String, vararg objects: Any) {} + override fun onEnterFullscreen(url: String, vararg objects: Any) {} + override fun onQuitFullscreen(url: String, vararg objects: Any) {} + override fun onQuitSmallWidget(url: String, vararg objects: Any) {} + override fun onEnterSmallWidget(url: String, vararg objects: Any) {} + override fun onTouchScreenSeekVolume(url: String, vararg objects: Any) {} + override fun onTouchScreenSeekPosition(url: String, vararg objects: Any) {} + override fun onTouchScreenSeekLight(url: String, vararg objects: Any) {} + override fun onPlayError(url: String, vararg objects: Any) {} + override fun onClickStartThumb(url: String, vararg objects: Any) {} + override fun onClickBlank(url: String, vararg objects: Any) {} + override fun onClickBlankFullscreen(url: String, vararg objects: Any) { + Log.d(TAG, "onClickBlankFullscreen") + } + }) + }).start() + } } \ 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/notice/NoticeTrafficDialog.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficDialog.java index 91a1e701c0..fc4a79601c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficDialog.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficDialog.java @@ -5,47 +5,57 @@ import android.graphics.Bitmap; import android.util.Log; import android.view.View; import android.widget.ImageView; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.mogo.cloud.passport.MoGoAiCloudClientConfig; +import com.mogo.eagle.core.data.notice.NoticeTrafficStyleInfo; import com.mogo.eagle.core.data.notice.NoticeTrafficStylePushData; +import com.mogo.eagle.core.function.api.notice.NoticeNetCallBack; +import com.mogo.eagle.core.function.call.notice.CallerNoticeManager; import com.mogo.eagle.core.function.hmi.R; -import com.mogo.eagle.core.widget.media.video.SimpleVideoPlayer; +import com.mogo.eagle.core.widget.media.video.NoticeSimpleVideoPlayer; +import com.mogo.module.common.MogoApisHandler; import com.mogo.module.common.dialog.BaseFloatDialog; -import com.mogo.module.common.view.SpacesItemDecoration; +import com.mogo.service.imageloader.MogoImageView; import com.mogo.utils.BitmapHelper; -import com.mogo.utils.ResourcesHelper; import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder; import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack; import com.shuyu.gsyvideoplayer.video.base.GSYVideoView; -import java.util.List; - /** * @author liujing - * @description 描述 + * @description 交警类型弹框 * @since: 10/26/21 */ public class NoticeTrafficDialog extends BaseFloatDialog { private String TAG = "AINotice"; private Context mContext; private RecyclerView mRecyclerView; - private SimpleVideoPlayer mVideoPlayer; + private NoticeSimpleVideoPlayer mVideoPlayer; private NoticeTrafficStylePushData mPushData; private ImageView close; private ImageView playImageView; - private ImageView thumbnailImage; + private MogoImageView thumbnailImage; private GSYVideoOptionBuilder gsyVideoOptionBuilder = new GSYVideoOptionBuilder(); + private Bitmap firstBitmap; + private TextView accept;//接受 + private TextView refuse;//拒绝 public NoticeTrafficDialog(@NonNull Context context, NoticeTrafficStylePushData pushData) { super(context); mContext = context; mPushData = pushData; - mPushData.setPoiImgUrl("https://vd2.bdstatic.com/mda-mk1347dzxdmcre0y/sc/cae_h264/1635819498112313003/mda-mk1347dzxdmcre0y.mp4?v_from_s=hkapp-haokan-tucheng&auth_key=1635837585-0-0-5295f6658c7711ba7b4d3ef478a7fbaa&bcevod_channel=searchbox_feed&pd=1&pt=3&abtest="); - mPushData.setIsVideo(true); + //图片 + String image = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fitem%2F201609%2F26%2F20160926081306_GM2tv.thumb.1000_0.jpeg&refer=http%3A%2F%2Fc-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1638511084&t=92def7498b526dcba3fceda17c43fcb8"; + String video = "https://vd2.bdstatic.com/mda-mk1347dzxdmcre0y/sc/cae_h264/1635819498112313003/mda-mk1347dzxdmcre0y.mp4?v_from_s=hkapp-haokan-tucheng&auth_key=1635837585-0-0-5295f6658c7711ba7b4d3ef478a7fbaa&bcevod_channel=searchbox_feed&pd=1&pt=3&abtest="; + mPushData.setPoiImgUrl(video); + mPushData.setType(1); + mPushData.setInfoId("905543067497902080"); initView(); } @@ -55,13 +65,7 @@ public class NoticeTrafficDialog extends BaseFloatDialog { public void initView() { setContentView(R.layout.notice_dialog_traffic_police); - mVideoPlayer = findViewById(R.id.video_player); - thumbnailImage = findViewById(R.id.thumbnail_image); - playImageView = this.findViewById(R.id.window_video_play); - close = findViewById(R.id.notice_traffic_dialog_close); - close.setOnClickListener(v -> { - dismiss(); - }); + playerShow(); //网格绘制 try { mRecyclerView = findViewById(R.id.traffic_info_recyclerView); @@ -78,6 +82,67 @@ public class NoticeTrafficDialog extends BaseFloatDialog { NoticeTrafficAdapter adapter = new NoticeTrafficAdapter(mContext); mRecyclerView.setAdapter(adapter); + accept = findViewById(R.id.accept_traffic); + refuse = findViewById(R.id.refuse_traffic); + accept.setOnClickListener(v -> { + feedBackTraffic(1); + }); + refuse.setOnClickListener(v -> { + feedBackTraffic(0); + }); + //重新连接 + findViewById(R.id.notice_connect).setOnClickListener(v -> { + requestTrafficInfo(); + }); + } + + /** + * @param i 是否接受交通事故任务 + * 0不接收 1接受 + */ + private void feedBackTraffic(int i) { + CallerNoticeManager.getNoticeProvider().feedBackNoticeTraffic(mPushData.getInfoId(), MoGoAiCloudClientConfig.getInstance().getSn(), 1); + } + + /** + * 获取交通事故详情 + */ + private void requestTrafficInfo() { + Log.d(TAG, "requestTrafficInfo"); + CallerNoticeManager.getNoticeProvider().requestAccidentInfo(mPushData.getInfoId(), MoGoAiCloudClientConfig.getInstance().getSn(), new NoticeNetCallBack() { + @Override + public void callBackWithResult(NoticeTrafficStyleInfo trafficInfo) { + Log.d(TAG, "交通事故详情::" + trafficInfo); + } + }); + } + + /** + * 根据推送消息渲染顶部图片/视频 + * type 0图片 1视频 + */ + private void playerShow() { + mVideoPlayer = findViewById(R.id.video_player); + thumbnailImage = findViewById(R.id.thumbnail_image); + playImageView = this.findViewById(R.id.notice_start); + playImageView.setOnClickListener(v -> { + startLive(); + }); + close = findViewById(R.id.notice_traffic_dialog_close); + close.setOnClickListener(v -> { + dismiss(); + }); + if (mPushData.getType() == 1) { + firstBitmap = BitmapHelper.getVideoThumbnail(mPushData.getPoiImgUrl());/*获取视频第一帧图*/ + complete(firstBitmap); + playImageView.setVisibility(View.VISIBLE); + } else { + MogoApisHandler.getInstance().getApis().getImageLoaderApi().displayImage(mPushData.getPoiImgUrl(), + thumbnailImage); + thumbnailImage.setImageBitmap(firstBitmap); + thumbnailImage.setVisibility(View.VISIBLE); + playImageView.setVisibility(View.INVISIBLE); + } mVideoPlayer.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -88,7 +153,7 @@ public class NoticeTrafficDialog extends BaseFloatDialog { } } }); -// startLive(); + } /** @@ -109,7 +174,7 @@ public class NoticeTrafficDialog extends BaseFloatDialog { * 继续 */ private void resume() { - playImageView.setImageResource(R.drawable.video_pause); + playImageView.setImageResource(R.drawable.notice_video_pause); playImageView.setVisibility(View.GONE); thumbnailImage.setVisibility(View.GONE); } @@ -117,10 +182,10 @@ public class NoticeTrafficDialog extends BaseFloatDialog { /** * 播放结束后 */ - private void complete(Bitmap firstbitmap, String path) { + private void complete(Bitmap firstbitmap) { thumbnailImage.setVisibility(View.VISIBLE); thumbnailImage.setImageBitmap(firstbitmap); - playImageView.setImageResource(R.drawable.video_play); + playImageView.setImageResource(R.drawable.notice_video_play); playImageView.setVisibility(View.VISIBLE); playImageView.setOnClickListener(v -> { startLive(); @@ -130,12 +195,11 @@ public class NoticeTrafficDialog extends BaseFloatDialog { }); } - /** * 视频播放 */ private void startLive() { - if (mPushData != null && mPushData.getIsVideo() == true) { + if (mPushData != null) { try { Log.d(TAG, "交警事故开始播放视频startLive"); String videoUrl = mPushData.getPoiImgUrl(); @@ -144,22 +208,22 @@ public class NoticeTrafficDialog extends BaseFloatDialog { mVideoPlayer.getStartButton().performClick(); thumbnailImage.setVisibility(View.GONE); playImageView.setVisibility(View.GONE); - startVideoCallBack(videoUrl); + liveCallBack(); } catch (Exception e) { e.printStackTrace(); } } } - private void startVideoCallBack(String path) { + private void liveCallBack() { new Thread(new Runnable() { @Override public void run() { - Bitmap firstBitmap = BitmapHelper.getVideoThumbnail(path);/*获取第一帧图*/ + Bitmap firstBitmap = BitmapHelper.getVideoThumbnail(mPushData.getPoiImgUrl());/*获取第一帧图*/ mVideoPlayer.setVideoAllCallBack(new VideoAllCallBack() { @Override public void onAutoComplete(String url, Object... objects) { - complete(firstBitmap, path); + complete(firstBitmap); } @Override diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/notice_unsuccess_traffic.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/notice_unsuccess_traffic.png new file mode 100644 index 0000000000..b695dfcb86 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/notice_unsuccess_traffic.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/notice_dialog_check_with_accessory.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/notice_dialog_check_with_accessory.xml index 4e1d752dc2..53afa2df29 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/notice_dialog_check_with_accessory.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/notice_dialog_check_with_accessory.xml @@ -38,6 +38,7 @@ android:layout_marginLeft="@dimen/dp_150" android:layout_marginRight="@dimen/dp_150" android:layout_marginBottom="@dimen/dp_56" + android:layout_marginTop="@dimen/dp_6" android:ellipsize="end" android:gravity="left" android:maxLines="2" @@ -63,7 +64,7 @@ app:layout_constraintTop_toBottomOf="@+id/module_push_dialog_acc_title" /> - - + + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + + + android:src="@drawable/video_play" + android:visibility="gone" /> - + app:layout_constraintBottom_toBottomOf="@id/video_player" + app:layout_constraintEnd_toEndOf="@id/video_player" + app:layout_constraintStart_toStartOf="@id/video_player" + app:layout_constraintTop_toTopOf="@id/video_player" /> + android:src="@drawable/notice_video_play" + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="@id/video_player" + app:layout_constraintLeft_toLeftOf="@id/video_player" + app:layout_constraintRight_toRightOf="@id/video_player" + app:layout_constraintTop_toTopOf="@id/video_player" /> + + + app:layout_constraintRight_toRightOf="parent" /> mNoticeMessageListener = new IMogoOnMessageListener() { + private IMogoOnMessageListener mtrafficNoticeListener = new IMogoOnMessageListener() { @Override public Class target() { diff --git a/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/network/NoticeApiService.java b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/network/NoticeApiService.java index faac164996..a843cf1118 100644 --- a/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/network/NoticeApiService.java +++ b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/network/NoticeApiService.java @@ -2,6 +2,7 @@ package com.mogo.eagle.core.function.notice.network; import com.mogo.eagle.core.data.BaseData; import com.mogo.eagle.core.data.notice.NoticeNormalDetail; +import com.mogo.eagle.core.data.notice.NoticeTrafficStyleInfo; import java.util.Map; @@ -26,11 +27,11 @@ public interface NoticeApiService { */ @FormUrlEncoded @POST("/deva/accidentInfoManage/queryMyAccidentHandleInfo/server/v1") - Observable getAccidentInfo(@FieldMap Map accidentParameters); + Observable getAccidentInfo(@FieldMap Map accidentParameters); /** - * 获取道路事故详情 + * 反馈对道路事件的操作 * * @param accidentParameters 请求数据(infoID事故ID;sn;status接受状态 0否 1是) * @return {@link BaseData} diff --git a/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/network/NoticeNetWorkManager.java b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/network/NoticeNetWorkManager.java index a8573c4888..a6aaaa8647 100644 --- a/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/network/NoticeNetWorkManager.java +++ b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/network/NoticeNetWorkManager.java @@ -5,7 +5,9 @@ import com.mogo.cloud.network.RetrofitFactory; import com.mogo.cloud.passport.MoGoAiCloudClient; import com.mogo.eagle.core.data.BaseData; import com.mogo.eagle.core.data.notice.NoticeNormalDetail; -import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; +import com.mogo.eagle.core.data.notice.NoticeTrafficStyleInfo; + +import com.mogo.eagle.core.function.api.notice.NoticeNetCallBack; import com.mogo.utils.logger.Logger; import java.util.HashMap; @@ -46,10 +48,11 @@ public class NoticeNetWorkManager { /** * 获取事故详细信息 * - * @param infoId 事故id - * @param sn + * @param infoId 事故id + * @param sn 车机sn + * @param callBack 回调 */ - public void requestAccidentInfo(String infoId, String sn) { + public void requestAccidentInfo(String infoId, String sn, NoticeNetCallBack callBack) { String snString = MoGoAiCloudClient.getInstance().getAiCloudClientConfig().getSn(); Map map = new HashMap<>(); map.put("sn", sn); @@ -57,15 +60,17 @@ public class NoticeNetWorkManager { mNoticeApiService.getAccidentInfo(map) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer() { + .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { } @Override - public void onNext(@NonNull BaseData baseData) { - + public void onNext(@NonNull NoticeTrafficStyleInfo noticeTrafficStyleInfo) { + if (noticeTrafficStyleInfo != null) { + callBack.callBackWithResult(noticeTrafficStyleInfo); + } } @Override @@ -87,12 +92,11 @@ public class NoticeNetWorkManager { * @param sn * @param status 是否接受 0否 1是 */ - public void sendAccidentAcceptStatus(String infoId, String sn, String status) { - String snString = MoGoAiCloudClient.getInstance().getAiCloudClientConfig().getSn(); + public void sendAccidentAcceptStatus(String infoId, String sn, int status) { Map map = new HashMap<>(); map.put("sn", sn); map.put("infoId", infoId); - map.put("status", status); + map.put("status", String.valueOf(status)); mNoticeApiService.sendAcceptStatus(map) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) @@ -129,7 +133,6 @@ public class NoticeNetWorkManager { Map map = new HashMap<>(); map.put("sn", sn); map.put("infoId", dbId); - mNoticeApiService.getNoticeDetail(map) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) @@ -158,5 +161,4 @@ public class NoticeNetWorkManager { } - } diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/notice/NoticeTrafficStyleInfo.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/notice/NoticeTrafficStyleInfo.java index 5ac3e7863c..bcb1d2a1ed 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/notice/NoticeTrafficStyleInfo.java +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/notice/NoticeTrafficStyleInfo.java @@ -1,19 +1,22 @@ package com.mogo.eagle.core.data.notice; +import com.mogo.eagle.core.data.BaseData; + import java.io.Serializable; /** * @author liujing - * @description 交通事故任务详情数据bean + * @description 交通事故任务详情数据 * @since: 10/26/21 */ -public class NoticeTrafficStyleInfo implements Serializable { +public class NoticeTrafficStyleInfo extends BaseData { private String infoId;//事故id private String poiType;//事故类型 private long dataCreateTime;//事故发生时间 private long dataHandleTime;//事故处理时间 - private String operaStatus;//事故状态 + private String operaStatus;//事故处理状态 private String troubleReasonName;//事故原因 + private String uploadAddress;//事故地点 public String getInfoId() { return infoId; @@ -63,15 +66,24 @@ public class NoticeTrafficStyleInfo implements Serializable { this.troubleReasonName = troubleReasonName; } + public String getUploadAddress() { + return uploadAddress; + } + + public void setUploadAddress(String uploadAddress) { + this.uploadAddress = uploadAddress; + } + @Override public String toString() { - return "NoticeTrafficInfo{" + + return "NoticeTrafficStyleInfo{" + "infoId='" + infoId + '\'' + ", poiType='" + poiType + '\'' + ", dataCreateTime=" + dataCreateTime + ", dataHandleTime=" + dataHandleTime + ", operaStatus='" + operaStatus + '\'' + ", troubleReasonName='" + troubleReasonName + '\'' + + ", uploadAddress='" + uploadAddress + '\'' + '}'; } } diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/notice/NoticeTrafficStylePushData.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/notice/NoticeTrafficStylePushData.java index 62670a7962..f62fa64ce8 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/notice/NoticeTrafficStylePushData.java +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/notice/NoticeTrafficStylePushData.java @@ -1,17 +1,19 @@ package com.mogo.eagle.core.data.notice; +import java.io.Serializable; + /** * @author Jing * @description 交警任务公告推送消息体 * 接口 http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=66917469 * @since: 10/28/21 */ -public class NoticeTrafficStylePushData { +public class NoticeTrafficStylePushData implements Serializable { private String msg; private String infoId; private String poiImgUrl; private String title; - private boolean isVideo; + private int type; private String content; public String getMsg() { @@ -46,12 +48,12 @@ public class NoticeTrafficStylePushData { this.poiImgUrl = poiImgUrl; } - public boolean getIsVideo() { - return isVideo; + public int getType() { + return type; } - public void setIsVideo(boolean isVideo) { - this.isVideo = isVideo; + public void setType(int type) { + this.type = type; } public String getContent() { @@ -69,7 +71,7 @@ public class NoticeTrafficStylePushData { ", infoId='" + infoId + '\'' + ", poiImgUrl='" + poiImgUrl + '\'' + ", title='" + title + '\'' + - ", isVideo=" + isVideo + + ", type=" + type + ", content='" + content + '\'' + '}'; } diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeProvider.java b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeProvider.java index c8ea129bcc..a5ab887ce0 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeProvider.java +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeProvider.java @@ -4,10 +4,10 @@ import com.mogo.eagle.core.function.api.base.IMoGoFunctionServerProvider; /** * @author Jing - * @description 云公告监听者 + * @description * @since: 10/27/21 */ public interface IMoGoNoticeProvider extends IMoGoFunctionServerProvider { - - + void feedBackNoticeTraffic(String infoId, String sn, int accept); + void requestAccidentInfo(String infoId, String sn,NoticeNetCallBack callBack); } diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/NoticeNetCallBack.java b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/NoticeNetCallBack.java new file mode 100644 index 0000000000..54fd204423 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/NoticeNetCallBack.java @@ -0,0 +1,12 @@ +package com.mogo.eagle.core.function.api.notice; + +import com.mogo.eagle.core.data.notice.NoticeTrafficStyleInfo; + +/** + * @author Jing + * @description 网络请求回调 + * @since: 11/3/21 + */ +public interface NoticeNetCallBack { + void callBackWithResult(NoticeTrafficStyleInfo trafficInfo); +} diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/notice/CallerNoticeManager.java b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/notice/CallerNoticeManager.java index ad92134aed..f02b86fd56 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/notice/CallerNoticeManager.java +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/notice/CallerNoticeManager.java @@ -10,9 +10,7 @@ import static com.mogo.eagle.core.data.constants.MogoServicePaths.PATH_AI_NOTICE */ public class CallerNoticeManager extends CallerBase { - private static IMoGoNoticeProvider getNoticeProvider() { + public static IMoGoNoticeProvider getNoticeProvider() { return getApiInstance(IMoGoNoticeProvider.class, PATH_AI_NOTICE); } - - } diff --git a/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/NoticeSimpleVideoPlayer.kt b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/NoticeSimpleVideoPlayer.kt new file mode 100644 index 0000000000..ea0779bbd5 --- /dev/null +++ b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/NoticeSimpleVideoPlayer.kt @@ -0,0 +1,213 @@ +package com.mogo.eagle.core.widget.media.video + +import android.content.Context +import android.util.AttributeSet +import android.util.Log +import android.view.Surface +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import com.mogo.eagle.core.utilcode.util.TimeTransformUtils +import com.mogo.eagle.core.widget.R +import com.shuyu.gsyvideoplayer.GSYVideoManager +import com.shuyu.gsyvideoplayer.utils.GSYVideoType +import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer +import com.shuyu.gsyvideoplayer.video.base.GSYVideoView +import com.shuyu.gsyvideoplayer.video.base.GSYVideoViewBridge + +/** + * @author lixiaopeng + * @since 2021/11/3 + * + * 视频播放器,ui定制 + */ +class NoticeSimpleVideoPlayer : StandardGSYVideoPlayer { + + companion object { + const val PLAY_EVT_PLAY_LOADING = 1000 + const val PLAY_EVT_PLAY_BEGIN = 2000 + const val PLAY_EVT_PLAY_ERROR = 3000 + } + + private var playListener: PlayListener? = null + private lateinit var start: ImageView + private lateinit var coverImage: ImageView + private lateinit var fullscreen: ImageView + private lateinit var currentTimeTextView: TextView + private lateinit var totalTimeTextView: TextView + + interface PlayListener { + fun onPlayEvent(event: Int) + } + + constructor(context: Context?) : super(context) + constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) + constructor(context: Context?, fullFlag: Boolean?) : super(context, fullFlag) + + override fun init(context: Context) { + super.init(context) + start = findViewById(R.id.start) + coverImage = findViewById(R.id.thumbImage) + fullscreen = findViewById(R.id.fullscreen) + currentTimeTextView = findViewById(R.id.current) + totalTimeTextView = findViewById(R.id.total) + + if (mThumbImageViewLayout != null + && (mCurrentState == -1 || mCurrentState == CURRENT_STATE_NORMAL || mCurrentState == CURRENT_STATE_ERROR) + ) { + mThumbImageViewLayout.visibility = View.VISIBLE + } + } + + override fun getLayoutId(): Int { + return R.layout.item_notice_video + } + + override fun getGSYVideoManager(): GSYVideoViewBridge { + GSYVideoManager.instance().initContext(context.applicationContext) + return GSYVideoManager.instance() + } + + override fun updateStartImage() { + when (mCurrentState) { + GSYVideoView.CURRENT_STATE_PLAYING -> + start.setImageResource(R.drawable.notice_video_pause) + GSYVideoView.CURRENT_STATE_ERROR -> + start.setImageResource(R.drawable.notice_video_pause) + else -> start.setImageResource(R.drawable.notice_video_play) + } + } + + override fun setProgressAndTime( + progress: Int, + secProgress: Int, + currentTime: Int, + totalTime: Int, + forceChange: Boolean + ) { + super.setProgressAndTime(progress, secProgress, currentTime, totalTime, forceChange) + mBottomContainer?.visibility = View.VISIBLE + mProgressBar?.visibility = View.VISIBLE + start?.visibility = View.VISIBLE + fullscreen?.visibility = View.GONE + //时间显示 + currentTimeTextView?.text = TimeTransformUtils.stringForTime(currentTime) + totalTimeTextView?.text = TimeTransformUtils.stringForTime(totalTime) + + if (progress != 0) { + mProgressBar?.progress = progress + } + } + + fun setPlayListener(listener: PlayListener) { + this.playListener = listener + } + + override fun changeUiToCompleteShow() { + super.changeUiToCompleteShow() + Log.d("liyz", "changeUiToCompleteShow ------> ") + mBottomContainer?.visibility = View.INVISIBLE + mProgressBar?.visibility = View.GONE + } + + override fun hideAllWidget() { + super.hideAllWidget() + Log.d("liyz", "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 onAutoCompletion() { + super.onAutoCompletion() + mProgressBar?.progress = 0 + } + + override fun showWifiDialog() { + //直接播放,不显示WIFI对话框 + startPlayLogic() + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + mProgressBar?.progress = 0 + mFullPauseBitmap = null + } + + override fun onClick(v: View?) { + super.onClick(v) + } + + override fun onCompletion() { + isPostBufferUpdate = false + } + + override fun onSurfaceUpdated(surface: Surface) { + super.onSurfaceUpdated(surface) + if (mThumbImageViewLayout != null && mThumbImageViewLayout.visibility == View.VISIBLE) { + mThumbImageViewLayout.visibility = View.INVISIBLE + } + } + + override fun onPrepared() { + super.onPrepared() + playListener?.onPlayEvent(PLAY_EVT_PLAY_LOADING) + } + + private var isPostBufferUpdate = false + + override fun onBufferingUpdate(percent: Int) { + super.onBufferingUpdate(percent) + if (!isPostBufferUpdate && percent == 0) { + isPostBufferUpdate = true + playListener?.onPlayEvent(PLAY_EVT_PLAY_BEGIN) + } + } + + override fun onError(what: Int, extra: Int) { + super.onError(what, extra) + playListener?.onPlayEvent(PLAY_EVT_PLAY_ERROR) + isPostBufferUpdate = false + } + + override fun setViewShowState(view: View?, visibility: Int) { + if (view === mThumbImageViewLayout && visibility != View.VISIBLE) { + return + } + super.setViewShowState(view, visibility) + } + + 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 + } + } + } +} \ No newline at end of file diff --git a/core/mogo-core-res/src/main/res/drawable-xhdpi/notice_player_ic_circle_nor.png b/core/mogo-core-res/src/main/res/drawable-xhdpi/notice_player_ic_circle_nor.png new file mode 100644 index 0000000000..e34e824da6 Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-xhdpi/notice_player_ic_circle_nor.png differ diff --git a/core/mogo-core-res/src/main/res/drawable-xhdpi/notice_video_pause.png b/core/mogo-core-res/src/main/res/drawable-xhdpi/notice_video_pause.png new file mode 100644 index 0000000000..dde6a5c994 Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-xhdpi/notice_video_pause.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/video_play.png b/core/mogo-core-res/src/main/res/drawable-xhdpi/notice_video_play.png similarity index 100% rename from core/function-impl/mogo-core-function-hmi/src/main/res/drawable/video_play.png rename to core/mogo-core-res/src/main/res/drawable-xhdpi/notice_video_play.png diff --git a/core/mogo-core-res/src/main/res/drawable/notice_video_pause.png b/core/mogo-core-res/src/main/res/drawable/notice_video_pause.png new file mode 100644 index 0000000000..2bc83b4e41 Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable/notice_video_pause.png differ diff --git a/core/mogo-core-res/src/main/res/drawable/notice_video_play.png b/core/mogo-core-res/src/main/res/drawable/notice_video_play.png new file mode 100644 index 0000000000..4c733621b6 Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable/notice_video_play.png differ diff --git a/core/mogo-core-res/src/main/res/drawable/seekbar_style.xml b/core/mogo-core-res/src/main/res/drawable/seekbar_style.xml new file mode 100644 index 0000000000..5fbe3746a6 --- /dev/null +++ b/core/mogo-core-res/src/main/res/drawable/seekbar_style.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/mogo-core-res/src/main/res/layout/item_notice_video.xml b/core/mogo-core-res/src/main/res/layout/item_notice_video.xml new file mode 100644 index 0000000000..41b1cf8ec9 --- /dev/null +++ b/core/mogo-core-res/src/main/res/layout/item_notice_video.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeTransformUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeTransformUtils.java new file mode 100644 index 0000000000..6c2848c71a --- /dev/null +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeTransformUtils.java @@ -0,0 +1,30 @@ +package com.mogo.eagle.core.utilcode.util; + +import java.util.Formatter; +import java.util.Locale; + +/** + * author: lixiaopeng + * desc : 时间转换 + */ +public final class TimeTransformUtils { + + public static String stringForTime(int timeMs) { + if (timeMs <= 0 || timeMs >= 24 * 60 * 60 * 1000) { + return "00:00"; + } + int totalSeconds = timeMs / 1000; + int seconds = totalSeconds % 60; + int minutes = (totalSeconds / 60) % 60; + int hours = totalSeconds / 3600; + StringBuilder stringBuilder = new StringBuilder(); + Formatter mFormatter = new Formatter(stringBuilder, Locale.getDefault()); + if (hours > 0) { + return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds).toString(); + } else { + return mFormatter.format("%02d:%02d", minutes, seconds).toString(); + } + } + + +} diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/CommonUtils.java b/foudations/mogo-utils/src/main/java/com/mogo/utils/CommonUtils.java index 144e1fbc62..b39ea6bcf0 100644 --- a/foudations/mogo-utils/src/main/java/com/mogo/utils/CommonUtils.java +++ b/foudations/mogo-utils/src/main/java/com/mogo/utils/CommonUtils.java @@ -8,6 +8,8 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiManager; @@ -24,17 +26,21 @@ import androidx.core.content.ContextCompat; import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; +import java.net.HttpURLConnection; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; +import java.net.URL; import java.net.URLDecoder; import java.net.URLEncoder; import java.text.DecimalFormat; import java.util.Enumeration; +import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/network/RequestOptions.java b/foudations/mogo-utils/src/main/java/com/mogo/utils/network/RequestOptions.java index 161d8f38e6..7844fbb8d6 100644 --- a/foudations/mogo-utils/src/main/java/com/mogo/utils/network/RequestOptions.java +++ b/foudations/mogo-utils/src/main/java/com/mogo/utils/network/RequestOptions.java @@ -24,7 +24,7 @@ public class RequestOptions { /** * Private constructor with some default initialization. */ - private RequestOptions( @CallerType Object caller ) { + public RequestOptions(@CallerType Object caller) { this.caller = caller; this.context = Util.getContext( caller ); this.parameter = Collections.emptyMap();