From 7da4d64630b0e63997e07ea2c041c4ffbc994516 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Mon, 14 Dec 2020 21:06:25 +0800 Subject: [PATCH 01/16] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E8=87=AA?= =?UTF-8?q?=E7=A0=94=E5=9C=B0=E5=9B=BE=E5=A1=AB=E5=85=85=E5=B0=8F=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=EF=BC=8C=E4=BD=86=E6=98=AF=E5=9C=86=E5=BD=A2=E5=A4=B1?= =?UTF-8?q?=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/codeStyles/Project.xml | 15 ++++- .../small/map/SmallMapDelegateFactory.java | 66 +++++++++++++++++++ .../module/small/map/SmallMapService.java | 4 +- .../mogo/module/small/map/SmallMapView.java | 51 ++++++++++++++ .../main/res/layout/module_small_map_view.xml | 27 ++++++-- .../src/main/res/values-xhdpi/dimens.xml | 19 +++--- 6 files changed, 163 insertions(+), 19 deletions(-) create mode 100644 modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapDelegateFactory.java diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 663459aa50..0d156937bb 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -3,9 +3,18 @@ + diff --git a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapDelegateFactory.java b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapDelegateFactory.java new file mode 100644 index 0000000000..962be7d52f --- /dev/null +++ b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallMapDelegateFactory.java @@ -0,0 +1,66 @@ +package com.mogo.module.small.map; + +import android.content.Context; + +import com.alibaba.android.arouter.launcher.ARouter; +import com.mogo.commons.debug.DebugConfig; +import com.mogo.map.IMogoMapApiBuilder; +import com.mogo.map.IMogoMapView; +import com.mogo.map.impl.automap.navi.AutoNaviClient; +import com.mogo.map.location.IMogoLocationClient; +import com.mogo.map.navi.IMogoAimless; +import com.mogo.map.navi.IMogoNavi; +import com.mogo.map.search.drive.IMogoRoadSearch; +import com.mogo.map.search.geo.IMogoGeoSearch; +import com.mogo.map.search.inputtips.IMogoInputtipsSearch; +import com.mogo.map.search.inputtips.query.MogoInputtipsQuery; +import com.mogo.map.search.poisearch.IMogoPoiSearch; +import com.mogo.map.search.poisearch.query.MogoPoiSearchQuery; +import com.mogo.map.search.traffic.IMogoTrafficSearch; +import com.mogo.map.uicontroller.IMogoMapUIController; +import com.mogo.utils.AppUtils; + +/** + * @author donghongyu + * @since 2020/12/14 + *

+ * 描述 + */ +class SmallMapDelegateFactory { + + private static final String TAG = "MogoMapDelegateFactory"; + + private static IMogoMapApiBuilder sApiBuilder; + + private static IMogoMapApiBuilder getApiBuilder() { + if ( sApiBuilder == null ) { + synchronized ( SmallMapDelegateFactory.class ) { + if ( sApiBuilder == null ) { + sApiBuilder = ARouter.getInstance().navigation( IMogoMapApiBuilder.class ); + } + } + } + return sApiBuilder; + } + + + public static IMogoAimless getAimless( Context context ) { + return getApiBuilder().getAimless( context ); + } + + public static void createMapViewInstance( Context context ) { + getApiBuilder().createMapView( context ); + } + + public static void destroy() { + getApiBuilder().destroy(); + } + + public static IMogoMapView getMapView(Context context ) { + return getApiBuilder().getMapView( context ); + } + + public static IMogoTrafficSearch getTrafficSearch() { + return getApiBuilder().getTrafficSearch(); + } +} 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 de26ba6776..bdf5c46fa9 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 @@ -79,8 +79,8 @@ public class SmallMapService extends Service { WindowManager.LayoutParams.WRAP_CONTENT ) .position( - getResources().getDimensionPixelOffset(R.dimen.module_mvision_view_x), - getResources().getDimensionPixelOffset(R.dimen.module_mvision_view_y) + getResources().getDimensionPixelOffset(R.dimen.module_small_map_view_x), + getResources().getDimensionPixelOffset(R.dimen.module_small_map_view_y) ) .gravity(Gravity.TOP | Gravity.LEFT) .showInWindowManager(); 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 62e75cdc07..139eb28c22 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 @@ -1,7 +1,11 @@ package com.mogo.module.small.map; import android.content.Context; +import android.os.Bundle; import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; import androidx.annotation.Nullable; @@ -31,5 +35,52 @@ public class SmallMapView extends MogoBaseMapView { @Override protected void addMapView(Context context) { Logger.d(TAG, "addMapView"); + mMapView = SmallMapDelegateFactory.getMapView(context); + if (mMapView != null) { + final View mapView = mMapView.getMapView(); + if (mapView != null) { + addView(mapView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + } else { + Logger.e(TAG, "create MapView instance failed."); + } + } else { + Logger.e(TAG, "create IMogoMapView instance failed."); + } } + + + @Override + public void onCreate( Bundle bundle ) { + super.onCreate( bundle ); + Logger.d( TAG, "onCreate" ); + } + + @Override + public void onResume() { + super.onResume(); + Logger.d( TAG, "onResume" ); + } + + @Override + public void onPause() { + super.onPause(); + Logger.d( TAG, "onPause" ); + } + + @Override + public void onDestroy() { + super.onDestroy(); + Logger.d( TAG, "onDestroy" ); + } + + @Override + public void onSaveInstanceState( Bundle outState ) { + super.onSaveInstanceState( outState ); + } + + @Override + public void onLowMemory() { + super.onLowMemory(); + } + } \ No newline at end of file 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 index e5d1dbfe79..346805d461 100644 --- 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 @@ -1,16 +1,31 @@ + + + + + + - \ 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 index 9910274622..41d38e65b4 100644 --- a/modules/mogo-module-smp/src/main/res/values-xhdpi/dimens.xml +++ b/modules/mogo-module-smp/src/main/res/values-xhdpi/dimens.xml @@ -1,12 +1,15 @@ - 400px - 400px - 1490px - 650px + 400px + 400px - 0px - 0px - 1920px - 1080px + 300px + 300px + 1490px + 650px + + 0px + 0px + 1920px + 1080px \ No newline at end of file From f26b8df8387ca03509047293966a9c264a4f04f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Tue, 15 Dec 2020 10:24:31 +0800 Subject: [PATCH 02/16] =?UTF-8?q?=E9=AB=98=E5=BE=B7=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E7=9A=84=E5=B0=8F=E5=9C=B0=E5=9B=BE=E6=97=A0=E6=B3=95=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/module/small/map/SmallVisionProvider.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) 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 0e3a5be274..a1d8f9c769 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 @@ -74,16 +74,19 @@ public class SmallVisionProvider implements IMogoSmallMapProvider, IMogoStatusCh public void showPanel() { Log.d(TAG, "小地图模块触发展示……"); - mSmallMapServiceIntent = new Intent(mContext, SmallMapService.class); - mContext.startService(mSmallMapServiceIntent); + if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) { + mSmallMapServiceIntent = new Intent(mContext, SmallMapService.class); + mContext.startService(mSmallMapServiceIntent); + } } @Override public void hidePanel() { Log.d(TAG, "小地图模块触发隐藏……"); - - if (mSmallMapServiceIntent != null) { - AbsMogoApplication.getApp().stopService(mSmallMapServiceIntent); + if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) { + if (mSmallMapServiceIntent != null) { + AbsMogoApplication.getApp().stopService(mSmallMapServiceIntent); + } } } From dd8584494f1e4d5d0021578d19a3d4ecc0a716ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Tue, 15 Dec 2020 11:51:07 +0800 Subject: [PATCH 03/16] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=BA=86=E6=A8=A1?= =?UTF-8?q?=E6=8B=9F=E7=8E=AF=E5=A2=83=E6=8E=A8=E9=80=81tts=20Bug=20http:/?= =?UTF-8?q?/h5service.zhidaohulian.com/v2x=5FremoteControl/#/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v2x/scenario/scene/animation/V2XAnimationWindow.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/animation/V2XAnimationWindow.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/animation/V2XAnimationWindow.java index c77d966c31..0a3fe0121c 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/animation/V2XAnimationWindow.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/animation/V2XAnimationWindow.java @@ -106,6 +106,9 @@ public class V2XAnimationWindow extends ConstraintLayout implements IV2XWindow Date: Tue, 15 Dec 2020 20:58:35 +0800 Subject: [PATCH 04/16] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BD=BF=E7=94=A8=20ht?= =?UTF-8?q?tp://blog.yeyanxiang.cn/Android/notes/android/surfaceview-corne?= =?UTF-8?q?r/=20=E8=A7=A3=E5=86=B3=E5=9C=B0=E5=9B=BE=E5=9C=86=E5=BD=A2?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BD=86=E6=98=AF=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 5 +-- .../mogo/module/small/map/SmallMapView.java | 5 +++ .../module/small/map/SmallVisionProvider.java | 7 +--- .../map/TextureVideoViewOutlineProvider.java | 35 ++++++++++++++++++ .../module_small_map_view_border.png | Bin 28791 -> 29440 bytes .../main/res/layout/module_small_map_view.xml | 2 - 6 files changed, 43 insertions(+), 11 deletions(-) create mode 100644 modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/TextureVideoViewOutlineProvider.java diff --git a/.idea/misc.xml b/.idea/misc.xml index f4d5deeca6..e082ea7475 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,10 +4,7 @@ - + - - \ No newline at end of file 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 139eb28c22..32b0bddc35 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 @@ -1,6 +1,7 @@ package com.mogo.module.small.map; import android.content.Context; +import android.os.Build; import android.os.Bundle; import android.util.AttributeSet; import android.view.View; @@ -8,6 +9,7 @@ import android.view.ViewGroup; import android.widget.FrameLayout; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import com.mogo.map.MogoBaseMapView; import com.mogo.utils.logger.Logger; @@ -32,6 +34,7 @@ public class SmallMapView extends MogoBaseMapView { super(context, attrs, defStyleAttr); } + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override protected void addMapView(Context context) { Logger.d(TAG, "addMapView"); @@ -39,6 +42,8 @@ public class SmallMapView extends MogoBaseMapView { if (mMapView != null) { final View mapView = mMapView.getMapView(); if (mapView != null) { + mapView.setOutlineProvider(new TextureVideoViewOutlineProvider(360)); + mapView.setClipToOutline(true); addView(mapView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); } else { Logger.e(TAG, "create MapView instance failed."); 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 a1d8f9c769..6c18a05d75 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 @@ -73,7 +73,6 @@ public class SmallVisionProvider implements IMogoSmallMapProvider, IMogoStatusCh @Override public void showPanel() { Log.d(TAG, "小地图模块触发展示……"); - if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) { mSmallMapServiceIntent = new Intent(mContext, SmallMapService.class); mContext.startService(mSmallMapServiceIntent); @@ -83,10 +82,8 @@ public class SmallVisionProvider implements IMogoSmallMapProvider, IMogoStatusCh @Override public void hidePanel() { Log.d(TAG, "小地图模块触发隐藏……"); - if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) { - if (mSmallMapServiceIntent != null) { - AbsMogoApplication.getApp().stopService(mSmallMapServiceIntent); - } + if (mSmallMapServiceIntent != null) { + AbsMogoApplication.getApp().stopService(mSmallMapServiceIntent); } } diff --git a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/TextureVideoViewOutlineProvider.java b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/TextureVideoViewOutlineProvider.java new file mode 100644 index 0000000000..45f82de108 --- /dev/null +++ b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/TextureVideoViewOutlineProvider.java @@ -0,0 +1,35 @@ +package com.mogo.module.small.map; + +import android.graphics.Outline; +import android.graphics.Rect; +import android.os.Build; +import android.util.Log; +import android.view.View; +import android.view.ViewOutlineProvider; + +import androidx.annotation.RequiresApi; + +/** + * @author donghongyu + * @date 12/15/20 8:47 PM + */ +@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) +public class TextureVideoViewOutlineProvider extends ViewOutlineProvider { + private float mRadius; + + public TextureVideoViewOutlineProvider(float radius) { + this.mRadius = radius; + } + + @Override + public void getOutline(View view, Outline outline) { + Log.w("OutlineProvider", "======getOutline======"); + Rect rect = new Rect(); + view.getGlobalVisibleRect(rect); + int leftMargin = 0; + int topMargin = 0; + Rect selfRect = new Rect(leftMargin, topMargin, + rect.right - rect.left - leftMargin, rect.bottom - rect.top - topMargin); + outline.setRoundRect(selfRect, mRadius); + } +} \ No newline at end of file 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 index cc2c540c8b361ceae0006a59a50a8e04c6e8929e..1c4bf333ca92ee7947e1df5379062e5676b54e9c 100644 GIT binary patch literal 29440 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 literal 28791 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

typpO$v3UWwMOjh_EpU%)wTpCpIH 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 Date: Wed, 16 Dec 2020 15:09:55 +0800 Subject: [PATCH 05/16] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=B7=A6=E4=B8=8A?= =?UTF-8?q?=E8=A7=92=E7=BA=A2=E7=BB=BF=E7=81=AF=E5=B1=95=E7=A4=BA=EF=BC=8C?= =?UTF-8?q?=E6=9A=82=E6=97=A0=E8=BD=A6=E9=81=93=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constants/TrafficLightConst.java | 18 ++++ .../extensions/navi/VrModeNavInfoView.java | 15 +++ .../extensions/utils/AdasNoticeHelper.java | 96 +++++-------------- .../view/VerticalTrafficLightView.java | 14 +-- .../main/res/layout/include_navi_in_vr.xml | 2 +- .../com/zhidao/mogo/module/obu/MockUtil.kt | 2 +- .../obu/obu/bean/MogoObuTrafficLightInfo.kt | 71 ++++++++++++-- .../com/mogo/module/v2x/V2XObuManager.java | 5 + 8 files changed, 132 insertions(+), 91 deletions(-) create mode 100644 modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/TrafficLightConst.java diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/TrafficLightConst.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/TrafficLightConst.java new file mode 100644 index 0000000000..f543e4b242 --- /dev/null +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/TrafficLightConst.java @@ -0,0 +1,18 @@ +package com.mogo.module.common.constants; + +/** + * 用于内部标识红绿灯颜色 + * + * @author tongchenfei + */ +public class TrafficLightConst { + public static final int TRAFFIC_LIGHT_COLOR_GRAY = 0; + public static final int TRAFFIC_LIGHT_COLOR_RED = 1; + public static final int TRAFFIC_LIGHT_COLOR_YELLOW = 2; + public static final int TRAFFIC_LIGHT_COLOR_GREEN = 3; + + public static final int TRAFFIC_LIGHT_DIRECTION_TURN_AROUND = 0; + public static final int TRAFFIC_LIGHT_DIRECTION_TURN_LEFT = 1; + public static final int TRAFFIC_LIGHT_DIRECTION_STRAIGHT = 2; + public static final int TRAFFIC_LIGHT_DIRECTION_TURN_RIGHT = 3; +} diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/navi/VrModeNavInfoView.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/navi/VrModeNavInfoView.java index f736c8b38d..43b17f467a 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/navi/VrModeNavInfoView.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/navi/VrModeNavInfoView.java @@ -88,6 +88,9 @@ public class VrModeNavInfoView extends BaseNaviInfoView implements Handler.Callb } } + private int[] lightArray = new int[4]; + private String[] surplusTimeArray = new String[4]; + /** * 刷新红绿灯显示状态 * @@ -95,10 +98,22 @@ public class VrModeNavInfoView extends BaseNaviInfoView implements Handler.Callb * @param surplusTime 固定数组长度为4的剩余时长数组,从0-3依次代表 掉头,左转,执行,右转 */ public void refreshTrafficLightStatus(int[] laneLight, String[] surplusTime) { + lightArray = laneLight; + surplusTimeArray = surplusTime; + turnAroundLight.setTrafficLightStatus(laneLight[0], surplusTime[0]); turnLeftLight.setTrafficLightStatus(laneLight[1], surplusTime[1]); straightLight.setTrafficLightStatus(laneLight[2], surplusTime[2]); turnRightLight.setTrafficLightStatus(laneLight[3], surplusTime[3]); + // todo 再根据当前所在车道,置灰不需关注的灯 + + } + + /** + * 根据所在车道,控制红绿灯展示 + */ + public void refreshLaneStatus(){ + } @Override diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/AdasNoticeHelper.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/AdasNoticeHelper.java index 0eb32beb06..b27e21bfd1 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/AdasNoticeHelper.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/AdasNoticeHelper.java @@ -21,6 +21,7 @@ import com.mogo.service.connection.IMogoOnWebSocketMessageListener; import com.mogo.service.connection.WebSocketMsgType; import com.mogo.utils.logger.Logger; +import org.json.JSONArray; import org.json.JSONObject; /** @@ -33,9 +34,9 @@ public class AdasNoticeHelper implements IMogoAdasWarnMessageCallback, IMogoLoca private static final String TAG = "AdasNoticeHelper"; private static final int MSG_HIDE_TRAFFIC_LIGHT_BY_OBU = 1001; - private static final int MSG_HIDE_TRAFFIC_LIGHT_BY_CLOUD = 1002; +// private static final int MSG_HIDE_TRAFFIC_LIGHT_BY_CLOUD = 1002; 先去掉云端下发红绿灯信息 private static final int MSG_HIDE_LIMIT_SPEED = 1003; - private static final int MSG_REFRESH_CAR_STRATEGY = 1004; +// private static final int MSG_REFRESH_CAR_STRATEGY = 1004; private static final long HIDE_TRAFFIC_LIGHT_DELAY = 2_000L; private static final long HIDE_LIMIT_SPEED_DELAY = 10_000L; @@ -53,23 +54,14 @@ public class AdasNoticeHelper implements IMogoAdasWarnMessageCallback, IMogoLoca private VrModeNavInfoView vrModeNavInfoView; - private Handler handler = new Handler(this); - - private boolean isObuLightData = false; - - - private boolean lightCenter = true; + private final Handler handler = new Handler(this); public void init(Context context) { this.context = context; - if (!lightCenter) { - } Logger.d(TAG, "init===="); } public void initView(VrModeNavInfoView vrModeNavInfoView) { - if (lightCenter) { - } this.vrModeNavInfoView = vrModeNavInfoView; } @@ -84,10 +76,9 @@ public class AdasNoticeHelper implements IMogoAdasWarnMessageCallback, IMogoLoca context.registerReceiver(adasReceiver, filter); MogoApisHandler.getInstance().getApis().getAdasControllerApi().addAdasWarnMessageCallback(this); MogoApisHandler.getInstance().getApis().getRegisterCenterApi().registerMogoLocationListener(TAG, this); - MogoApisHandler.getInstance().getApis().getWebSocketManagerApi(context).registerOnWebSocketMessageListener(this); - if (!lightCenter) { - handler.sendEmptyMessageDelayed(MSG_REFRESH_CAR_STRATEGY, STRATEGY_DELAY); - } + // 先不监听服务端下发消息 +// MogoApisHandler.getInstance().getApis().getWebSocketManagerApi(context).registerOnWebSocketMessageListener(this); + } } @@ -96,11 +87,9 @@ public class AdasNoticeHelper implements IMogoAdasWarnMessageCallback, IMogoLoca if (isVrMode) { isVrMode = false; MogoApisHandler.getInstance().getApis().getAdasControllerApi().showADAS(); - handler.removeMessages(MSG_REFRESH_CAR_STRATEGY); MogoApisHandler.getInstance().getApis().getAdasControllerApi().removeAdasWarnMessageCallback(this); MogoApisHandler.getInstance().getApis().getRegisterCenterApi().unregisterMogoLocationListener(TAG); - MogoApisHandler.getInstance().getApis().getWebSocketManagerApi(context).unregisterOnWebSocketMessageListener(this); - +// MogoApisHandler.getInstance().getApis().getWebSocketManagerApi(context).unregisterOnWebSocketMessageListener(this); context.unregisterReceiver(adasReceiver); } } @@ -129,44 +118,15 @@ public class AdasNoticeHelper implements IMogoAdasWarnMessageCallback, IMogoLoca return; } currentSpeed = (int) (location.getSpeed() * 3.6F); - if (lightCenter) { - } } @Override public boolean handleMessage(Message msg) { switch (msg.what) { - case MSG_REFRESH_CAR_STRATEGY: - // todo 暂时不采用此种渲染方式 - // 自车速度 - // todo 设置字体颜色、背景颜色、leftDrawable - switch (lightStatus) { - case "Y": - // 黄灯 - break; - case "R": - // 红灯 - break; - default: - // 默认绿灯 - break; - } - - if (isVrMode) { - handler.sendEmptyMessageDelayed(MSG_REFRESH_CAR_STRATEGY, STRATEGY_DELAY); - } - return true; case MSG_HIDE_LIMIT_SPEED: limitSpeed = -1; return true; - case MSG_HIDE_TRAFFIC_LIGHT_BY_CLOUD: - if (!isObuLightData && !handler.hasMessages(MSG_HIDE_TRAFFIC_LIGHT_BY_OBU)) { - } - return true; case MSG_HIDE_TRAFFIC_LIGHT_BY_OBU: - isObuLightData = false; - if (!handler.hasMessages(MSG_HIDE_TRAFFIC_LIGHT_BY_CLOUD)) { - } return true; default: return false; @@ -209,7 +169,17 @@ public class AdasNoticeHelper implements IMogoAdasWarnMessageCallback, IMogoLoca String lightStatus = jsonObject.optString("lightStatus"); String surplusTime = jsonObject.optString("surplusTime"); if (!lightStatus.isEmpty() && !surplusTime.isEmpty()) { - handleObuTrafficLightInfo(lightStatus, surplusTime); +// String strArray = jsonObject.getString("lightArray"); +// Logger.d(TAG, "strArray: " + strArray); + JSONArray lightJsonArray = jsonObject.getJSONArray("lightArray"); + JSONArray timeJsonArray = jsonObject.getJSONArray("surplusTimeArray"); + int[] lightArray = new int[4]; + String[] surplusTimeArray = new String[4]; + for (int i = 0; i < 4; i++) { + lightArray[i] = lightJsonArray.getInt(i); + surplusTimeArray[i] = timeJsonArray.getString(i); + } + handleObuTrafficLightInfo(lightArray, surplusTimeArray); } else { Logger.d(TAG, "红绿灯必要信息都为空,不做展示"); } @@ -224,22 +194,8 @@ public class AdasNoticeHelper implements IMogoAdasWarnMessageCallback, IMogoLoca } } - private void handleObuTrafficLightInfo(String lightStatus, String surplusTime) { - isObuLightData = true; - } - - private void handleCloudTrafficLight(CloudRoadData roadData) { - if (isObuLightData) { - handler.removeMessages(MSG_HIDE_TRAFFIC_LIGHT_BY_CLOUD); - return; - } - } - - private void drawTrafficLight(String lightStatus, String surplusTime) { - this.lightStatus = lightStatus; - this.surplusTime = surplusTime; - if (lightCenter) { - } + private void handleObuTrafficLightInfo(int[] lightArray,String[] surplusTimeArray) { + vrModeNavInfoView.refreshTrafficLightStatus(lightArray, surplusTimeArray); } @Override @@ -254,14 +210,6 @@ public class AdasNoticeHelper implements IMogoAdasWarnMessageCallback, IMogoLoca @Override public void onMsgReceived(MogoSnapshotSetData obj) { - Logger.d(TAG, "收到大而全数据: " + obj); - CloudRoadData roadData = obj.getTrafficLight(); - if (roadData != null) { - Logger.d(TAG, "收到红绿灯数据"); - handleCloudTrafficLight(roadData); - } else { - handler.sendEmptyMessage(MSG_HIDE_TRAFFIC_LIGHT_BY_CLOUD); - } - } + } } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/view/VerticalTrafficLightView.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/view/VerticalTrafficLightView.java index e16882fbcb..aa20aae227 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/view/VerticalTrafficLightView.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/view/VerticalTrafficLightView.java @@ -13,12 +13,18 @@ import androidx.annotation.IntDef; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.Group; +import com.mogo.module.common.constants.TrafficLightConst; import com.mogo.module.extensions.R; import com.mogo.utils.logger.Logger; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import static com.mogo.module.common.constants.TrafficLightConst.TRAFFIC_LIGHT_COLOR_GRAY; +import static com.mogo.module.common.constants.TrafficLightConst.TRAFFIC_LIGHT_COLOR_GREEN; +import static com.mogo.module.common.constants.TrafficLightConst.TRAFFIC_LIGHT_COLOR_RED; +import static com.mogo.module.common.constants.TrafficLightConst.TRAFFIC_LIGHT_COLOR_YELLOW; + /** * vr模式下的纵向显示的红绿灯封装 * @@ -26,10 +32,6 @@ import java.lang.annotation.RetentionPolicy; */ public class VerticalTrafficLightView extends ConstraintLayout { private static final String TAG = "VerticalTrafficLightView"; - public static final int TRAFFIC_LIGHT_COLOR_GRAY = 0; - public static final int TRAFFIC_LIGHT_COLOR_RED = 1; - public static final int TRAFFIC_LIGHT_COLOR_YELLOW = 2; - public static final int TRAFFIC_LIGHT_COLOR_GREEN = 3; private ImageView ivTrafficLight, ivNoLeftTime; private TextView tvLeftTime, tvLeftTimeUnit; @@ -90,7 +92,7 @@ public class VerticalTrafficLightView extends ConstraintLayout { /** * 设置红绿灯的颜色,根据颜色来展示不同的效果 * - * @param color 红绿灯颜色{@link #TRAFFIC_LIGHT_COLOR_GRAY},{@link #TRAFFIC_LIGHT_COLOR_RED}等四个颜色 + * @param color 红绿灯颜色{@link TrafficLightConst#TRAFFIC_LIGHT_COLOR_GRAY},{@link TrafficLightConst#TRAFFIC_LIGHT_COLOR_RED}等四个颜色 */ private void setTrafficLightColor(@TrafficLightColor int color) { if (iconRes == null) { @@ -123,7 +125,7 @@ public class VerticalTrafficLightView extends ConstraintLayout { /** * 设置红绿灯状态,需设置颜色及时长 * - * @param color 红绿灯颜色,使用{@link #TRAFFIC_LIGHT_COLOR_RED}等四个值 + * @param color 红绿灯颜色,使用{@link TrafficLightConst#TRAFFIC_LIGHT_COLOR_RED}等四个值 * @param leftTime 剩余时长,null或者empty表示没有时长数据 */ public void setTrafficLightStatus(@TrafficLightColor int color, String leftTime) { diff --git a/modules/mogo-module-extensions/src/main/res/layout/include_navi_in_vr.xml b/modules/mogo-module-extensions/src/main/res/layout/include_navi_in_vr.xml index e6efac5899..1a2d4c4241 100644 --- a/modules/mogo-module-extensions/src/main/res/layout/include_navi_in_vr.xml +++ b/modules/mogo-module-extensions/src/main/res/layout/include_navi_in_vr.xml @@ -39,7 +39,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/module_ext_navi_in_vr_speed_margin_start" - android:text="78" + android:text="--" android:textColor="#fff" android:textSize="@dimen/module_ext_navi_in_vr_speed_text_size" app:layout_constraintBottom_toTopOf="@id/module_ext_id_navi_in_vr_traffic_bg" diff --git a/modules/mogo-module-obu/src/main/java/com/zhidao/mogo/module/obu/MockUtil.kt b/modules/mogo-module-obu/src/main/java/com/zhidao/mogo/module/obu/MockUtil.kt index 68e61eb3c7..b67be3a6fe 100644 --- a/modules/mogo-module-obu/src/main/java/com/zhidao/mogo/module/obu/MockUtil.kt +++ b/modules/mogo-module-obu/src/main/java/com/zhidao/mogo/module/obu/MockUtil.kt @@ -45,7 +45,7 @@ class MockUtil:Handler.Callback { if (msg.what == 1001) { Logger.d(TAG,"准备添加调试view") val api = ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS).navigation(context) as IMogoServiceApis - api.windowManagerApi.addView(view, 1000, 600, false) + api.windowManagerApi.addView(view, 500, 300, false) } return false } diff --git a/modules/mogo-module-obu/src/main/java/com/zhidao/mogo/module/obu/obu/bean/MogoObuTrafficLightInfo.kt b/modules/mogo-module-obu/src/main/java/com/zhidao/mogo/module/obu/obu/bean/MogoObuTrafficLightInfo.kt index 33437fedd1..0930bbedc2 100644 --- a/modules/mogo-module-obu/src/main/java/com/zhidao/mogo/module/obu/obu/bean/MogoObuTrafficLightInfo.kt +++ b/modules/mogo-module-obu/src/main/java/com/zhidao/mogo/module/obu/obu/bean/MogoObuTrafficLightInfo.kt @@ -1,5 +1,6 @@ package com.zhidao.mogo.module.obu.obu.bean +import com.mogo.module.common.constants.TrafficLightConst.* import com.zhidao.smartv2x.model.obu.TrafficLightInfo /** @@ -10,20 +11,72 @@ import com.zhidao.smartv2x.model.obu.TrafficLightInfo * * @author tongchenfei */ -class MogoObuTrafficLightInfo(){ - var id:String? =null - var lightStatus:String? =null - var surplusTime:String? =null - var lightPriority:String? =null - override fun toString(): String { - return "MogoObuTrafficLightInfo(id=$id, lightStatus=$lightStatus, surplusTime=$surplusTime, lightPriority=$lightPriority)" - } +class MogoObuTrafficLightInfo() { + var id: String? = null + var lightStatus: String? = null + set(value) { + field = value + resetLightArray(value) + } + var surplusTime: String? = null + set(value) { + field = value + resetSurplusTimeArray(value) + } + var lightPriority: String? = null - constructor(info:TrafficLightInfo):this(){ + var lightArray: IntArray = IntArray(4) { 0 } + var surplusTimeArray: Array = Array(4) { "" } + + constructor(info: TrafficLightInfo) : this() { this.id = info.id this.lightStatus = info.lightStatus this.surplusTime = info.surplusTime this.lightPriority = info.lightPriority + + resetLightArray(lightStatus) + resetSurplusTimeArray(surplusTime) + } + + override fun toString(): String { + return "MogoObuTrafficLightInfo(id=$id, lightStatus=$lightStatus, surplusTime=$surplusTime, lightPriority=$lightPriority, lightArray=${lightArray.contentToString()}, surplusTimeArray=${surplusTimeArray.contentToString()})" + } + + private fun resetLightArray(lightStatus: String?) { + when (lightStatus) { + "R" -> { + lightArray[TRAFFIC_LIGHT_DIRECTION_TURN_AROUND] = TRAFFIC_LIGHT_COLOR_GREEN + lightArray[TRAFFIC_LIGHT_DIRECTION_TURN_LEFT] = TRAFFIC_LIGHT_COLOR_RED + lightArray[TRAFFIC_LIGHT_DIRECTION_STRAIGHT] = TRAFFIC_LIGHT_COLOR_RED + lightArray[TRAFFIC_LIGHT_DIRECTION_TURN_RIGHT] = TRAFFIC_LIGHT_COLOR_GREEN + + } + "Y" -> { + lightArray[TRAFFIC_LIGHT_DIRECTION_TURN_AROUND] = TRAFFIC_LIGHT_COLOR_GREEN + lightArray[TRAFFIC_LIGHT_DIRECTION_TURN_LEFT] = TRAFFIC_LIGHT_COLOR_YELLOW + lightArray[TRAFFIC_LIGHT_DIRECTION_STRAIGHT] = TRAFFIC_LIGHT_COLOR_YELLOW + lightArray[TRAFFIC_LIGHT_DIRECTION_TURN_RIGHT] = TRAFFIC_LIGHT_COLOR_GREEN + } + "G" -> { + lightArray[TRAFFIC_LIGHT_DIRECTION_TURN_AROUND] = TRAFFIC_LIGHT_COLOR_GREEN + lightArray[TRAFFIC_LIGHT_DIRECTION_TURN_LEFT] = TRAFFIC_LIGHT_COLOR_GREEN + lightArray[TRAFFIC_LIGHT_DIRECTION_STRAIGHT] = TRAFFIC_LIGHT_COLOR_GREEN + lightArray[TRAFFIC_LIGHT_DIRECTION_TURN_RIGHT] = TRAFFIC_LIGHT_COLOR_GREEN + } + else -> { + lightArray[TRAFFIC_LIGHT_DIRECTION_TURN_AROUND] = TRAFFIC_LIGHT_COLOR_GRAY + lightArray[TRAFFIC_LIGHT_DIRECTION_TURN_LEFT] = TRAFFIC_LIGHT_COLOR_GRAY + lightArray[TRAFFIC_LIGHT_DIRECTION_STRAIGHT] = TRAFFIC_LIGHT_COLOR_GRAY + lightArray[TRAFFIC_LIGHT_DIRECTION_TURN_RIGHT] = TRAFFIC_LIGHT_COLOR_GRAY + } + } + } + + private fun resetSurplusTimeArray(surplusTime: String?) { + surplusTimeArray[TRAFFIC_LIGHT_DIRECTION_TURN_AROUND] = "" + surplusTimeArray[TRAFFIC_LIGHT_DIRECTION_TURN_LEFT] = surplusTime ?: "" + surplusTimeArray[TRAFFIC_LIGHT_DIRECTION_STRAIGHT] = surplusTime ?: "" + surplusTimeArray[TRAFFIC_LIGHT_DIRECTION_TURN_RIGHT] = "" } } \ No newline at end of file diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XObuManager.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XObuManager.java index fb4766fe4f..72141cfbdf 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XObuManager.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XObuManager.java @@ -30,6 +30,7 @@ import com.zhidao.mogo.module.obu.obu.bean.MogoObuEventInfo; import com.zhidao.mogo.module.obu.obu.bean.MogoObuLocationInfo; import com.zhidao.mogo.module.obu.obu.bean.MogoObuTrafficLightInfo; +import org.json.JSONArray; import org.json.JSONObject; import java.util.Map; @@ -142,6 +143,10 @@ public class V2XObuManager implements IObuCallback, Handler.Callback { } else { json.put("surplusTime", trafficLightInfo.getSurplusTime()); } + JSONArray lightJsonArray = new JSONArray(trafficLightInfo.getLightArray()); + JSONArray surplusTimeJsonArray = new JSONArray(trafficLightInfo.getSurplusTimeArray()); + json.put("lightArray", lightJsonArray); + json.put("surplusTimeArray", surplusTimeJsonArray); } String data = json.toString(); Logger.d(MODULE_NAME, "发送红绿灯广播: " + data); From 5817c62a2e09304dd0f911561f045d1d0b40c55e Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Wed, 16 Dec 2020 15:57:10 +0800 Subject: [PATCH 06/16] opt --- .../com/mogo/module/media/utils/Utils.java | 32 +++ .../media/widget/CircleNumberProgress.java | 209 ++++++++++++++++++ .../module/media/window/MediaWindow2.java | 17 +- ...le_media_music_window_alert_layout_new.xml | 19 +- .../src/main/res/values-xhdpi/dimens.xml | 2 +- .../src/main/res/values/dimens.xml | 2 +- 6 files changed, 269 insertions(+), 12 deletions(-) create mode 100644 modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/CircleNumberProgress.java diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/Utils.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/Utils.java index fdf9aaf338..6918d3fa10 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/Utils.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/Utils.java @@ -26,6 +26,38 @@ import java.util.List; public class Utils { + /** + * 将px值转换为dip或dp值,保证尺寸大小不变 + */ + public static int px2dip(Context context, float pxValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (pxValue / scale + 0.5f); + } + + /** + * 将dip或dp值转换为px值,保证尺寸大小不变 + */ + public static int dip2px(Context context, float dipValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dipValue * scale + 0.5f); + } + + /** + * 将px值转换为sp值,保证文字大小不变 + */ + public static int px2sp(Context context, float pxValue) { + final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; + return (int) (pxValue / fontScale + 0.5f); + } + + /** + * 将sp值转换为px值,保证文字大小不变 + */ + public static int sp2px(Context context, float spValue) { + final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; + return (int) (spValue * fontScale + 0.5f); + } + /** * 验证手机格式 */ diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/CircleNumberProgress.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/CircleNumberProgress.java new file mode 100644 index 0000000000..1334310de3 --- /dev/null +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/CircleNumberProgress.java @@ -0,0 +1,209 @@ +package com.mogo.module.media.widget; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Rect; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.view.View; + +import com.mogo.module.media.utils.Utils; + +/** + * @author lixiaopeng + * @description + * @since 2020/12/15 + */ +public class CircleNumberProgress extends View { + /** 进度条画笔的宽度(dp) */ + private int paintProgressWidth = 4; + + /** 文字百分比的字体大小(sp) */ + private int paintTextSize = 20; + + /** 未完成进度条的颜色 */ + private int paintUndoneColor = 0xffaaaaaa; + + /** 已完成进度条的颜色 */ + private int paintDoneColor = 0xff67aae4; + + /** 百分比文字的颜色 */ + private int paintTextColor = 0xffff0077; + + /** 设置进度条画笔的宽度(px) */ + private int paintProgressWidthPx; + + /** 文字画笔的尺寸(px) */ + private int paintTextSizePx; + /** Context上下文环境 */ + private Context context; + + /** 调用者设置的进程 0 - 100 */ + private int progress; + + /** 画未完成进度圆弧的画笔 */ + private Paint paintUndone = new Paint(); + + /** 画已经完成进度条的画笔 */ + private Paint paintDone = new Paint(); + + /** 画文字的画笔 */ +// private Paint paintText = new Paint(); + + /** 包围进度条圆弧的矩形 */ + private RectF rectF = new RectF(); + + /** 包围文字所在路径圆弧的矩形,比上一个矩形略小 */ + private RectF rectF2 = new RectF(); + + /** 进度文字所在的路径 */ + private Path path = new Path(); + + /** 文字所在路径圆弧的半径 */ + private int radiusText; + + /** 是否进行过了测量 */ + private boolean isMeasured = false; + + public CircleNumberProgress(Context context, AttributeSet attrs) { + super(context, attrs); + this.context = context; + // 构造器中初始化数据 + initData(); + } + + /** 初始化数据 */ + private void initData() { + + // 设置进度条画笔的宽度 + paintProgressWidthPx = Utils.dip2px(context, paintProgressWidth); + + // 设置文字画笔的尺寸(px) + paintTextSizePx = Utils.sp2px(context, paintTextSize); + + // 未完成进度圆环的画笔的属性 + paintUndone.setColor(paintUndoneColor); + paintUndone.setStrokeWidth(paintProgressWidthPx); + paintUndone.setAntiAlias(true); + paintUndone.setStyle(Paint.Style.STROKE); + + // 已经完成进度条的画笔的属性 + paintDone.setColor(paintDoneColor); + paintDone.setStrokeWidth(paintProgressWidthPx); + paintDone.setAntiAlias(true); + paintDone.setStyle(Paint.Style.STROKE); + + // 文字的画笔的属性 +// paintText.setColor(paintTextColor); +// paintText.setTextSize(paintTextSizePx); +// paintText.setAntiAlias(true); +// paintText.setStyle(Paint.Style.STROKE); +// paintText.setTypeface(Typeface.DEFAULT_BOLD); + + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + if (!isMeasured) { + getWidthAndHeight(); + isMeasured = true; + } + } + + /** 得到视图等的高度宽度尺寸数据 */ + private void getWidthAndHeight() { + // 得到自定义视图的高度 + int viewHeight; + + // 得到自定义视图的宽度 + int viewWidth; + + // 得到自定义视图的X轴中心点 + int viewCenterX; + + // 得到自定义视图的Y轴中心点 + int viewCenterY; + + viewHeight = getMeasuredHeight(); + viewWidth = getMeasuredWidth(); + viewCenterX = viewWidth / 2; + viewCenterY = viewHeight / 2; + + // 取本View长宽较小者的一半为整个圆环部分(包括圆环和文字)最外侧的半径 + int minLenth = viewHeight > viewWidth ? viewWidth / 2 : viewHeight / 2; + + // 比较文字高度和圆环宽度,如果文字高度较大,那么文字将突破圆环,否则,圆环会把文字包裹在内部 + Rect rect = new Rect(); +// paintText.getTextBounds("100%", 0, "100%".length(), rect); + int textHeight = rect.height(); + + // 得到圆环的中间半径(外径和内径平均值) + int radiusArc = minLenth - (paintProgressWidthPx > textHeight ? paintProgressWidthPx / 2 : textHeight / 2); + rectF.left = viewCenterX - radiusArc; + rectF.top = viewCenterY - radiusArc; + rectF.right = viewCenterX + radiusArc; + rectF.bottom = viewCenterY + radiusArc; + + // 文字所依赖路径圆弧的半径 + radiusText = radiusArc - textHeight / 2; + rectF2.left = viewCenterX - radiusText; + rectF2.top = viewCenterY - radiusText; + rectF2.right = viewCenterX + radiusText; + rectF2.bottom = viewCenterY + radiusText; + + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + // 画未完成进度的圆环 + canvas.drawArc(rectF, 0, 360, false, paintUndone); + + // 画已经完成进度的圆弧 从-90度开始,即从圆环顶部开始 + canvas.drawArc(rectF, -90, progress / 100.0f * 360, false, paintDone); + + // 为文字所在路径添加一段圆弧轨迹,进度为0%-9%时应该最短,进度为10%-99%时应该边长,进度为100%时应该最长 + // 这样才能保证文字和圆弧的进度一致,不会出现超前或者滞后的情况 + + // 要画的文字 + String text = progress + "%"; + + // 存储字符所有字符所占宽度的数组 + float[] widths = new float[text.length()]; + + // 得到所有字符所占的宽度 +// paintText.getTextWidths(text, 0, text.length(), widths); + + // 所有字符所占宽度之和 + float textWidth = 0; + for (float f : widths) { + textWidth += f; + } + + // 根据长度得到路径对应的扫过的角度 + // width = sweepAngle * 2 * π * R / 360 ; sweepAngle = width * 360 / 2 / + // π / R + float sweepAngle = (float) (textWidth * 360 / 2 / Math.PI / radiusText); + + // 添加路径 + path.addArc(rectF2, progress * 3.6f - 90.0f - sweepAngle / 2.0f, sweepAngle); + + // 绘制进度的文字 +// canvas.drawTextOnPath(text, path, 0, 0, paintText); + + // 重置路径 + path.reset(); + } + + /** + * @param progress 外部传进来的当前进度,强制重绘 + */ + public void setProgress(int progress) { + this.progress = progress; + invalidate(); + } +} 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 1959a9947e..d30717caea 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 @@ -26,6 +26,7 @@ import com.mogo.module.media.presenter.PresenterFactory; import com.mogo.module.media.utils.Utils; import com.mogo.module.media.view.IMusicView; import com.mogo.module.media.widget.AnimCircleImageView; +import com.mogo.module.media.widget.CircleNumberProgress; import com.mogo.module.media.widget.PercentageRingView; import com.mogo.service.statusmanager.IMogoStatusChangedListener; import com.mogo.service.statusmanager.StatusDescriptor; @@ -66,7 +67,7 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener { private boolean mIsCallChatWindowVisible; private ICallProviderResponse mCallProviderResponse; - private PercentageRingView mPercentageRingView; + private CircleNumberProgress mPercentageRingView; private ImageView mPauseImage; private AnimCircleImageView mAnimCircleImageView; @@ -312,7 +313,14 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener { GlideApp.with(mContext).asBitmap().apply(options).load(mMediaInfoData.getMediaImg()).into(new SkinAbleBitmapTarget(mAnimCircleImageView, options)); // GlideApp.with(mContext).applyDefaultRequestOptions(options).load(mMediaInfoData.getMediaImg()).into(new SkinAbleBitmapTarget(mCircleImg, options)); }else{ - mAnimCircleImageView.setImageResource(R.drawable.module_media_default_music_img); + Logger.e(TAG, "mMediaInfoData == null "); +// mAnimCircleImageView.setImageResource(R.drawable.module_media_default_music_img); + int size = + mContext.getResources().getDimensionPixelSize(R.dimen.module_media_pop_window_anim_img_size_new); + com.bumptech.glide.request.RequestOptions options = + new com.bumptech.glide.request.RequestOptions() + .placeholder(R.drawable.module_media_default_music_img).error(R.drawable.module_media_default_music_img).override(size, size); + GlideApp.with(mContext).asBitmap().apply(options).load("").into(new SkinAbleBitmapTarget(mAnimCircleImageView, options)); } } @@ -344,7 +352,6 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener { if(mMediaInfoData!=null&&mMediaInfoData.getMediaImg()!=null&&!mMediaInfoData.getMediaImg().isEmpty()) { int size = mContext.getResources().getDimensionPixelSize(R.dimen.module_media_pop_window_anim_img_size); - Logger.d(TAG, "overload: " + size); com.bumptech.glide.request.RequestOptions options = new com.bumptech.glide.request.RequestOptions() .placeholder(R.drawable.module_media_default_music_img).error(R.drawable.module_media_default_music_img).override(size, size); @@ -458,8 +465,8 @@ 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); - mPercentageRingView.setTargetPercent(progress); + Log.d(TAG, "progress vr = " + progress); + mPercentageRingView.setProgress(progress); } } catch (Exception e) { e.printStackTrace(); diff --git a/modules/mogo-module-media/src/main/res/layout/module_media_music_window_alert_layout_new.xml b/modules/mogo-module-media/src/main/res/layout/module_media_music_window_alert_layout_new.xml index 8d2d4cebc0..8c0e5dbe4d 100644 --- a/modules/mogo-module-media/src/main/res/layout/module_media_music_window_alert_layout_new.xml +++ b/modules/mogo-module-media/src/main/res/layout/module_media_music_window_alert_layout_new.xml @@ -5,17 +5,26 @@ android:layout_width="@dimen/module_media_pop_window_size" android:layout_height="@dimen/module_media_pop_window_size"> - + android:layout_height="match_parent" /> + + + + + + + + + + + + 112px 30px 80px - 90px + 101px 60px 116px 230px diff --git a/modules/mogo-module-media/src/main/res/values/dimens.xml b/modules/mogo-module-media/src/main/res/values/dimens.xml index 48da6e24fd..d0351297ed 100644 --- a/modules/mogo-module-media/src/main/res/values/dimens.xml +++ b/modules/mogo-module-media/src/main/res/values/dimens.xml @@ -70,7 +70,7 @@ 60px 18px 44px - 55px + 60px 60px 123px 10px From 789f157f22761773f32b1d3507fda8b284ec6252 Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Wed, 16 Dec 2020 17:06:11 +0800 Subject: [PATCH 07/16] opt --- .../drawer/marker/MapCameraInfoView.java | 66 ++++++++++++++++++ .../module_camera_real_time_traffic.png | Bin 0 -> 14393 bytes .../res/layout/modudle_camera_layout_info.xml | 22 ++++++ .../live/CameraWindow3DAdapter.java | 33 +++++++++ .../utils/CameraLiveNoticeHelper.java | 42 ++++++----- 5 files changed, 146 insertions(+), 17 deletions(-) create mode 100644 modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/marker/MapCameraInfoView.java create mode 100644 modules/mogo-module-common/src/main/res/drawable-xhdpi/module_camera_real_time_traffic.png create mode 100644 modules/mogo-module-common/src/main/res/layout/modudle_camera_layout_info.xml create mode 100644 modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/CameraWindow3DAdapter.java diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/marker/MapCameraInfoView.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/marker/MapCameraInfoView.java new file mode 100644 index 0000000000..d6f3990014 --- /dev/null +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/marker/MapCameraInfoView.java @@ -0,0 +1,66 @@ +package com.mogo.module.common.drawer.marker; + +import android.content.Context; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; + +import com.mogo.map.marker.MogoMarkerOptions; +import com.mogo.module.common.ModuleNames; +import com.mogo.module.common.MogoApisHandler; +import com.mogo.module.common.R; +import com.mogo.module.common.entity.MarkerExploreWay; +import com.mogo.module.common.entity.MarkerShareMusic; +import com.mogo.module.common.entity.MarkerShowEntity; +import com.mogo.module.common.marker.PoiWrapper; +import com.mogo.module.common.utils.CloudPoiManager; +import com.mogo.utils.logger.Logger; + +/** + * author : donghongyu + * e-mail : 1358506549@qq.com + * date : 2020-01-0619:55 + * desc : 地图Marker图标带文本信息 + * version: 1.0 + */ +public class MapCameraInfoView extends MapMarkerBaseView { + private String TAG = "MapCameraInfoView"; + + private ImageView mCameraImage; + + + public MapCameraInfoView(Context context ) { + super( context ); + } + + public MapCameraInfoView(Context context, @Nullable AttributeSet attrs ) { + super( context, attrs ); + } + + public MapCameraInfoView(Context context, @Nullable AttributeSet attrs, int defStyleAttr ) { + super( context, attrs, defStyleAttr ); + } + + public MapCameraInfoView(Context context, MogoMarkerOptions options ) { + super( context ); + mOptions = options; + } + + @Override + protected void initView( Context context ) { + LayoutInflater.from( context ).inflate( R.layout.modudle_camera_layout_info, this ); + mCameraImage = findViewById( R.id.iv_camera_traffic); + } + + @Override + public void updateView( MarkerShowEntity markerShowEntity ) { + + } + +} diff --git a/modules/mogo-module-common/src/main/res/drawable-xhdpi/module_camera_real_time_traffic.png b/modules/mogo-module-common/src/main/res/drawable-xhdpi/module_camera_real_time_traffic.png new file mode 100644 index 0000000000000000000000000000000000000000..3f41ce425208aaee64635d8f25f426a5decd634a GIT binary patch literal 14393 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 + + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/CameraWindow3DAdapter.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/CameraWindow3DAdapter.java new file mode 100644 index 0000000000..d87fcb9e0f --- /dev/null +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/CameraWindow3DAdapter.java @@ -0,0 +1,33 @@ +package com.mogo.module.extensions.live; + +import android.content.Context; +import android.view.View; + +import com.mogo.map.marker.IMogoInfoWindowAdapter; +import com.mogo.map.marker.IMogoMarker; +import com.mogo.map.marker.MogoMarkerOptions; +import com.mogo.module.common.drawer.marker.IMarkerView; +import com.mogo.module.common.drawer.marker.MapCameraInfoView; +import com.mogo.module.common.drawer.marker.MapMarkerAdapter; +import com.mogo.module.common.drawer.marker.MapMarkerView; +import com.mogo.module.common.entity.MarkerShowEntity; + +/** + * @author lixiaopeng + * @since 2020/12/16 + * 描述 + */ +public class CameraWindow3DAdapter implements IMogoInfoWindowAdapter { + private Context mContext; + private MogoMarkerOptions mOptions; + + public CameraWindow3DAdapter(Context context, MogoMarkerOptions options) { + this.mContext = context; + this.mOptions = options; + } + + @Override + public View getInfoWindow(IMogoMarker marker) { + return new MapCameraInfoView(mContext, mOptions); + } +} 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 index ea620b0f1f..5e985d205c 100644 --- 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 @@ -4,15 +4,20 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Log; +import android.view.View; +import com.mogo.commons.AbsMogoApplication; +import com.mogo.map.marker.IMogoInfoWindowAdapter; 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.drawer.marker.RoadConditionInfoWindow3DAdapter; 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.CameraWindow3DAdapter; import com.mogo.module.extensions.live.ExtensionServiceManager; import com.mogo.module.extensions.live.PushDataType; import com.mogo.service.connection.IMogoOnWebSocketMessageListener; @@ -23,7 +28,6 @@ import com.mogo.utils.logger.Logger; /** * vr模式下,红绿灯消息 AdasNoticeHelper - * */ public class CameraLiveNoticeHelper implements IMogoOnWebSocketMessageListener { private static final String TAG = "liyz"; @@ -35,16 +39,7 @@ public class CameraLiveNoticeHelper implements IMogoOnWebSocketMessageListener { -// mCloudRoadData = new CloudRoadData(); -// mCloudRoadData.setRtmpUrl("rtmp://58.200.131.2:1935/livetv/hunantv"); -// mCloudRoadData.setLat(40.200353); -// mCloudRoadData.setLon(116.745467); -//// CameraLiveManager.getInstance().init(mCloudRoadData); -// addCameraMarker(mCloudRoadData); -// }, 2_000 ); + } public void enterVrMode() { @@ -64,6 +59,16 @@ public class CameraLiveNoticeHelper implements IMogoOnWebSocketMessageListener { +// mCloudRoadData = new CloudRoadData(); +// mCloudRoadData.setRtmpUrl("rtmp://58.200.131.2:1935/livetv/hunantv"); +// mCloudRoadData.setLat(40.200353); +// mCloudRoadData.setLon(116.745467); +//// CameraLiveManager.getInstance().init(mCloudRoadData); +// addCameraMarker(mCloudRoadData); +// }, 2_000); + } @@ -74,6 +79,7 @@ public class CameraLiveNoticeHelper implements IMogoOnWebSocketMessageListener { + Logger.e(TAG, "onMsgReceived mCloudRoadData == null "); + UiThreadHandler.postDelayed(() -> { removeCameraMarker(); - }, 1_000 ); + }, 1_000); } } else { Log.e(TAG, "onMsgReceived obj == null "); From 577d24d767e31bf2e14258d581e5e677b2972a45 Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Wed, 16 Dec 2020 17:26:13 +0800 Subject: [PATCH 08/16] opt --- .../utils/CameraLiveNoticeHelper.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) 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 index 5e985d205c..cecf99c144 100644 --- 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 @@ -39,7 +39,7 @@ public class CameraLiveNoticeHelper implements IMogoOnWebSocketMessageListener { -// mCloudRoadData = new CloudRoadData(); -// mCloudRoadData.setRtmpUrl("rtmp://58.200.131.2:1935/livetv/hunantv"); -// mCloudRoadData.setLat(40.200353); -// mCloudRoadData.setLon(116.745467); -//// CameraLiveManager.getInstance().init(mCloudRoadData); -// addCameraMarker(mCloudRoadData); -// }, 2_000); + UiThreadHandler.postDelayed(() -> { + mCloudRoadData = new CloudRoadData(); + mCloudRoadData.setRtmpUrl("rtmp://58.200.131.2:1935/livetv/hunantv"); + mCloudRoadData.setLat(40.200353); + mCloudRoadData.setLon(116.745467); +// CameraLiveManager.getInstance().init(mCloudRoadData); + addCameraMarker(mCloudRoadData); + }, 2_000); } From 4231f006c17315e939df9d64b7e6d8edcb6ae150 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Wed, 16 Dec 2020 18:27:02 +0800 Subject: [PATCH 09/16] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=A4=A7=E5=94=90?= =?UTF-8?q?=E9=AB=98=E9=B8=BFobu=EF=BC=8C=E5=A2=9E=E5=8A=A0debug=E5=85=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E5=8E=BB=E6=8E=89=E4=BA=86vrMode=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/launcher/MogoApplication.java | 3 +- .../com/mogo/commons/debug/DebugConfig.java | 5 + .../extensions/entrance/EntranceFragment.java | 99 +++++++- .../main/res/layout/include_debug_panel.xml | 140 +++++++++++ .../res/layout/module_ext_layout_entrance.xml | 6 + .../module_ext_layout_entrance_no_map.xml | 4 + .../layout/module_ext_layout_extensions.xml | 31 ++- .../com/zhidao/mogo/module/obu/ObuManager.kt | 20 +- .../com/zhidao/mogo/module/obu/obu/BaseObu.kt | 7 +- .../com/zhidao/mogo/module/obu/obu/CidiObu.kt | 12 +- .../zhidao/mogo/module/obu/obu/HualiObu.kt | 10 +- .../com/zhidao/mogo/module/obu/obu/IObu.kt | 8 +- .../zhidao/mogo/module/obu/obu/NetCarObu.kt | 236 ++++++++++++++++++ .../module/obu/socket/ISocketMsgCallback.kt | 13 + .../obu/socket/IUdpSocketStatusCallback.kt | 11 + .../module/obu/socket/SimpleSocketManager.kt | 5 + .../module/obu/socket/UdpSocketManager.kt | 59 ++++- .../com/mogo/module/v2x/V2XObuManager.java | 35 ++- 18 files changed, 665 insertions(+), 39 deletions(-) create mode 100644 modules/mogo-module-extensions/src/main/res/layout/include_debug_panel.xml create mode 100644 modules/mogo-module-obu/src/main/java/com/zhidao/mogo/module/obu/obu/NetCarObu.kt create mode 100644 modules/mogo-module-obu/src/main/java/com/zhidao/mogo/module/obu/socket/ISocketMsgCallback.kt create mode 100644 modules/mogo-module-obu/src/main/java/com/zhidao/mogo/module/obu/socket/IUdpSocketStatusCallback.kt diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index a84d792e64..b21ec92c05 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -32,6 +32,7 @@ import com.mogo.utils.ProcessUtils; import com.mogo.utils.UiThreadHandler; import com.mogo.utils.logger.LogLevel; import com.mogo.utils.logger.Logger; +import com.mogo.utils.storage.SharedPrefsMgr; import com.squareup.leakcanary.LeakCanary; import com.zhidao.boot.persistent.lib.PersistentManager; import com.zhidao.mogo.module.left.panel.LeftPanelConst; @@ -141,7 +142,7 @@ public class MogoApplication extends AbsMogoApplication { DebugConfig.setNeedLoadGuideModule( BuildConfig.IS_NEED_LOAD_GUIDE_MODULE ); DebugConfig.setNeedHideAdasWhenShare( BuildConfig.IS_NEED_HIDE_ADAS_WHEN_SHARE ); DebugConfig.setNeedUploadCoordinatesInTime( BuildConfig.IS_NEED_UPLOAD_COORDINATES_IN_TIME ); -// DebugConfig.setObuType( BuildConfig.OBU_TYPE ); + DebugConfig.setObuType(SharedPrefsMgr.getInstance(this).getInt("OBU_TYPE", DebugConfig.OBU_TYPE_CIDI)); } @Override diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/debug/DebugConfig.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/debug/DebugConfig.java index ee43f05a07..5c3f9f57c1 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/debug/DebugConfig.java +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/debug/DebugConfig.java @@ -90,6 +90,11 @@ public class DebugConfig { */ public static final int OBU_TYPE_HUALI = 2; + /** + * 大唐高鸿obu 11.11国展 + */ + public static final int OBU_TYPE_GOHIGH = 3; + /** * 获取网络环境类型 * 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 4da4fe8182..baefe740bc 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 @@ -4,15 +4,18 @@ import android.content.Intent; import android.graphics.Rect; import android.os.Bundle; import android.os.Handler; +import android.os.SystemClock; import android.text.TextUtils; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; import android.widget.ImageButton; import android.widget.EditText; import android.widget.ImageView; +import android.widget.RadioButton; import android.widget.TextView; import androidx.annotation.NonNull; @@ -207,6 +210,8 @@ public class EntranceFragment extends MvpFragment { + if (SystemClock.elapsedRealtime() - lastDebugPanelClickTime > 1000) { + debugPanelClickCount = 1; + }else{ + debugPanelClickCount++; + } + + lastDebugPanelClickTime = SystemClock.elapsedRealtime(); + + if (debugPanelClickCount == 10) { + // show panel + debugPanelGroup.setVisibility(View.VISIBLE); + } + + }); + + initDebugPanel(); + } + private int debugPanelClickCount = 0; + private long lastDebugPanelClickTime = 0; + private EditText etTimes; private Group groupFix; private void enterVrMode(){ - tvEnterVrMode.setVisibility(View.GONE); +// tvEnterVrMode.setVisibility(View.GONE); mMove2CurrentLocation.setVisibility(View.GONE); mUploadRoadCondition.setVisibility(View.GONE); mWeatherContainer.setVisibility(View.GONE); mMsgContainer.setVisibility(View.GONE); groupUserHead.setVisibility(View.GONE); - tvExitVrMode.setVisibility(View.VISIBLE); +// tvExitVrMode.setVisibility(View.VISIBLE); TopViewAnimHelper.getInstance().enterVrMode(); TopViewNoLinkageAnimHelper.getInstance().enterVrMode(); mNaviInfo = vrModeNavInfoView; @@ -497,14 +524,14 @@ public class EntranceFragment extends MvpFragment debugPanelGroup.setVisibility(View.GONE)); + + btnOpenLog.setOnClickListener(v->{ + Intent intent = new Intent("com.mogo.ACTION"); + intent.putExtra("oper", 1); + getContext().sendBroadcast(intent); + debugPanelGroup.setVisibility(View.GONE); + }); + + btnCloseLog.setOnClickListener(v -> { + Intent intent = new Intent("com.mogo.ACTION"); + intent.putExtra("oper", 2); + getContext().sendBroadcast(intent); + debugPanelGroup.setVisibility(View.GONE); + }); + + btnOpenV2XPanel.setOnClickListener(v -> { + Intent intent = new Intent("com.v2x.test_panel_control"); + intent.putExtra("TextPanelOpenStatus", true); + getContext().sendBroadcast(intent); + debugPanelGroup.setVisibility(View.GONE); + }); + + switch (DebugConfig.getObuType()) { + case DebugConfig.OBU_TYPE_CIDI: + rbCidi.setChecked(true); + break; + case DebugConfig.OBU_TYPE_HUALI: + rbHuali.setChecked(true); + break; + default: + rbGohigh.setChecked(true); + break; + } + + rbCidi.setOnClickListener(v -> exchangeObuType(DebugConfig.OBU_TYPE_CIDI)); + rbHuali.setOnClickListener(v -> exchangeObuType(DebugConfig.OBU_TYPE_HUALI)); + rbGohigh.setOnClickListener(v -> exchangeObuType(DebugConfig.OBU_TYPE_GOHIGH)); + + } + + private void exchangeObuType(int obuType) { + SharedPrefsMgr.getInstance(getContext()).putInt("OBU_TYPE", obuType); + DebugConfig.setObuType(obuType); + Intent intent = new Intent("com.mogo.launcher.v2x.action.EXCHANGE_OBU_TYPE"); + intent.putExtra("obuType", obuType); + getContext().sendBroadcast(intent); + } } diff --git a/modules/mogo-module-extensions/src/main/res/layout/include_debug_panel.xml b/modules/mogo-module-extensions/src/main/res/layout/include_debug_panel.xml new file mode 100644 index 0000000000..560df074ee --- /dev/null +++ b/modules/mogo-module-extensions/src/main/res/layout/include_debug_panel.xml @@ -0,0 +1,140 @@ + + + + + + + + + + +