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/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index 47e247daa2..97ecf26969 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/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/gradle.properties b/gradle.properties index 253d2e1546..ce7d2156cb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -138,9 +138,9 @@ HTTPDNS_NOOP_VERSION = 2.0.12 ######## 外部依赖引用 # 车聊聊 -CARCHATTING_VERSION=2.2.10 +CARCHATTING_VERSION=2.2.14 # 车聊聊接口 -CARCHATTINGPROVIDER_VERSION=1.1.7 +CARCHATTINGPROVIDER_VERSION=1.1.8 # loglib LOGLIB_VERSION = 1.0.4 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-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-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 0000000000..a1da551655 Binary files /dev/null and b/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/icon_live_load_error.png differ 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 0000000000..049d213148 Binary files /dev/null and b/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_camera_real_time_traffic.png differ 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..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 = @@ -184,7 +192,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 +454,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 +473,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-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..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 mMachineVisionMapViewManager; + + 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 0000000000..cc2c540c8b Binary files /dev/null and b/modules/mogo-module-smp/src/main/res/drawable-xhdpi/module_small_map_view_border.png differ diff --git a/modules/mogo-module-smp/src/main/res/layout/module_small_map_view.xml b/modules/mogo-module-smp/src/main/res/layout/module_small_map_view.xml new file mode 100644 index 0000000000..a787adfc60 --- /dev/null +++ b/modules/mogo-module-smp/src/main/res/layout/module_small_map_view.xml @@ -0,0 +1,17 @@ + + + + + + + \ 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 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 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/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(); } } 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/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 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