From 4f402328d3764e89faee120f47135bb677bf5a99 Mon Sep 17 00:00:00 2001 From: liujing Date: Sun, 13 Dec 2020 11:21:59 +0800 Subject: [PATCH 1/8] =?UTF-8?q?[add]=20=E7=82=B9=E8=B5=9E+=E8=B8=A9=20vr?= =?UTF-8?q?=E4=B8=8B=E7=A6=81=E7=94=A8=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/mogo/module/v2x/view/HeartLikeView.java | 2 +- .../main/java/com/mogo/module/v2x/view/HeartUnLikeView.java | 4 +++- .../src/main/res/anim/v2x_like_heart_animation_vr.xml | 4 ++++ .../src/main/res/anim/v2x_unlike_heart_animation_vr.xml | 4 ++++ 4 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 modules/mogo-module-v2x/src/main/res/anim/v2x_like_heart_animation_vr.xml create mode 100644 modules/mogo-module-v2x/src/main/res/anim/v2x_unlike_heart_animation_vr.xml diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/view/HeartLikeView.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/view/HeartLikeView.java index c909bb4bfc..5adeb236e2 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/view/HeartLikeView.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/view/HeartLikeView.java @@ -55,7 +55,7 @@ public class HeartLikeView extends LinearLayout implements Animator.AnimatorList isAnimator = true; if (mAnimatorSet == null) { mAnimatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(getContext(), - R.anim.v2x_like_heart_animation); + V2XServiceManager.getMoGoStatusManager().isVrMode() ? R.anim.v2x_like_heart_animation_vr : R.anim.v2x_like_heart_animation); mAnimatorSet.setTarget(mIllegalParkingLike); mAnimatorSet.addListener(this); } diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/view/HeartUnLikeView.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/view/HeartUnLikeView.java index 4462a5ffd3..b361791431 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/view/HeartUnLikeView.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/view/HeartUnLikeView.java @@ -45,7 +45,9 @@ public class HeartUnLikeView extends LinearLayout implements Animator.AnimatorLi isAnimator = true; if (mAnimatorSet == null) { - mAnimatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(getContext(), R.anim.v2x_unlike_heart_animation); + mAnimatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(getContext(), + V2XServiceManager.getMoGoStatusManager().isVrMode() ? + R.anim.v2x_unlike_heart_animation_vr : R.anim.v2x_unlike_heart_animation); mAnimatorSet.setTarget(mIllegalParkingUnLike); mAnimatorSet.addListener(this); } diff --git a/modules/mogo-module-v2x/src/main/res/anim/v2x_like_heart_animation_vr.xml b/modules/mogo-module-v2x/src/main/res/anim/v2x_like_heart_animation_vr.xml new file mode 100644 index 0000000000..bdf486cf3f --- /dev/null +++ b/modules/mogo-module-v2x/src/main/res/anim/v2x_like_heart_animation_vr.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/modules/mogo-module-v2x/src/main/res/anim/v2x_unlike_heart_animation_vr.xml b/modules/mogo-module-v2x/src/main/res/anim/v2x_unlike_heart_animation_vr.xml new file mode 100644 index 0000000000..bdf486cf3f --- /dev/null +++ b/modules/mogo-module-v2x/src/main/res/anim/v2x_unlike_heart_animation_vr.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file From 3f3dfdb1ac13417a01fde5402949c98472e0c1e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Sun, 13 Dec 2020 11:43:45 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E8=A7=A3=E5=86=B3=20java.lang.NullPointerE?= =?UTF-8?q?xception:=20Attempt=20to=20invoke=20virtual=20method=20'com.mog?= =?UTF-8?q?o.map.search.geo.MogoRegeocodeAddress=20com.mogo.map.search.geo?= =?UTF-8?q?.MogoRegeocodeResult.getRegeocodeAddress()'=20on=20a=20null=20o?= =?UTF-8?q?bject=20reference?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/small/map/SmallMapService.java | 2 +- .../v2x/listener/V2XLocationListener.java | 20 +++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapService.java b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapService.java index 686397704f..6739bb7c85 100644 --- a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapService.java +++ b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapService.java @@ -19,7 +19,7 @@ import com.mogo.utils.logger.Logger; public class SmallMapService extends Service { private static final String TAG = "MachineVisionMapService"; private IBinder mBinder; - private WindowManagerView mMachineVisionMapViewManager; + private WindowManagerView mWindowManagerView; private SmallMapView mMapView; diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/listener/V2XLocationListener.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/listener/V2XLocationListener.java index 141be28947..f8055356e8 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/listener/V2XLocationListener.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/listener/V2XLocationListener.java @@ -247,14 +247,18 @@ public class V2XLocationListener implements IMogoLocationListener, CarStatusList LocationUtils.geoCodeSearch(location, new IMogoGeoSearchListener() { @Override public void onRegeocodeSearched(MogoRegeocodeResult regeocodeResult) { - //Logger.i(MODULE_NAME, " 根据经纬度查询结果为:" + regeocodeResult.getRegeocodeAddress().getFormatAddress()); - location.setAddress(regeocodeResult.getRegeocodeAddress().getFormatAddress()); - // 如果有 "高速"、"环线"、"快速路"等字眼的,视为封闭式道路,流程结束; - if (regeocodeResult.getRegeocodeAddress().getFormatAddress().contains("高速") - || regeocodeResult.getRegeocodeAddress().getFormatAddress().contains("环线") - || regeocodeResult.getRegeocodeAddress().getFormatAddress().contains("快速路")) { - } else { - searchIllegalParkData(); + try { + //Logger.i(MODULE_NAME, " 根据经纬度查询结果为:" + regeocodeResult.getRegeocodeAddress().getFormatAddress()); + location.setAddress(regeocodeResult.getRegeocodeAddress().getFormatAddress()); + // 如果有 "高速"、"环线"、"快速路"等字眼的,视为封闭式道路,流程结束; + if (regeocodeResult.getRegeocodeAddress().getFormatAddress().contains("高速") + || regeocodeResult.getRegeocodeAddress().getFormatAddress().contains("环线") + || regeocodeResult.getRegeocodeAddress().getFormatAddress().contains("快速路")) { + } else { + searchIllegalParkData(); + } + } catch (Exception e) { + e.printStackTrace(); } } From 832ed39fcd5ae55d01b6cbce13599ed665d37ba4 Mon Sep 17 00:00:00 2001 From: liujing Date: Sun, 13 Dec 2020 13:42:03 +0800 Subject: [PATCH 3/8] =?UTF-8?q?[add]=20=E7=9B=B4=E6=92=AD=E6=A1=86VR?= =?UTF-8?q?=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v2x/adapter/holder/V2XLiveVideoVH.java | 4 +- .../scene/livecar/V2XRoadLiveCarWindow.java | 4 +- .../res/layout/item_v2x_fault_help_vr.xml | 1 + .../res/layout/item_v2x_live_video_vr.xml | 37 ++++++++++++++ .../item_v2x_road_live_car_detail_vr.xml | 50 +++++++++++++++++++ 5 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 modules/mogo-module-v2x/src/main/res/layout/item_v2x_live_video_vr.xml create mode 100644 modules/mogo-module-v2x/src/main/res/layout/item_v2x_road_live_car_detail_vr.xml diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XLiveVideoVH.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XLiveVideoVH.java index 9ffdeddda2..04e845e93f 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XLiveVideoVH.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/adapter/holder/V2XLiveVideoVH.java @@ -10,6 +10,7 @@ import com.mogo.module.common.entity.V2XLiveCarInfoEntity; import com.mogo.module.common.entity.V2XRoadEventEntity; import com.mogo.module.v2x.R; import com.mogo.module.v2x.V2XConst; +import com.mogo.module.v2x.V2XServiceManager; import com.mogo.module.v2x.scenario.scene.road.V2XRoadEventScenario; import com.mogo.module.v2x.scenario.view.IV2XWindow; import com.mogo.module.v2x.utils.TrackUtils; @@ -38,7 +39,8 @@ public class V2XLiveVideoVH extends V2XBaseViewHolder { private V2XRoadEventEntity mV2XRoadEventEntity; public V2XLiveVideoVH(ViewGroup viewGroup, IV2XWindow v2XWindow) { - super(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_v2x_live_video, viewGroup, false), v2XWindow); + super(LayoutInflater.from(viewGroup.getContext()).inflate(V2XServiceManager.getMoGoStatusManager().isVrMode() ? + R.layout.item_v2x_live_video_vr : R.layout.item_v2x_live_video, viewGroup, false), v2XWindow); videoPlayer = itemView.findViewById(R.id.videoPlayer); ivReportHead = itemView.findViewById(R.id.ivReportHead); } diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/livecar/V2XRoadLiveCarWindow.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/livecar/V2XRoadLiveCarWindow.java index e8ff32acbd..46feba147a 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/livecar/V2XRoadLiveCarWindow.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/livecar/V2XRoadLiveCarWindow.java @@ -94,8 +94,8 @@ public class V2XRoadLiveCarWindow extends V2XBasWindow private void initView(Context context) { //Logger.w(MODULE_NAME, "V2X===初始化道路直播视图"); // 填充布局 - LayoutInflater.from(context).inflate(R.layout.item_v2x_road_live_car_detail, this); - + LayoutInflater.from(context).inflate(V2XServiceManager.getMoGoStatusManager().isVrMode() ? + R.layout.item_v2x_road_live_car_detail_vr : R.layout.item_v2x_road_live_car_detail, this); mTvEventStubClose = findViewById(R.id.tvEventStubClose); mRecyclerView = findViewById(R.id.rvRoadEventList); mTvEventStubClose.setOnClickListener(v -> { diff --git a/modules/mogo-module-v2x/src/main/res/layout/item_v2x_fault_help_vr.xml b/modules/mogo-module-v2x/src/main/res/layout/item_v2x_fault_help_vr.xml index f11eb95ea2..f4c376b7ad 100644 --- a/modules/mogo-module-v2x/src/main/res/layout/item_v2x_fault_help_vr.xml +++ b/modules/mogo-module-v2x/src/main/res/layout/item_v2x_fault_help_vr.xml @@ -6,6 +6,7 @@ android:layout_height="@dimen/dp_120" android:background="@drawable/v2x_bg_pop_up" android:paddingEnd="@dimen/dp_30" + android:layout_marginTop="@dimen/dp_8" tools:layout_height="wrap_content"> + + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-v2x/src/main/res/layout/item_v2x_road_live_car_detail_vr.xml b/modules/mogo-module-v2x/src/main/res/layout/item_v2x_road_live_car_detail_vr.xml new file mode 100644 index 0000000000..bc9ead60e0 --- /dev/null +++ b/modules/mogo-module-v2x/src/main/res/layout/item_v2x_road_live_car_detail_vr.xml @@ -0,0 +1,50 @@ + + + + + + + + + + \ No newline at end of file From 25dcae01cd690efe6ac11c9d89093e3d20ba632a Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Sun, 13 Dec 2020 15:26:24 +0800 Subject: [PATCH 4/8] add camera live --- config.gradle | 1 + .../common/entity/MogoSnapshotSetData.java | 15 +- modules/mogo-module-extensions/build.gradle | 1 + .../extensions/entrance/EntranceFragment.java | 5 + .../extensions/entrance/EntranceProvider.java | 7 +- .../live/CameraLiveGSYVideoView.java | 211 +++++++++++++++++ .../extensions/live/CameraLiveManager.java | 124 ++++++++++ .../live/ExtensionServiceManager.java | 214 ++++++++++++++++++ .../extensions/live/PushCameraLiveWindow.java | 149 ++++++++++++ .../module/extensions/live/PushDataType.java | 13 ++ .../live/impl/AbsCameraScenario.java | 65 ++++++ .../extensions/live/impl/ICameraScenario.java | 46 ++++ .../extensions/live/impl/ICameraWindow.java | 33 +++ .../CameraLiveWindowStatusListener.java | 7 + .../utils/CameraLiveNoticeHelper.java | 121 ++++++++++ .../extensions/view/LiveRoundLayout.java | 85 +++++++ .../drawable-xhdpi/icon_live_load_error.png | Bin 0 -> 6309 bytes .../module_camera_real_time_traffic.png | Bin 0 -> 3390 bytes .../main/res/drawable/v2x_alert_window_bg.xml | 38 ++++ .../res/drawable/v2x_refresh_button_bg.xml | 9 + .../res/layout/camera_item_v2x_live_video.xml | 37 +++ .../res/layout/camera_push_live_video.xml | 22 ++ .../camera_view_video_layout_normal.xml | 68 ++++++ .../src/main/res/values-ldpi/dimens.xml | 3 +- .../src/main/res/values-mdpi/dimens.xml | 3 + .../res/values-xhdpi-1920x1000/dimens.xml | 3 + .../src/main/res/values-xhdpi/dimens.xml | 4 + .../src/main/res/values/colors.xml | 3 +- .../src/main/res/values/dimens.xml | 1 + .../src/main/res/values/styles.xml | 4 + .../module/media/window/MediaWindow2.java | 5 +- modules/mogo-module-v2x/build.gradle | 3 +- 32 files changed, 1292 insertions(+), 8 deletions(-) create mode 100644 modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/CameraLiveGSYVideoView.java create mode 100644 modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/CameraLiveManager.java create mode 100644 modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/ExtensionServiceManager.java create mode 100644 modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/PushCameraLiveWindow.java create mode 100644 modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/PushDataType.java create mode 100644 modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/impl/AbsCameraScenario.java create mode 100644 modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/impl/ICameraScenario.java create mode 100644 modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/impl/ICameraWindow.java create mode 100644 modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/listener/CameraLiveWindowStatusListener.java create mode 100644 modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/CameraLiveNoticeHelper.java create mode 100644 modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/view/LiveRoundLayout.java create mode 100644 modules/mogo-module-extensions/src/main/res/drawable-xhdpi/icon_live_load_error.png create mode 100644 modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_camera_real_time_traffic.png create mode 100644 modules/mogo-module-extensions/src/main/res/drawable/v2x_alert_window_bg.xml create mode 100644 modules/mogo-module-extensions/src/main/res/drawable/v2x_refresh_button_bg.xml create mode 100644 modules/mogo-module-extensions/src/main/res/layout/camera_item_v2x_live_video.xml create mode 100644 modules/mogo-module-extensions/src/main/res/layout/camera_push_live_video.xml create mode 100644 modules/mogo-module-extensions/src/main/res/layout/camera_view_video_layout_normal.xml diff --git a/config.gradle b/config.gradle index 95ed304dde..87bf5019e4 100644 --- a/config.gradle +++ b/config.gradle @@ -144,6 +144,7 @@ ext { videojava : "com.shuyu:gsyVideoPlayer-java:7.1.2", eventbus : "org.greenrobot:eventbus:3.1.1", videoprocessor : "com.zhidao.video:video-processor:1.0.2.1", + livesdk : "com.tencent.liteavsdk:LiteAVSDK_Smart:7.4.9211", coroutinescore : "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3", coroutinesandroid : "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3", diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/MogoSnapshotSetData.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/MogoSnapshotSetData.java index e0c65c2ff9..eec679b05f 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/MogoSnapshotSetData.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/MogoSnapshotSetData.java @@ -36,6 +36,7 @@ class MogoSnapshotSetData implements Parcelable { // 自车速度 本地添加 public double curSpeed = 0.0; + @Override public String toString() { return "MogoSnapshotSetData{" + @@ -43,7 +44,9 @@ class MogoSnapshotSetData implements Parcelable { ", time=" + time + ", expire=" + expire + ", allList=" + allList + - ", trafficLight=" + trafficLight + + ", nearList=" + nearList + + ", camera=" + camera + + ", curSpeed=" + curSpeed + '}'; } @@ -87,6 +90,14 @@ class MogoSnapshotSetData implements Parcelable { this.trafficLight = trafficLight; } + public CloudRoadData getCamera() { + return camera; + } + + public void setCamera(CloudRoadData camera) { + this.camera = camera; + } + public List< CloudRoadData > getNearList() { return nearList; } @@ -111,6 +122,7 @@ class MogoSnapshotSetData implements Parcelable { dest.writeTypedList( this.allList ); dest.writeTypedList( this.nearList ); dest.writeParcelable( this.trafficLight, flags ); + dest.writeParcelable( this.camera, flags ); dest.writeDouble( this.curSpeed ); } @@ -121,6 +133,7 @@ class MogoSnapshotSetData implements Parcelable { this.allList = in.createTypedArrayList( CloudRoadData.CREATOR ); this.nearList = in.createTypedArrayList( CloudRoadData.CREATOR ); this.trafficLight = in.readParcelable( CloudRoadData.class.getClassLoader() ); + this.camera = in.readParcelable( CloudRoadData.class.getClassLoader() ); this.curSpeed = in.readDouble(); } diff --git a/modules/mogo-module-extensions/build.gradle b/modules/mogo-module-extensions/build.gradle index db3c0ee1a4..e59c5e48d5 100644 --- a/modules/mogo-module-extensions/build.gradle +++ b/modules/mogo-module-extensions/build.gradle @@ -49,6 +49,7 @@ dependencies { annotationProcessor rootProject.ext.dependencies.aroutercompiler implementation rootProject.ext.dependencies.rxjava implementation rootProject.ext.dependencies.rxandroid + implementation rootProject.ext.dependencies.livesdk if (Boolean.valueOf(RELEASE)) { api rootProject.ext.dependencies.mogomap diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java index 8df19ce8d4..612e36b511 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java @@ -53,6 +53,7 @@ import com.mogo.module.extensions.navi.NaviInfoView; import com.mogo.module.extensions.navi.VrModeNavInfoView; import com.mogo.module.extensions.userinfo.UserInfo; import com.mogo.module.extensions.utils.AdasNoticeHelper; +import com.mogo.module.extensions.utils.CameraLiveNoticeHelper; import com.mogo.module.extensions.utils.EntranceViewHolder; import com.mogo.module.extensions.utils.NoMapTopViewShaderHelper; import com.mogo.module.extensions.utils.TopViewAnimHelper; @@ -205,6 +206,7 @@ public class EntranceFragment extends MvpFragment "); + ExtensionServiceManager.init(context); return mFragment; } @@ -73,7 +77,8 @@ public class EntranceProvider implements IMogoModuleProvider { @Override public void init( Context context ) { - + Log.d("liyz", " EntranceProvider init ------> "); + ExtensionServiceManager.init(context); } @Override diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/CameraLiveGSYVideoView.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/CameraLiveGSYVideoView.java new file mode 100644 index 0000000000..601f041786 --- /dev/null +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/CameraLiveGSYVideoView.java @@ -0,0 +1,211 @@ +package com.mogo.module.extensions.live; + +import android.content.Context; +import android.graphics.PorterDuff; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ProgressBar; +import android.widget.TextView; + +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.content.ContextCompat; + +import com.mogo.module.extensions.R; +import com.mogo.module.extensions.view.LiveRoundLayout; +import com.mogo.skin.support.IMogoSkinCompatSupportable; +import com.mogo.skin.support.helper.MogoSkinCompatBackgroundHelperDelegate; +import com.mogo.utils.logger.Logger; +import com.tencent.rtmp.ITXLivePlayListener; +import com.tencent.rtmp.TXLiveConstants; +import com.tencent.rtmp.TXLivePlayConfig; +import com.tencent.rtmp.TXLivePlayer; +import com.tencent.rtmp.ui.TXCloudVideoView; + +/** + * V2XLiveGSYVideoView + */ +public class CameraLiveGSYVideoView extends LiveRoundLayout implements IMogoSkinCompatSupportable { + private static final String TAG = "CameraLiveGSYVideoView"; + + private TXCloudVideoView mTxcVideoView; + private ProgressBar mLoading; + private TXLivePlayer mLivePlayer; + private ConstraintLayout mClLoadError; + private TextView mTvRefreshButton; + + private MogoSkinCompatBackgroundHelperDelegate mBackgroundTintHelper; + private String mLiveUrl; + + + public CameraLiveGSYVideoView(Context context) { + this(context, null); + } + + public CameraLiveGSYVideoView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public CameraLiveGSYVideoView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initView(context); + + mBackgroundTintHelper = new MogoSkinCompatBackgroundHelperDelegate(this); + mBackgroundTintHelper.loadFromAttributes(attrs, defStyleAttr); + } + + private void initView(Context context) { + LayoutInflater.from(context) + .inflate(R.layout.camera_view_video_layout_normal, this); + //mPlayerView 即 step1 中添加的界面 view + mTxcVideoView = findViewById(R.id.txcVideoView); + //创建 player 对象 + mLivePlayer = new TXLivePlayer(context); + //关键 player 对象与界面 view + mLivePlayer.setPlayerView(mTxcVideoView); + mLivePlayer.setMute(true); + + TXLivePlayConfig txLivePlayConfig = new TXLivePlayConfig(); + // 增加重试次数 + txLivePlayConfig.setConnectRetryCount(30); + mLivePlayer.setConfig(txLivePlayConfig); + + mLivePlayer.enableHardwareDecode(true); + + mLoading = findViewById(R.id.loading); + mLoading.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(context, R.color.module_live_video_progress_bar_loading_color), PorterDuff.Mode.MULTIPLY); + + mClLoadError = findViewById(R.id.clLoadError); + mTvRefreshButton = findViewById(R.id.tvRefreshButton); + mTvRefreshButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mLoading.setVisibility(VISIBLE); + mClLoadError.setVisibility(GONE); + if (mLiveUrl != null) { + startLive(mLiveUrl); + } + } + }); + } + + + /** + * 开始直播 + * + * @param liveUrl 要直播的车机,如果没有直播的地址需要重新获取最新的直播地址 + */ + public void startLive(String liveUrl) { + // 进行直播播放 + if (mLivePlayer != null) { + if (!TextUtils.isEmpty(liveUrl)) { + mLiveUrl = liveUrl; + playLiveVideo(liveUrl); + } + } + } + + /** + * 播放直播流,且开始心跳 + */ + private void playLiveVideo(String liveUrl) { + try { + if (mLivePlayer != null) { + mLivePlayer.startPlay(liveUrl, TXLivePlayer.PLAY_TYPE_LIVE_RTMP); + mLivePlayer.setPlayListener(new ITXLivePlayListener() { + @Override + public void onPlayEvent(int event, Bundle bundle) { + Logger.w(TAG, + "直播信息= " + + "\n播放器:onPlayEvent==" + event + + "\nbundle===" + bundle); + Logger.d(TAG, "liveUrl = " + liveUrl); + if (event == TXLiveConstants.PLAY_EVT_PLAY_LOADING) { + mLoading.setVisibility(VISIBLE); + mClLoadError.setVisibility(GONE); + } else if (event == TXLiveConstants.PLAY_EVT_PLAY_BEGIN) { + mLoading.setVisibility(GONE); + mClLoadError.setVisibility(GONE); + } else if (event < 0) { +// AIAssist.getInstance(V2XUtils.getApp()).speakTTSVoice("直播获取失败,可以对我说重试", null); + stopLive(mLiveUrl); + mLoading.setVisibility(GONE); + mClLoadError.setVisibility(VISIBLE); +// // 注册语音交互 +// V2XVoiceManager.INSTANCE +// .registerWakeCmd(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_REFRESH_CAR_LIVE, +// v2XVoiceCallbackRefreshListener) +// .registerUnWakeVoice(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_REFRESH_LIVE_UN_WAKEUP, +// v2XVoiceCallbackRefreshListener); + } + } + + @Override + public void onNetStatus(Bundle bundle) { + Logger.w(TAG, "播放器:onNetStatus===bundle===" + bundle); + } + }); + } + } catch (Exception e) { + e.printStackTrace(); + mLoading.setVisibility(GONE); + mClLoadError.setVisibility(VISIBLE); + } + } + + public void stopLive(String liveUrl) { + try { + Logger.w(TAG, "心跳:关闭直播..."); + // 暂停 + mLivePlayer.pause(); + // true 代表清除最后一帧画面 + mLivePlayer.stopPlay(true); + mTxcVideoView.onDestroy(); + // 停止推流 +// V2XServiceManager +// .getV2XRefreshModel() +// .livePush(new V2XRefreshCallback() { +// @Override +// public void onSuccess(V2XLivePushVoRes result) { +// Logger.d(TAG, "播放器:" + result); +// } +// +// @Override +// public void onFail(String msg) { +// Logger.e(TAG, "播放器:" + msg); +// } +// }, carLiveInfo.getVideoSn(), 1); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + if (mLiveUrl != null) { + startLive(mLiveUrl); + } + } + + @Override + protected void onDetachedFromWindow() { + stopLive(mLiveUrl); + mLoading.setVisibility(VISIBLE); + // 反注册语音交互 +// V2XVoiceManager.INSTANCE +// .unRegisterWakeCmd(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_REFRESH_CAR_LIVE) +// .unRegisterUnWakeVoice(V2XVoiceConstants.COMMAND_ZHIDAO_V2X_REFRESH_LIVE_UN_WAKEUP); + super.onDetachedFromWindow(); + } + + @Override + public void applySkin() { + if (mBackgroundTintHelper != null) { + mBackgroundTintHelper.applySkin(); + } + } +} diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/CameraLiveManager.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/CameraLiveManager.java new file mode 100644 index 0000000000..4debd09358 --- /dev/null +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/CameraLiveManager.java @@ -0,0 +1,124 @@ +package com.mogo.module.extensions.live; + +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.Nullable; + +import com.mogo.commons.AbsMogoApplication; +import com.mogo.module.common.entity.CloudRoadData; +import com.mogo.module.extensions.R; +import com.mogo.module.extensions.live.impl.AbsCameraScenario; +import com.mogo.service.windowview.IMogoTopViewStatusListener; +import com.mogo.utils.logger.Logger; + +/** + * 路边摄像头直播控制 V2XPushLiveCarScenario + */ +public class CameraLiveManager extends AbsCameraScenario implements IMogoTopViewStatusListener { + private static final String TAG = "CameraLiveManager"; + private static CameraLiveManager mCameraLiveCarScenario; + private boolean isShowWindow; + + private CameraLiveManager() { + } + + public static CameraLiveManager getInstance() { + if (mCameraLiveCarScenario == null) { + synchronized (CameraLiveManager.class) { + if (mCameraLiveCarScenario == null) { + mCameraLiveCarScenario = new CameraLiveManager(); + mCameraLiveCarScenario.setV2XWindow(new PushCameraLiveWindow()); + } + } + } + return mCameraLiveCarScenario; + } + + @Override + public void init(@Nullable CloudRoadData cloudRoadData) { + Log.d(TAG, "CameraLiveManager init -----> "); + if (isShowWindow) { + close(); + } + + setmCloudRoadData(cloudRoadData); + show(); + } + + @Override + public void show() { + showWindow(); + } + + @Override + public void showWindow() { + Log.d(TAG, "CameraLiveManager showWindow --------"); + if (getV2XWindow() != null) { + ViewGroup.LayoutParams layoutParams = + new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + (int) AbsMogoApplication.getApp().getResources() + .getDimension(R.dimen.module_video_window_height_content)); + + ExtensionServiceManager + .getMogoTopViewManager() + .addViewNoLinkage(getV2XWindow().getView(), layoutParams, this); + getV2XWindow().show(getmCloudRoadData()); + isShowWindow = true; +// ExtensionServiceManager.getMoGoV2XStatusManager().setRoadLiveCarWindowShow(TAG, true); + } + } + + @Override + public void closeWindow() { + if (getV2XWindow() != null) { + getV2XWindow().close(); + } + isShowWindow = false; +// ExtensionServiceManager.getMoGoV2XStatusManager().setRoadLiveCarWindowShow(TAG, false); + } + + @Override + public void showButton() { + + } + + @Override + public void closeButton() { + + } + + @Override + public void drawPOI() { + + } + + @Override + public void clearPOI() { + + } + + @Override + public void onViewAdded(View view) { + Logger.d(TAG, "展示 Window 动画结束"); + + } + + @Override + public void onViewRemoved(View view) { + Logger.d(TAG, "关闭 Window 动画结束"); + + } + + @Override + public void beforeViewAddAnim(View view) { + Logger.d(TAG, "展示 Window 开始"); + } + + @Override + public void beforeViewRemoveAnim(View view) { + + } +} diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/ExtensionServiceManager.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/ExtensionServiceManager.java new file mode 100644 index 0000000000..4084b0bd6a --- /dev/null +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/ExtensionServiceManager.java @@ -0,0 +1,214 @@ +package com.mogo.module.extensions.live; + +import android.content.Context; + +import com.alibaba.android.arouter.launcher.ARouter; +import com.mogo.map.location.IMogoLocationClient; +import com.mogo.map.marker.IMogoMarkerManager; +import com.mogo.map.navi.IMogoNavi; +import com.mogo.map.overlay.IMogoOverlayManager; +import com.mogo.map.search.geo.IMogoGeoSearch; +import com.mogo.map.uicontroller.IMogoMapUIController; +import com.mogo.service.IMogoServiceApis; +import com.mogo.service.MogoServicePaths; +import com.mogo.service.analytics.IMogoAnalytics; +import com.mogo.service.connection.IMogoSocketManager; +import com.mogo.service.entrance.IMogoEntranceButtonController; +import com.mogo.service.eventpanel.IEventPanelProvider; +import com.mogo.service.imageloader.IMogoImageloader; +import com.mogo.service.intent.IMogoIntentManager; +import com.mogo.service.map.IMogoMapService; +import com.mogo.service.module.IMogoActionManager; +import com.mogo.service.module.IMogoMarkerService; +import com.mogo.service.module.IMogoRegisterCenter; +import com.mogo.service.module.IMogoSearchManager; +import com.mogo.service.share.IMogoShareManager; +import com.mogo.service.share.IMogoTanluProvider; +import com.mogo.service.share.IMogoTrafficUploadProvider; +import com.mogo.service.statusmanager.IMogoStatusManager; +import com.mogo.service.strategy.IMogoOnlineCarListPanelProvider; +import com.mogo.service.strategy.IMogoRefreshStrategyController; +import com.mogo.service.windowview.IMogoTopViewManager; +import com.mogo.service.windowview.IMogoWindowManager; + + +public class ExtensionServiceManager { + private static boolean isInit; + private static Context mContext; + private static IMogoServiceApis mMogoServiceApis; + + private static IMogoMapService mMapService; + private static IMogoMarkerManager mMarkerManager; + private static IMogoNavi mNavi; + private static IMogoMapUIController mMapUIController; + private static IMogoLocationClient mMogoLocationClient; + private static IMogoGeoSearch mIMogoGeoSearch; + private static IMogoSearchManager mIMogoSearchManager; + private static IMogoTopViewManager mMogoTopViewManager; + private static IMogoStatusManager mMogoStatusManager; + private static IMogoWindowManager mIMogoWindowManager; + private static IMogoImageloader mImageLoader; + private static IMogoSocketManager mMogoSocketManager; + private static IMogoAnalytics mMogoAnalytics; + private static IMogoOverlayManager mMogoOverlayManager; + private static IMogoRegisterCenter mMogoRegisterCenter; + private static IMogoRefreshStrategyController mIMogoRefreshStrategyController; + private static IMogoMarkerService mIMogoMarkerService; + private static IMogoShareManager mIMogoShareManager; + private static IMogoTanluProvider mIMogoTanluProvider; + private static IMogoTrafficUploadProvider mIMogoTrafficUploadProvider; + //事件面板 + private static IEventPanelProvider mIEventPanelProvider; + + private static IMogoActionManager mMogoActionManager; + private static IMogoIntentManager mMogoIntentManager; + private static IMogoEntranceButtonController mMogoEntranceButtonController; + private static IMogoOnlineCarListPanelProvider mMogoOnlineCarListPanelProvider; + + + private ExtensionServiceManager() { + + } + + public static void init(final Context context) { + if (!isInit) { + isInit = true; + + mContext = context; + mMogoServiceApis = (IMogoServiceApis) ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS).navigation(context); + + mMapService = mMogoServiceApis.getMapServiceApi(); + mImageLoader = mMogoServiceApis.getImageLoaderApi(); + mMogoStatusManager = mMogoServiceApis.getStatusManagerApi(); + mMogoSocketManager = mMogoServiceApis.getSocketManagerApi(context); + mMogoAnalytics = mMogoServiceApis.getAnalyticsApi(); + mIMogoWindowManager = mMogoServiceApis.getWindowManagerApi(); + mMogoRegisterCenter = mMogoServiceApis.getRegisterCenterApi(); + mIMogoRefreshStrategyController = mMogoServiceApis.getRefreshStrategyControllerApi(); + mMogoEntranceButtonController = mMogoServiceApis.getEntranceButtonController(); + mMogoActionManager = mMogoServiceApis.getActionManagerApi(); + mMogoTopViewManager = mMogoServiceApis.getTopViewManager(); + mIMogoSearchManager = mMogoServiceApis.getSearchManagerApi(); + mIMogoMarkerService = mMogoServiceApis.getMarkerService(); + mIMogoShareManager = mMogoServiceApis.getShareManager(); + mIMogoTanluProvider = mMogoServiceApis.getTanluApi(); + mIMogoTrafficUploadProvider = mMogoServiceApis.getTrafficUploadApi(); + mMogoOnlineCarListPanelProvider = mMogoServiceApis.getOnlineCarPanelApi(); + //事件面板 + mIEventPanelProvider = mMogoServiceApis.getEventPanelManager(); + + mMarkerManager = mMapService.getMarkerManager(context); + mNavi = mMapService.getNavi(context); + mMapUIController = mMapService.getMapUIController(); + mMogoLocationClient = mMapService.getSingletonLocationClient(context); + mMogoOverlayManager = mMapService.getOverlayManager(context); + mIMogoGeoSearch = mMapService.getGeoSearch(context); + + mMogoIntentManager = mMogoServiceApis.getIntentManagerApi(); + } + } + + public static Context getContext() { + return mContext; + } + + public static IMogoTopViewManager getMogoTopViewManager() { + return mMogoTopViewManager; + } + + public static IMogoEntranceButtonController getMogoEntranceButtonController() { + return mMogoEntranceButtonController; + } + + public static IMogoMapService getMapService() { + return mMapService; + } + + public static IMogoOverlayManager getMogoOverlayManager() { + return mMogoOverlayManager; + } + + public static IMogoRegisterCenter getMogoRegisterCenter() { + return mMogoRegisterCenter; + } + + public static IMogoMarkerManager getMarkerManager() { + return mMarkerManager; + } + + public static IMogoNavi getNavi() { + return mNavi; + } + + public static IMogoMapUIController getMapUIController() { + return mMapUIController; + } + + public static IMogoLocationClient getMogoLocationClient() { + return mMogoLocationClient; + } + + public static IMogoImageloader getImageLoader() { + return mImageLoader; + } + + public static IMogoSocketManager getMoGoSocketManager() { + return mMogoSocketManager; + } + + public static IMogoStatusManager getMoGoStatusManager() { + return mMogoStatusManager; + } + + public static IMogoWindowManager getIMogoWindowManager() { + return mIMogoWindowManager; + } + + public static IMogoIntentManager getMogoIntentManager() { + return mMogoIntentManager; + } + + public static IMogoActionManager getMogoActionManager() { + return mMogoActionManager; + } + + public static IMogoGeoSearch getMogoGeoSearch() { + return mIMogoGeoSearch; + } + + public static IMogoSearchManager getSearchManager() { + return mIMogoSearchManager; + } + + public static IMogoRefreshStrategyController getIMogoRefreshStrategyController() { + return mIMogoRefreshStrategyController; + } + + public static IMogoAnalytics getMogoAnalytics() { + return mMogoAnalytics; + } + + public static IMogoMarkerService getIMogoMarkerService() { + return mIMogoMarkerService; + } + + public static IMogoShareManager getMogoShareManager() { + return mIMogoShareManager; + } + + public static IMogoTanluProvider getTanluManager() { + return mIMogoTanluProvider; + } + + public static IMogoTrafficUploadProvider getIMogoTrafficUploadProvider() { + return mIMogoTrafficUploadProvider; + } + + public static IMogoOnlineCarListPanelProvider getMogoOnlineCarListPanelProvider() { + return mMogoOnlineCarListPanelProvider; + } + + public static IEventPanelProvider getEventPanelProvider() { + return mIEventPanelProvider; + } +} diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/PushCameraLiveWindow.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/PushCameraLiveWindow.java new file mode 100644 index 0000000000..70c79b5528 --- /dev/null +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/PushCameraLiveWindow.java @@ -0,0 +1,149 @@ +package com.mogo.module.extensions.live; + +import android.content.Context; +import android.os.Handler; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.RelativeLayout; + +import com.mogo.module.common.entity.CloudRoadData; +import com.mogo.module.extensions.R; +import com.mogo.module.extensions.live.listener.CameraLiveWindowStatusListener; +import com.mogo.module.extensions.live.impl.ICameraWindow; +import com.mogo.service.imageloader.MogoImageView; +import com.mogo.utils.logger.Logger; + + +/** + * 点击摄像头 marker + * vr路边摄像头弹窗 V2XPushLiveCarWindow + */ +public class PushCameraLiveWindow extends RelativeLayout implements ICameraWindow { + private static final String TAG = "PushCameraLiveWindow"; + private Context mContext; + private CameraLiveGSYVideoView mLiveGSYVideoView; + private MogoImageView mIvReportHead; + private ImageView pushVideoClose; + + // 弹窗状态监听 + private CameraLiveWindowStatusListener mWindowStatusListener; + + // 直播30秒自动关闭 + private static Handler handlerV2XEvent = new Handler(); + private static Runnable runnableV2XEvent; + + public PushCameraLiveWindow() { + this(ExtensionServiceManager.getContext(), null); + } + + public PushCameraLiveWindow(Context context) { + this(context, null); + } + + public PushCameraLiveWindow(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public PushCameraLiveWindow(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mContext = context; + initView(context); + } + + public void initView(Context context) { + Logger.w(TAG, "initView 。。。。。"); + LayoutInflater.from(context).inflate(R.layout.camera_push_live_video, this); + // 详情列表 + mLiveGSYVideoView = findViewById(R.id.videoPlayer); + mIvReportHead = findViewById(R.id.ivReportHead); + pushVideoClose = findViewById(R.id.pushVideoClose); + pushVideoClose.setOnClickListener(v -> { + //移除窗体 + ExtensionServiceManager + .getMogoTopViewManager() + .removeViewNoLinkage(this); + }); + } + + /** + * 展示直播Windows + */ + @Override + public void show(CloudRoadData entity) { + if (entity != null) { + Logger.w(TAG, "更新直播信息 show entity = " + entity); + if (!TextUtils.isEmpty(entity.getRtmpUrl())) { + Logger.w(TAG, "entity.getRtmpUrl() = " + entity.getRtmpUrl()); + mIvReportHead.setVisibility(VISIBLE); + ExtensionServiceManager.getImageLoader() + .displayImage(entity.getRtmpUrl(), mIvReportHead); + mLiveGSYVideoView.startLive(entity.getRtmpUrl()); + } + + countDownV2XEvent(entity); + if (mWindowStatusListener != null) { + mWindowStatusListener.onViewShow(); + } + } + } + + @Override + public View getView() { + return this; + } + + @Override + public void close() { + // 修改地图比例 +// V2XServiceManager.getMoGoStatusManager().setUserInteractionStatus(MODULE_NAME, true, false); + // 锁车就是将地图视图移植中心点,因为行驶中的车和地图要相对的跟随 +// MarkerUtils.resetMapZoom(16); + + // 如果窗体处于展示的时候 + if (mWindowStatusListener != null) { + mWindowStatusListener.onViewClose(); + } + + // 停止倒计时 + if (handlerV2XEvent != null && runnableV2XEvent != null) { + handlerV2XEvent.removeCallbacks(runnableV2XEvent); + runnableV2XEvent = null; + } + + //移除窗体 + ExtensionServiceManager + .getMogoTopViewManager() + .removeView(this); + } + + + @Override + public void setWindowStatusListener(CameraLiveWindowStatusListener listener) { + this.mWindowStatusListener = listener; + } + + /** + * 窗体倒计时 TODO + */ + public void countDownV2XEvent(CloudRoadData data) { + // 倒计时 + if (runnableV2XEvent == null) { + runnableV2XEvent = () -> { + //Logger.d(MODULE_NAME, "V2X=== Window 30秒倒计时结束。。。"); + //移除窗体 + ExtensionServiceManager + .getMogoTopViewManager() + .removeViewNoLinkage(this); + }; + } else { + handlerV2XEvent.removeCallbacks(runnableV2XEvent); + } + + Logger.d(TAG, "V2X=== Window 展示开始倒计时:" ); + handlerV2XEvent.postDelayed(runnableV2XEvent, 20000); + } + +} diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/PushDataType.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/PushDataType.java new file mode 100644 index 0000000000..6a5a9bf80c --- /dev/null +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/PushDataType.java @@ -0,0 +1,13 @@ +package com.mogo.module.extensions.live; + +/** + * @author lixiaopeng + * @description + * @since 2020/12/13 + */ +public class PushDataType { + /** + * Push 摄像头事件场景 VR + */ + public static final String TYPE_PUSH_CAMERA_DATA = "TYPE_PUSH_CAMERA_DATA"; +} diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/impl/AbsCameraScenario.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/impl/AbsCameraScenario.java new file mode 100644 index 0000000000..6dfb6e4ada --- /dev/null +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/impl/AbsCameraScenario.java @@ -0,0 +1,65 @@ +package com.mogo.module.extensions.live.impl; + +import androidx.annotation.Nullable; + +import com.mogo.module.common.entity.CloudRoadData; + + +public abstract class AbsCameraScenario implements ICameraScenario { + protected String TAG = "AbsCameraScenario"; + private ICameraWindow mV2XWindow; + private CloudRoadData mCloudRoadData; + +// private IV2XButton mV2XButton; +// private IV2XMarker mV2XMarker; +// private IMoGoV2XStatusManager mV2XStatusManager; +// private V2XMessageEntity mV2XMessageEntity; + +// protected AbsCameraScenario() { +// this.mV2XStatusManager = V2XServiceManager.getMoGoV2XStatusManager(); +// } + + public abstract void init(@Nullable CloudRoadData cloudRoadData); + + @Override + public void close() { + closeButton(); + closeWindow(); + clearPOI(); + } + + + public ICameraWindow getV2XWindow() { + return mV2XWindow; + } + + public void setV2XWindow(@Nullable ICameraWindow mV2XWindow) { + this.mV2XWindow = mV2XWindow; + } + + public CloudRoadData getmCloudRoadData() { + return mCloudRoadData; + } + + public void setmCloudRoadData(CloudRoadData mCloudRoadData) { + this.mCloudRoadData = mCloudRoadData; + } + + // public IV2XMarker getV2XMarker() { +// return mV2XMarker; +// } +// +// public IV2XButton getV2XButton() { +// return mV2XButton; +// } + +// public void setV2XButton(@Nullable IV2XButton mV2XButton) { +// this.mV2XButton = mV2XButton; +// } +// +// public void setV2XMarker(@Nullable IV2XMarker mV2XMarker) { +// this.mV2XMarker = mV2XMarker; +// } + + +} diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/impl/ICameraScenario.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/impl/ICameraScenario.java new file mode 100644 index 0000000000..db829a28b1 --- /dev/null +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/impl/ICameraScenario.java @@ -0,0 +1,46 @@ +package com.mogo.module.extensions.live.impl; + + +public interface ICameraScenario { + + /** + * 展示场景 + */ + void show(); + + /** + * 关闭场景 + */ + void close(); + + /** + * 展示Window + */ + void showWindow(); + + /** + * 关闭Window + */ + void closeWindow(); + + /** + * 展示按钮 + */ + void showButton(); + + /** + * 关闭按钮 + */ + void closeButton(); + + /** + * 绘制POI + */ + void drawPOI(); + + /** + * 清除POI + */ + void clearPOI(); + +} diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/impl/ICameraWindow.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/impl/ICameraWindow.java new file mode 100644 index 0000000000..13cd90417c --- /dev/null +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/impl/ICameraWindow.java @@ -0,0 +1,33 @@ +package com.mogo.module.extensions.live.impl; + +import android.view.View; + +import com.mogo.module.extensions.live.listener.CameraLiveWindowStatusListener; + +public interface ICameraWindow { + + /** + * 展示1/2窗口 + */ + void show(T entity); + + /** + * 关闭1/2窗口 + */ + void close(); + + /** + * 返回窗体 + * + * @return 当前窗体 + */ + View getView(); + + /** + * 设置Window状态监听 + * + * @param listener 监听器 + */ + void setWindowStatusListener(CameraLiveWindowStatusListener listener); + +} diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/listener/CameraLiveWindowStatusListener.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/listener/CameraLiveWindowStatusListener.java new file mode 100644 index 0000000000..8334977555 --- /dev/null +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/listener/CameraLiveWindowStatusListener.java @@ -0,0 +1,7 @@ +package com.mogo.module.extensions.live.listener; + + +public interface CameraLiveWindowStatusListener { + void onViewShow(); + void onViewClose(); +} diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/CameraLiveNoticeHelper.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/CameraLiveNoticeHelper.java new file mode 100644 index 0000000000..fbec2bd1a7 --- /dev/null +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/CameraLiveNoticeHelper.java @@ -0,0 +1,121 @@ +package com.mogo.module.extensions.utils; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; + +import com.mogo.commons.AbsMogoApplication; +import com.mogo.map.marker.IMogoMarker; +import com.mogo.map.marker.IMogoMarkerClickListener; +import com.mogo.map.marker.MogoMarkerOptions; +import com.mogo.module.common.MogoApisHandler; +import com.mogo.module.common.constants.DataTypes; +import com.mogo.module.common.entity.CloudRoadData; +import com.mogo.module.common.entity.MogoSnapshotSetData; +import com.mogo.module.extensions.R; +import com.mogo.module.extensions.live.CameraLiveManager; +import com.mogo.module.extensions.live.ExtensionServiceManager; +import com.mogo.module.extensions.live.PushDataType; +import com.mogo.service.connection.IMogoOnWebSocketMessageListener; +import com.mogo.service.connection.WebSocketMsgType; +import com.mogo.utils.logger.Logger; + + +/** + * vr模式下,红绿灯消息 AdasNoticeHelper + * + */ +public class CameraLiveNoticeHelper implements IMogoOnWebSocketMessageListener { + private static final String TAG = "CameraLiveNoticeHelper"; + private Context mContext; + private static IMogoMarker mMogoMarker; + private CloudRoadData mCloudRoadData; + + + public void init(Context context) { + Logger.d(TAG, "init===="); + mContext = context; + ExtensionServiceManager + .getMogoRegisterCenter().registerMogoMarkerClickListener(PushDataType.TYPE_PUSH_CAMERA_DATA, new IMogoMarkerClickListener() { + @Override + public boolean onMarkerClicked(IMogoMarker marker) { + //点击的marker的具体数据 TODO + if (mCloudRoadData != null) { + CameraLiveManager.getInstance().init(mCloudRoadData); + } else { + Logger.e(TAG, " mCloudRoadData == null "); + } + + return false; + } + }); + } + + public void enterVrMode() { + Logger.d(TAG, "enterVrMode==="); + MogoApisHandler.getInstance().getApis().getWebSocketManagerApi(mContext).registerOnWebSocketMessageListener(this); + } + + public void exitVrMode() { + Logger.d(TAG, "退出vr模式==="); + MogoApisHandler.getInstance().getApis().getWebSocketManagerApi(mContext).unregisterOnWebSocketMessageListener(this); + } + + /** + * PushRoadConditionDrawer + * @param roadData + */ + private void addCameraMarker(CloudRoadData roadData) { + Logger.d(TAG, "addCameraMarker ------ "); + MogoMarkerOptions options = new MogoMarkerOptions() + .object(roadData) + .latitude(roadData.getLat()) + .longitude(roadData.getLon()); + options.anchor(0.5f, 0.5f); + + Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.module_camera_real_time_traffic, null); + options.icon(bitmap); + mMogoMarker = MogoApisHandler + .getInstance() + .getApis() + .getMapServiceApi() + .getMarkerManager(AbsMogoApplication.getApp()) + .addMarker(DataTypes.TYPE_MARKER_PUSH_DATA, options); + + ExtensionServiceManager.getMapService().getMarkerManager(mContext).addMarker(PushDataType.TYPE_PUSH_CAMERA_DATA, options); + } + + private void removeCameraMarker() { + if (mMogoMarker != null) { + mMogoMarker.remove(); + } + } + + + @Override + public WebSocketMsgType getDownLinkType() { + return WebSocketMsgType.MSG_TYPE_DOWNLINK_CAR_DATA; + } + + @Override + public Class target() { + return MogoSnapshotSetData.class; + } + + @Override + public void onMsgReceived(MogoSnapshotSetData obj) { + Logger.d(TAG, "onMsgReceived cameralive : " + obj); + mCloudRoadData = obj.getTrafficLight(); + if (mCloudRoadData != null) { + Logger.d(TAG, "onMsgReceived cameralive : "); + //添加marker TODO + addCameraMarker(mCloudRoadData); + + } else { + //删除marker TODO + removeCameraMarker(); + + } + } + +} diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/view/LiveRoundLayout.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/view/LiveRoundLayout.java new file mode 100644 index 0000000000..bc97d2f5d2 --- /dev/null +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/view/LiveRoundLayout.java @@ -0,0 +1,85 @@ +package com.mogo.module.extensions.view; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Path; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.widget.RelativeLayout; + + +import com.mogo.module.extensions.R; +import com.mogo.skin.support.IMogoSkinCompatSupportable; +import com.mogo.skin.support.helper.MogoSkinCompatBackgroundHelperDelegate; + + +public class LiveRoundLayout extends RelativeLayout implements IMogoSkinCompatSupportable { + private float roundLayoutRadius = 14f; + private Path roundPath; + private RectF rectF; + private MogoSkinCompatBackgroundHelperDelegate mBackgroundTintHelper; + + public LiveRoundLayout(Context context) { + this(context, null); + } + + public LiveRoundLayout(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public LiveRoundLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundLayout); + roundLayoutRadius = typedArray.getDimensionPixelSize(R.styleable.RoundLayout_roundLayoutRadius, (int) roundLayoutRadius); + typedArray.recycle(); + + init(); + + mBackgroundTintHelper = new MogoSkinCompatBackgroundHelperDelegate(this); + mBackgroundTintHelper.loadFromAttributes(attrs, defStyleAttr); + } + + + private void init() { + setWillNotDraw(false);//如果你继承的是ViewGroup,注意此行,否则draw方法是不会回调的; + roundPath = new Path(); + rectF = new RectF(); + } + + private void setRoundPath() { + //添加一个圆角矩形到path中, 如果要实现任意形状的View, 只需要手动添加path就行 + roundPath.addRoundRect(rectF, roundLayoutRadius, roundLayoutRadius, Path.Direction.CW); + } + + + public void setRoundLayoutRadius(float roundLayoutRadius) { + this.roundLayoutRadius = roundLayoutRadius; + setRoundPath(); + postInvalidate(); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + rectF.set(0f, 0f, getMeasuredWidth(), getMeasuredHeight()); + setRoundPath(); + } + + @Override + public void draw(Canvas canvas) { + if (roundLayoutRadius > 0f) { + canvas.clipPath(roundPath); + } + super.draw(canvas); + } + + @Override + public void applySkin() { + if (mBackgroundTintHelper != null) { + mBackgroundTintHelper.applySkin(); + } + } +} + diff --git a/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/icon_live_load_error.png b/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/icon_live_load_error.png new file mode 100644 index 0000000000000000000000000000000000000000..a1da551655536f62ce8eaa5454c3f9e30500f702 GIT binary patch literal 6309 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 bJJtWc1%85!Qn2Qr00000NkvXXu0mjfv0E2y literal 0 HcmV?d00001 diff --git a/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_camera_real_time_traffic.png b/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_camera_real_time_traffic.png new file mode 100644 index 0000000000000000000000000000000000000000..049d2131487803af958e74dbe52ebf4ebf85494b GIT binary patch literal 3390 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 UELE{h-T(jq07*qoM6N<$f(3_!GXMYp literal 0 HcmV?d00001 diff --git a/modules/mogo-module-extensions/src/main/res/drawable/v2x_alert_window_bg.xml b/modules/mogo-module-extensions/src/main/res/drawable/v2x_alert_window_bg.xml new file mode 100644 index 0000000000..5f9bc8d7d2 --- /dev/null +++ b/modules/mogo-module-extensions/src/main/res/drawable/v2x_alert_window_bg.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/drawable/v2x_refresh_button_bg.xml b/modules/mogo-module-extensions/src/main/res/drawable/v2x_refresh_button_bg.xml new file mode 100644 index 0000000000..cac43e0f2d --- /dev/null +++ b/modules/mogo-module-extensions/src/main/res/drawable/v2x_refresh_button_bg.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/layout/camera_item_v2x_live_video.xml b/modules/mogo-module-extensions/src/main/res/layout/camera_item_v2x_live_video.xml new file mode 100644 index 0000000000..da246758f3 --- /dev/null +++ b/modules/mogo-module-extensions/src/main/res/layout/camera_item_v2x_live_video.xml @@ -0,0 +1,37 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/layout/camera_push_live_video.xml b/modules/mogo-module-extensions/src/main/res/layout/camera_push_live_video.xml new file mode 100644 index 0000000000..a444b15a4a --- /dev/null +++ b/modules/mogo-module-extensions/src/main/res/layout/camera_push_live_video.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/layout/camera_view_video_layout_normal.xml b/modules/mogo-module-extensions/src/main/res/layout/camera_view_video_layout_normal.xml new file mode 100644 index 0000000000..a25796d122 --- /dev/null +++ b/modules/mogo-module-extensions/src/main/res/layout/camera_view_video_layout_normal.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + diff --git a/modules/mogo-module-extensions/src/main/res/values-ldpi/dimens.xml b/modules/mogo-module-extensions/src/main/res/values-ldpi/dimens.xml index 6c6614f147..468a4617d3 100644 --- a/modules/mogo-module-extensions/src/main/res/values-ldpi/dimens.xml +++ b/modules/mogo-module-extensions/src/main/res/values-ldpi/dimens.xml @@ -3,5 +3,6 @@ 2px 0px -6px - + 20px + 370px \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/values-mdpi/dimens.xml b/modules/mogo-module-extensions/src/main/res/values-mdpi/dimens.xml index 8a48af5df3..286f0b120f 100644 --- a/modules/mogo-module-extensions/src/main/res/values-mdpi/dimens.xml +++ b/modules/mogo-module-extensions/src/main/res/values-mdpi/dimens.xml @@ -13,4 +13,7 @@ 1920px -1 0px + 20px + 370px + \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/values-xhdpi-1920x1000/dimens.xml b/modules/mogo-module-extensions/src/main/res/values-xhdpi-1920x1000/dimens.xml index 71c4fe9ef9..9d0821625b 100644 --- a/modules/mogo-module-extensions/src/main/res/values-xhdpi-1920x1000/dimens.xml +++ b/modules/mogo-module-extensions/src/main/res/values-xhdpi-1920x1000/dimens.xml @@ -159,4 +159,7 @@ -1 0px + + 36px + 664px \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/values-xhdpi/dimens.xml b/modules/mogo-module-extensions/src/main/res/values-xhdpi/dimens.xml index e70fc69b2a..f35e24782f 100644 --- a/modules/mogo-module-extensions/src/main/res/values-xhdpi/dimens.xml +++ b/modules/mogo-module-extensions/src/main/res/values-xhdpi/dimens.xml @@ -176,4 +176,8 @@ 20px 16px 20px + + 36px + 664px + \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/values/colors.xml b/modules/mogo-module-extensions/src/main/res/values/colors.xml index 943bde9777..d00d7313db 100644 --- a/modules/mogo-module-extensions/src/main/res/values/colors.xml +++ b/modules/mogo-module-extensions/src/main/res/values/colors.xml @@ -9,6 +9,7 @@ #FF2B2B #E3BC59 #FFF - + #256BFF + #FFFFFF \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/values/dimens.xml b/modules/mogo-module-extensions/src/main/res/values/dimens.xml index 653d924d60..173e3fb522 100644 --- a/modules/mogo-module-extensions/src/main/res/values/dimens.xml +++ b/modules/mogo-module-extensions/src/main/res/values/dimens.xml @@ -239,5 +239,6 @@ 21px 21px + 370px \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/values/styles.xml b/modules/mogo-module-extensions/src/main/res/values/styles.xml index b92fcf7d00..ebcaf53855 100644 --- a/modules/mogo-module-extensions/src/main/res/values/styles.xml +++ b/modules/mogo-module-extensions/src/main/res/values/styles.xml @@ -3,4 +3,8 @@ + + + + \ No newline at end of file diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/window/MediaWindow2.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/window/MediaWindow2.java index 5a9f514f9a..222842029d 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/window/MediaWindow2.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/window/MediaWindow2.java @@ -184,7 +184,6 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener { } else { mWindowView.setVisibility(View.VISIBLE); } - } else { mWindowView = LayoutInflater.from(mContext).inflate(R.layout.module_media_music_window_alert_layout, null); @@ -447,7 +446,7 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener { (int) ((current * 1.0f * 100) / (total * 1.0f)); if (mPercentageRingView != null) { mPercentageRingView.setVisibility(View.VISIBLE); - Log.d(TAG, "progress vr = " + progress); +// Log.d(TAG, "progress vr = " + progress); mPercentageRingView.setTargetPercent(progress); } } catch (Exception e) { @@ -466,7 +465,7 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener { int progress = (int) ((current * 1.0f * 100) / (total * 1.0f)); if (mWindowProgress != null) { - Log.d(TAG, "progress = " + progress); +// Log.d(TAG, "progress = " + progress); mWindowProgress.setProgress(progress); } } catch (Exception e) { diff --git a/modules/mogo-module-v2x/build.gradle b/modules/mogo-module-v2x/build.gradle index 1a7eaf2143..1962ad41fb 100644 --- a/modules/mogo-module-v2x/build.gradle +++ b/modules/mogo-module-v2x/build.gradle @@ -43,7 +43,8 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.tencent.liteavsdk:LiteAVSDK_Smart:7.4.9211' +// implementation 'com.tencent.liteavsdk:LiteAVSDK_Smart:7.4.9211' + implementation rootProject.ext.dependencies.livesdk implementation 'ch.hsr:geohash:1.4.0' implementation rootProject.ext.dependencies.flexbox implementation rootProject.ext.dependencies.rxandroid From f767acf274e785a174e9040f3f29e2d7ce06ce5c Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Sun, 13 Dec 2020 16:02:03 +0800 Subject: [PATCH 5/8] opt --- .../com/mogo/module/media/window/MediaWindow2.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/window/MediaWindow2.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/window/MediaWindow2.java index 222842029d..c3f8748bea 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/window/MediaWindow2.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/window/MediaWindow2.java @@ -89,6 +89,7 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener { } ServiceMediaHandler.getIMogoStatusManager().registerStatusChangedListener(MediaConstants.MODULE_TYPE, StatusDescriptor.ACC_STATUS, this); + ServiceMediaHandler.getIMogoStatusManager().registerStatusChangedListener(MediaConstants.MODULE_TYPE, StatusDescriptor.VR_MODE, this); // 车聊聊才是王 mCallProviderResponse = new ICallChatResponse(){ @@ -114,10 +115,17 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener { @Override public void onStatusChanged( StatusDescriptor descriptor, boolean isTrue ) { + Log.d(TAG, " onStatusChanged ----- descriptor = " + descriptor); if (descriptor == StatusDescriptor.ACC_STATUS&&!isTrue) { ServiceMediaHandler.getMogoWindowManager().removeView(mWindowView); mHasAddWindow = false; } + + if (descriptor == StatusDescriptor.VR_MODE) { + ServiceMediaHandler.getMogoWindowManager().removeView(mWindowView); + mHasAddWindow = false; + addWindowView(); + } } private void addWindowView() { @@ -127,7 +135,7 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener { return; } - if (!mHasAddWindow) { //TODO + if (!mHasAddWindow) { mHasAddWindow = true; if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) { mWindowView = From d84857712ae673c0aea1c2319a00be9154e8358d Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 13 Dec 2020 16:27:19 +0800 Subject: [PATCH 6/8] =?UTF-8?q?fxi=20bug=20of=20=C3=A3.so?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/mogo/launcher/MogoApplication.java | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index a8443faa26..fe71a0c62b 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -75,7 +75,7 @@ public class MogoApplication extends AbsMogoApplication { MogoModulePaths.addBaseModule( new MogoModule( MogoServicePaths.PATH_WIDGETS, MogoServicePaths.PATH_WIDGETS ) ); if ( DebugConfig.isMapBased() ) { -// MogoModulePaths.addModule( new MogoModule( CallChatConstant.PROVIDER, CallChatConstant.MODULE_NAME ) ); + MogoModulePaths.addModule( new MogoModule( CallChatConstant.PROVIDER, CallChatConstant.MODULE_NAME ) ); } MogoModulePaths.addBaseModule( new MogoModule( ShareConstants.TAG, ShareConstants.MODEL_NAME ) ); diff --git a/gradle.properties b/gradle.properties index 253d2e1546..5d633dfba6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -138,7 +138,7 @@ HTTPDNS_NOOP_VERSION = 2.0.12 ######## 外部依赖引用 # 车聊聊 -CARCHATTING_VERSION=2.2.10 +CARCHATTING_VERSION=2.2.11 # 车聊聊接口 CARCHATTINGPROVIDER_VERSION=1.1.7 # loglib From 29cf9abc3c0abdbd22701f9219b439661926517e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Sun, 13 Dec 2020 18:18:34 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=B0=8F=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E7=9A=84=E5=AE=B9=E5=99=A8=E7=BB=98=E5=88=B6=EF=BC=8C?= =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E8=BF=98=E6=97=A0=E6=B3=95=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=B8=8A=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/module/common/view/RoundLayout.java | 90 ++++++++++++++++++ .../src/main/res/values/styles.xml | 4 + .../module/small/map/SmallMapService.java | 58 ++++++++++- .../mogo/module/small/map/SmallMapView.java | 11 ++- .../module/small/map/SmallVisionProvider.java | 11 ++- .../module_small_map_view_border.png | Bin 0 -> 28791 bytes .../main/res/layout/module_small_map_view.xml | 17 ++++ .../src/main/res/values-xhdpi/dimens.xml | 12 +++ 8 files changed, 192 insertions(+), 11 deletions(-) create mode 100644 modules/mogo-module-common/src/main/java/com/mogo/module/common/view/RoundLayout.java create mode 100644 modules/mogo-module-smp/src/main/res/drawable-xhdpi/module_small_map_view_border.png create mode 100644 modules/mogo-module-smp/src/main/res/layout/module_small_map_view.xml create mode 100644 modules/mogo-module-smp/src/main/res/values-xhdpi/dimens.xml diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/view/RoundLayout.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/view/RoundLayout.java new file mode 100644 index 0000000000..23418c8b9e --- /dev/null +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/view/RoundLayout.java @@ -0,0 +1,90 @@ +package com.mogo.module.common.view; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Path; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.widget.RelativeLayout; + +import com.mogo.module.common.R; +import com.mogo.skin.support.IMogoSkinCompatSupportable; +import com.mogo.skin.support.helper.MogoSkinCompatBackgroundHelperDelegate; + +/** + * author : donghongyu + * e-mail : 1358506549@qq.com + * date : 2020/3/25 11:39 AM + * desc : + * version: 1.0 + */ +public class RoundLayout extends RelativeLayout implements IMogoSkinCompatSupportable { + private float roundLayoutRadius = 14f; + private Path roundPath; + private RectF rectF; + private MogoSkinCompatBackgroundHelperDelegate mBackgroundTintHelper; + + public RoundLayout(Context context) { + this(context, null); + } + + public RoundLayout(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public RoundLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundLayout); + roundLayoutRadius = typedArray.getDimensionPixelSize(R.styleable.RoundLayout_roundLayoutRadius, (int) roundLayoutRadius); + typedArray.recycle(); + + init(); + + mBackgroundTintHelper = new MogoSkinCompatBackgroundHelperDelegate(this); + mBackgroundTintHelper.loadFromAttributes(attrs, defStyleAttr); + } + + + private void init() { + setWillNotDraw(false);//如果你继承的是ViewGroup,注意此行,否则draw方法是不会回调的; + roundPath = new Path(); + rectF = new RectF(); + } + + private void setRoundPath() { + //添加一个圆角矩形到path中, 如果要实现任意形状的View, 只需要手动添加path就行 + roundPath.addRoundRect(rectF, roundLayoutRadius, roundLayoutRadius, Path.Direction.CW); + } + + + public void setRoundLayoutRadius(float roundLayoutRadius) { + this.roundLayoutRadius = roundLayoutRadius; + setRoundPath(); + postInvalidate(); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + rectF.set(0f, 0f, getMeasuredWidth(), getMeasuredHeight()); + setRoundPath(); + } + + @Override + public void draw(Canvas canvas) { + if (roundLayoutRadius > 0f) { + canvas.clipPath(roundPath); + } + super.draw(canvas); + } + + @Override + public void applySkin() { + if (mBackgroundTintHelper != null) { + mBackgroundTintHelper.applySkin(); + } + } +} + diff --git a/modules/mogo-module-common/src/main/res/values/styles.xml b/modules/mogo-module-common/src/main/res/values/styles.xml index aab6f7f597..c694e342bb 100644 --- a/modules/mogo-module-common/src/main/res/values/styles.xml +++ b/modules/mogo-module-common/src/main/res/values/styles.xml @@ -27,4 +27,8 @@ @drawable/module_commons_heart_ratingbar_drawable + + + + \ No newline at end of file diff --git a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapService.java b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapService.java index 6739bb7c85..e4a4336d9c 100644 --- a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapService.java +++ b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapService.java @@ -4,7 +4,10 @@ import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; +import android.view.Gravity; +import android.view.WindowManager; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.mogo.module.common.entity.MogoSnapshotSetData; @@ -19,16 +22,22 @@ import com.mogo.utils.logger.Logger; public class SmallMapService extends Service { private static final String TAG = "MachineVisionMapService"; private IBinder mBinder; + private WindowManagerView mWindowManagerView; private SmallMapView mMapView; + @Override + public void onCreate() { + super.onCreate(); + Logger.d(TAG, "onCreate"); + addMachineVisionMapView(); + } @Nullable @Override public IBinder onBind(Intent intent) { - mBinder = new SmallMapServiceBinder(); - addMachineVisionMapView(); Logger.d(TAG, "onBind"); + mBinder = new SmallMapServiceBinder(); return mBinder; } @@ -41,17 +50,39 @@ public class SmallMapService extends Service { @Override public boolean onUnbind(Intent intent) { - + Logger.d(TAG, "onUnbind"); + if (mWindowManagerView != null && mWindowManagerView.isShowing()) { + mWindowManagerView.dismiss(); + } + mWindowManagerView = null; return true; } @Override public void onDestroy() { super.onDestroy(); - + Logger.d(TAG, "onDestroy"); + if (mWindowManagerView != null) { + mWindowManagerView.dismiss(); + } } private void addMachineVisionMapView() { + Logger.d(TAG, "addMachineVisionMapView"); + mWindowManagerView = new WindowManagerView.Builder(getApplicationContext()) + .contentView(R.layout.module_small_map_view) + .size( + WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.WRAP_CONTENT + ) + .position( + getResources().getDimensionPixelOffset( R.dimen.module_mvision_view_x ), + getResources().getDimensionPixelOffset( R.dimen.module_mvision_view_y ) + ) + .gravity(Gravity.TOP | Gravity.LEFT) + .showInWindowManager(); + mWindowManagerView.show(); + } @@ -61,19 +92,38 @@ public class SmallMapService extends Service { */ public class SmallMapServiceBinder extends IMachineVisionInterface.Stub { + @Override + public void linkToDeath(@NonNull DeathRecipient recipient, int flags) { + super.linkToDeath(recipient, flags); + Logger.d(TAG, "linkToDeath"); + + } + + @Override + public boolean unlinkToDeath(@NonNull DeathRecipient recipient, int flags) { + Logger.d(TAG, "unlinkToDeath"); + + return super.unlinkToDeath(recipient, flags); + } + @Override public void postData(MogoSnapshotSetData data) throws RemoteException { + Logger.d(TAG, "postData"); } @Override public void hideViewIfExist() throws RemoteException { + Logger.d(TAG, "hideViewIfExist"); } @Override public void showViewIfExist() throws RemoteException { + Logger.d(TAG, "showViewIfExist"); } + + } } diff --git a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapView.java b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapView.java index b9b74f4ac5..62e75cdc07 100644 --- a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapView.java +++ b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapView.java @@ -2,18 +2,19 @@ package com.mogo.module.small.map; import android.content.Context; import android.util.AttributeSet; -import android.util.Log; import androidx.annotation.Nullable; import com.mogo.map.MogoBaseMapView; +import com.mogo.utils.logger.Logger; /** * @author donghongyu * @date 12/10/20 1:35 PM */ public class SmallMapView extends MogoBaseMapView { - private final String TAG = "SmallMapView"; + + private static final String TAG = "SmallMapView"; public SmallMapView(Context context) { this(context, null); @@ -28,7 +29,7 @@ public class SmallMapView extends MogoBaseMapView { } @Override - protected void addMapView( Context context ) { - + protected void addMapView(Context context) { + Logger.d(TAG, "addMapView"); } -} +} \ No newline at end of file diff --git a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java index d6ee7e537b..3bbdee2b65 100644 --- a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java +++ b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java @@ -1,6 +1,7 @@ package com.mogo.module.small.map; import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; @@ -9,6 +10,7 @@ import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import com.alibaba.android.arouter.facade.annotation.Route; +import com.mogo.commons.AbsMogoApplication; import com.mogo.service.module.ModuleType; /** @@ -19,6 +21,8 @@ import com.mogo.service.module.ModuleType; public class SmallVisionProvider implements IMogoSmallMapProvider { private final String TAG = "SmallVisionProvider"; + private Intent mSmallMapServiceIntent; + @Override public Fragment createFragment(Context context, Bundle data) { return null; @@ -43,12 +47,15 @@ public class SmallVisionProvider implements IMogoSmallMapProvider { @Override public void init(Context context) { Log.d(TAG, "小地图模块初始化……"); - + mSmallMapServiceIntent = new Intent(context, SmallMapService.class); + context.startService(mSmallMapServiceIntent); } @Override public void onDestroy() { Log.d(TAG, "小地图模块销毁……"); - + if (mSmallMapServiceIntent != null) { + AbsMogoApplication.getApp().stopService(mSmallMapServiceIntent); + } } } diff --git a/modules/mogo-module-smp/src/main/res/drawable-xhdpi/module_small_map_view_border.png b/modules/mogo-module-smp/src/main/res/drawable-xhdpi/module_small_map_view_border.png new file mode 100644 index 0000000000000000000000000000000000000000..cc2c540c8b361ceae0006a59a50a8e04c6e8929e GIT binary patch literal 28791 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

typpO$v3UWwMOjh_EpU%)wTpCpIH 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 + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-smp/src/main/res/values-xhdpi/dimens.xml b/modules/mogo-module-smp/src/main/res/values-xhdpi/dimens.xml new file mode 100644 index 0000000000..9910274622 --- /dev/null +++ b/modules/mogo-module-smp/src/main/res/values-xhdpi/dimens.xml @@ -0,0 +1,12 @@ + + + 400px + 400px + 1490px + 650px + + 0px + 0px + 1920px + 1080px + \ No newline at end of file From 627c5b2d9e53159a7e8b2d8f89f6a30d3c4094d5 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 14 Dec 2020 14:21:53 +0800 Subject: [PATCH 8/8] update callchat --- app/proguard-rules.pro | 4 ++-- gradle.properties | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 3f451d8bed..83a859539a 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -35,8 +35,8 @@ -dontskipnonpubliclibraryclasses # 指定不去忽略包可见的库类的成员 -dontskipnonpubliclibraryclassmembers -#不进行优化,建议使用此选项, --dontoptimize +#不对 class 进行优化,默认是开启优化的。由于优化会进行类合并、内联等,使用热修复的应用,建议关闭优化 +#-dontoptimize # 不进行预校验,Android不需要,可加快混淆速度。 -dontpreverify diff --git a/gradle.properties b/gradle.properties index 5d633dfba6..ce7d2156cb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -138,9 +138,9 @@ HTTPDNS_NOOP_VERSION = 2.0.12 ######## 外部依赖引用 # 车聊聊 -CARCHATTING_VERSION=2.2.11 +CARCHATTING_VERSION=2.2.14 # 车聊聊接口 -CARCHATTINGPROVIDER_VERSION=1.1.7 +CARCHATTINGPROVIDER_VERSION=1.1.8 # loglib LOGLIB_VERSION = 1.0.4