From 87d30e4768e35f7b6f156e20a2214f1ef62cc0c2 Mon Sep 17 00:00:00 2001 From: bxb Date: Wed, 22 Feb 2023 11:34:36 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=B8=85=E6=89=AB=E8=BD=A6]=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=B0=8F=E5=9C=B0=E5=9B=BE=E5=92=8C=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E4=BB=BB=E5=8A=A1=E5=85=A8=E8=A7=88=E5=9B=BE=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E6=90=AD=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/och/sweeper/bean/WeltDataBean.kt | 10 + ...k.java => ICleaningModeStateCallback.java} | 2 +- .../callback/IWeltMapSwitchToSmallCallback.kt | 5 + .../fragment/BaseSweeperTabFragment.java | 96 +++++++- .../och/sweeper/fragment/SweeperFragment.kt | 3 +- .../fragment/WeltMapOverViewFragment.kt | 94 ++++++++ .../sweeper/presenter/SweeperPresenter.java | 1 + .../sweeper/ui/SweeperOperatePanelView.java | 7 +- .../popwindow/SweeperOperatePanelPopWindow.kt | 4 +- .../mogo/och/sweeper/view/LegendItemView.kt | 32 +++ .../och/sweeper/view/SweeperWorkModeView.kt | 4 +- .../mogo/och/sweeper/view/WeltMapOverView.kt | 212 ++++++++++++++++++ .../mogo/och/sweeper/view/WeltSmallMapView.kt | 208 +++++++++++++++++ .../res/drawable-xhdpi/end_maker_icon.png | Bin 0 -> 10262 bytes .../res/drawable-xhdpi/start_maker_icon.png | Bin 4305 -> 9720 bytes .../res/drawable-xhdpi/sweeper_car_small.png | Bin 0 -> 2393 bytes .../sweeper_full_screen_icon.png | Bin 0 -> 1083 bytes .../src/main/res/drawable/sweeper_legend1.xml | 5 + .../src/main/res/drawable/sweeper_legend2.xml | 5 + .../src/main/res/drawable/sweeper_legend3.xml | 5 + .../src/main/res/drawable/sweeper_legend4.xml | 5 + .../src/main/res/drawable/sweeper_legend5.xml | 5 + .../src/main/res/drawable/sweeper_legend6.xml | 5 + .../res/layout/fragment_welt_map_overview.xml | 9 + .../main/res/layout/sweeper_base_fragment.xml | 66 ++++-- .../main/res/layout/sweeper_item_legend.xml | 24 ++ .../res/layout/sweeper_welt_map_overview.xml | 108 +++++++++ .../layout/sweeper_welt_small_map_view.xml | 50 +++++ .../src/main/res/values/style.xml | 22 +- 29 files changed, 927 insertions(+), 60 deletions(-) create mode 100644 OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/WeltDataBean.kt rename OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/{CleaningModeStateCallback.java => ICleaningModeStateCallback.java} (87%) create mode 100644 OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/IWeltMapSwitchToSmallCallback.kt create mode 100644 OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/WeltMapOverViewFragment.kt create mode 100644 OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/LegendItemView.kt create mode 100644 OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltMapOverView.kt create mode 100644 OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltSmallMapView.kt create mode 100644 OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/end_maker_icon.png create mode 100644 OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_car_small.png create mode 100644 OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_full_screen_icon.png create mode 100644 OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend1.xml create mode 100644 OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend2.xml create mode 100644 OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend3.xml create mode 100644 OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend4.xml create mode 100644 OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend5.xml create mode 100644 OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend6.xml create mode 100644 OCH/mogo-och-sweeper/src/main/res/layout/fragment_welt_map_overview.xml create mode 100644 OCH/mogo-och-sweeper/src/main/res/layout/sweeper_item_legend.xml create mode 100644 OCH/mogo-och-sweeper/src/main/res/layout/sweeper_welt_map_overview.xml create mode 100644 OCH/mogo-och-sweeper/src/main/res/layout/sweeper_welt_small_map_view.xml diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/WeltDataBean.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/WeltDataBean.kt new file mode 100644 index 0000000000..c0f6809f37 --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/WeltDataBean.kt @@ -0,0 +1,10 @@ +package com.mogo.och.sweeper.bean + +data class WeltDataBean( + var locLon: Double,//经度 + var locLat: Double,//纬度 + var weltDistance: Double,//贴边距离 + var cleanMode: Int,//清扫模式 + var cleanDirection: Int,//清扫方向 + var cleanIntensity: Int,//作业强度 +) \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/CleaningModeStateCallback.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ICleaningModeStateCallback.java similarity index 87% rename from OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/CleaningModeStateCallback.java rename to OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ICleaningModeStateCallback.java index b1ec2c6867..df0ed8bc1d 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/CleaningModeStateCallback.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ICleaningModeStateCallback.java @@ -7,6 +7,6 @@ import chassis.ChassisStatesOuterClass; /** * 上装状态回调 */ -public interface CleaningModeStateCallback { +public interface ICleaningModeStateCallback { void cleaningModeState(OperateStateEnum cleaningModeState, ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState,boolean isSelectPureSweepMode); } diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/IWeltMapSwitchToSmallCallback.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/IWeltMapSwitchToSmallCallback.kt new file mode 100644 index 0000000000..1b3e66bfe7 --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/IWeltMapSwitchToSmallCallback.kt @@ -0,0 +1,5 @@ +package com.mogo.och.sweeper.callback + +interface IWeltMapSwitchToSmallCallback { + fun onWeltMapSwitchToSmall() +} \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java index a92ebe344d..1ca537c04e 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java @@ -24,10 +24,15 @@ import com.mogo.map.marker.IMogoMarkerManager; import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.map.uicontroller.VisualAngleMode; import com.mogo.och.common.module.map.AmapNaviToDestinationModel; +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; import com.mogo.och.sweeper.R; -import com.mogo.och.sweeper.view.SweeperCurrentTaskInfoView; +import com.mogo.och.sweeper.bean.WeltDataBean; +import com.mogo.och.sweeper.callback.IWeltMapSwitchToSmallCallback; import com.mogo.och.sweeper.view.SweeperTrafficDataView; -import com.mogo.och.sweeper.view.SweeperWorkModeView; +import com.mogo.och.sweeper.view.WeltSmallMapView; + +import java.util.ArrayList; +import java.util.List; import androidx.annotation.NonNull; import androidx.constraintlayout.widget.Group; @@ -41,7 +46,7 @@ import androidx.fragment.app.FragmentTransaction; * @author tongchenfei */ public abstract class BaseSweeperTabFragment> extends MvpFragment implements IMogoMapListener, - View.OnClickListener { + View.OnClickListener, IWeltMapSwitchToSmallCallback { private static final String TAG = "BaseSweeperTabFragment"; //地图放大缩小 @@ -65,8 +70,15 @@ public abstract class BaseSweeperTabFragment weltDataBean = new ArrayList<>(); + weltDataBean.add(new WeltDataBean(116.38851540542558, 39.97419244219622, -10, 1, 1, 1)); + weltDataBean.add(new WeltDataBean(116.38777443467706, 39.96694323029558, 8, 1, 1, 1)); + weltDataBean.add(new WeltDataBean(116.39311478161825, 39.967085313029074, 16, 1, 1, 1)); + weltDataBean.add(new WeltDataBean(116.40963237692603, 39.975055860562826, 30, 1, 1, 1)); + weltDataBean.add(new WeltDataBean(116.41146331146084, 39.97513910337909, -9999.0, 1, 1, 1)); + weltDataBean.add(new WeltDataBean(116.40748849300006, 39.96752223478818, -10000.0, 1, 1, 1)); + weltDataBean.add(new WeltDataBean(116.42670283855335, 39.97526250389533, 1000, 1, 1, 1)); + mMapWeltView.setWeltData(weltDataBean); + mMapWeltView.drawablePolyline(); + } } diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.kt index 235f0074f5..06aa396ffa 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.kt @@ -4,7 +4,6 @@ import android.os.Bundle import android.view.View import androidx.recyclerview.widget.LinearLayoutManager import chassis.ChassisStatesOuterClass -import com.elegant.utils.UiThreadHandler import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.och.sweeper.R import com.mogo.och.sweeper.bean.SubInfo @@ -24,7 +23,7 @@ import kotlinx.android.synthetic.main.sweeper_no_data_common_view.* /** * 清扫车主界面 */ -class SweeperFragment : BaseSweeperTabFragment(), MenuPopWindow.OnMenuItemOnClickListener { +class SweeperFragment : BaseSweeperTabFragment(), MenuPopWindow.OnMenuItemOnClickListener{ private var mAdapter: TaskListAdapter? = null private var mCurrentSubPosition: Int = 0 //子任务下标 private var mMainMutableList: MutableList? = null diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/WeltMapOverViewFragment.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/WeltMapOverViewFragment.kt new file mode 100644 index 0000000000..1d78438404 --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/WeltMapOverViewFragment.kt @@ -0,0 +1,94 @@ +package com.mogo.och.sweeper.fragment + +import android.os.Bundle +import com.mogo.commons.mvp.BaseFragment +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil +import com.mogo.och.sweeper.R +import com.mogo.och.sweeper.bean.WeltDataBean +import com.mogo.och.sweeper.callback.IWeltMapSwitchToSmallCallback +import kotlinx.android.synthetic.main.fragment_welt_map_overview.* +import kotlinx.android.synthetic.main.sweeper_welt_map_overview.* + +class WeltMapOverViewFragment(var mIWeltMapSwitchToSmallCallBack: IWeltMapSwitchToSmallCallback?) : BaseFragment() { + override fun getLayoutId(): Int = R.layout.fragment_welt_map_overview + override fun getTagName(): String { + return "WeltMapOverViewFragment" + } + + override fun initViews() { + + } + + override fun initViews(savedInstanceState: Bundle?) { + super.initViews(savedInstanceState) + weltMapOverView.onCreateView(savedInstanceState) + } + + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + setWeltData() + setLegendData() + sweeperSwitchToSmall.setOnClickListener { + mIWeltMapSwitchToSmallCallBack?.onWeltMapSwitchToSmall() + } + } + + companion object { + @JvmStatic + fun newInstance(mIWeltMapSwitchToSmallCallBack: IWeltMapSwitchToSmallCallback): WeltMapOverViewFragment { + val args = Bundle() + val fragment = WeltMapOverViewFragment(mIWeltMapSwitchToSmallCallBack) + fragment.arguments = args + return fragment + } + } + + override fun onPause() { + super.onPause() + weltMapOverView.onPause() + } + + override fun onResume() { + super.onResume() + weltMapOverView.onResume() + } + + override fun onDestroy() { + super.onDestroy() + weltMapOverView.onDestroy() + } + + /** + * mock 贴边假数据 + */ + private fun setWeltData() { + val weltDataBean: MutableList = ArrayList() + weltDataBean.add(WeltDataBean(116.38851540542558, 39.97419244219622, -10.0, 1, 1, 1)) + weltDataBean.add(WeltDataBean(116.38777443467706, 39.96694323029558, 8.0, 1, 1, 1)) + weltDataBean.add(WeltDataBean(116.39311478161825, 39.967085313029074, 16.0, 1, 1, 1)) + weltDataBean.add(WeltDataBean(116.40963237692603, 39.975055860562826, 30.0, 1, 1, 1)) + weltDataBean.add(WeltDataBean(116.41146331146084, 39.97513910337909, -9999.0, 1, 1, 1)) + weltDataBean.add(WeltDataBean(116.40748849300006, 39.96752223478818, -10000.0, 1, 1, 1)) + weltDataBean.add(WeltDataBean(116.42670283855335, 39.97526250389533, 1000.0, 1, 1, 1)) + weltMapOverView.setWeltData(weltDataBean) + weltMapOverView.drawablePolyline() + weltMapOverView.addStartAndEndMarker( + CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(context, 116.38851540542558, 39.97419244219622), + CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj( + context, 116.42670283855335, 39.97526250389533 + ) + ) + } + + /** + * 设置图例数据 + */ + private fun setLegendData() { + sweeperLegend1.setData(R.drawable.sweeper_legend1, "a<10") + sweeperLegend2.setData(R.drawable.sweeper_legend2, "0≤a<10") + sweeperLegend3.setData(R.drawable.sweeper_legend3, "10≤a<20") + sweeperLegend4.setData(R.drawable.sweeper_legend4, "a≥20") + sweeperLegend5.setData(R.drawable.sweeper_legend5, "非贴边") + sweeperLegend6.setData(R.drawable.sweeper_legend6, "未经过") + } +} \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java index 844fe8733d..36508c47a5 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java @@ -292,6 +292,7 @@ public class SweeperPresenter extends Presenter @Override public void onSweeperFutianTaskIndexData(@NonNull RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex roboSweeperTaskIndex) { + } /** diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperOperatePanelView.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperOperatePanelView.java index e8620e25f9..934cc029de 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperOperatePanelView.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperOperatePanelView.java @@ -30,10 +30,9 @@ import androidx.annotation.Nullable; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager; import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener; -import com.mogo.eagle.core.utilcode.util.ThreadUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.och.sweeper.R; -import com.mogo.och.sweeper.callback.CleaningModeStateCallback; +import com.mogo.och.sweeper.callback.ICleaningModeStateCallback; import com.mogo.och.sweeper.constant.OperateStateEnum; import com.mogo.och.sweeper.util.SweeperFutianCmdUtil; import com.mogo.och.sweeper.view.NoTouchConstraintLayout; @@ -121,7 +120,7 @@ public class SweeperOperatePanelView extends LinearLayout { }; private boolean isSelectPureSweepMode = false;//用于标注是否选中纯扫 - private CleaningModeStateCallback cleaningModeStateCallback; + private ICleaningModeStateCallback cleaningModeStateCallback; private OperateStateEnum operateStateEnum = OperateStateEnum.SYNCING_STATUS; @@ -724,7 +723,7 @@ public class SweeperOperatePanelView extends LinearLayout { } public void setSweeperFutianCleanSystemState(ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState, - CleaningModeStateCallback cleaningModeStateCallback) { + ICleaningModeStateCallback cleaningModeStateCallback) { this.cleaningModeStateCallback = cleaningModeStateCallback; // 有命令正在执行 if (mCurrentCmdRequestCallback != null) { diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/SweeperOperatePanelPopWindow.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/SweeperOperatePanelPopWindow.kt index 17f5fae813..1004555886 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/SweeperOperatePanelPopWindow.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/SweeperOperatePanelPopWindow.kt @@ -8,7 +8,7 @@ import android.view.ViewGroup import android.widget.PopupWindow import chassis.ChassisStatesOuterClass import com.mogo.och.sweeper.R -import com.mogo.och.sweeper.callback.CleaningModeStateCallback +import com.mogo.och.sweeper.callback.ICleaningModeStateCallback import com.mogo.och.sweeper.constant.OperateStateEnum import com.mogo.och.sweeper.ui.SweeperOperatePanelView @@ -35,7 +35,7 @@ class SweeperOperatePanelPopWindow : PopupWindow{ */ fun setCleanSystemState( cleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates?, - cleaningModeStateCallback: CleaningModeStateCallback + cleaningModeStateCallback: ICleaningModeStateCallback ) { mOperatePanelView?.setSweeperFutianCleanSystemState(cleanSystemState, cleaningModeStateCallback) } diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/LegendItemView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/LegendItemView.kt new file mode 100644 index 0000000000..9a6e360b14 --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/LegendItemView.kt @@ -0,0 +1,32 @@ +package com.mogo.och.sweeper.view + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.LinearLayout +import com.mogo.och.sweeper.R +import kotlinx.android.synthetic.main.sweeper_item_legend.view.* + +/** + * 任务路线全览图图例 + */ +class LegendItemView:LinearLayout { + constructor(context: Context) : super(context) {} + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { + initView(context) + } + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {} + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {} + + private fun initView(context: Context) { + LayoutInflater.from(context).inflate(R.layout.sweeper_item_legend, this) + } + + /** + * 设置数据 + */ + fun setData(resId:Int,text:String){ + sweeperLegendIcon.setImageResource(resId) + sweeperLegendText.text = text + } +} \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperWorkModeView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperWorkModeView.kt index e1dfbf38c1..565ec75a99 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperWorkModeView.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperWorkModeView.kt @@ -10,7 +10,7 @@ import com.elegant.utils.UiThreadHandler import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.och.sweeper.R -import com.mogo.och.sweeper.callback.CleaningModeStateCallback +import com.mogo.och.sweeper.callback.ICleaningModeStateCallback import com.mogo.och.sweeper.constant.OperateStateEnum import com.mogo.och.sweeper.constant.SubTaskTypeEnum import com.mogo.och.sweeper.ui.popwindow.SweeperOperatePanelPopWindow @@ -20,7 +20,7 @@ import kotlinx.android.synthetic.main.sweeper_work_mode.view.* /** * 清扫车模式信息展示 */ -class SweeperWorkModeView : ConstraintLayout, CleaningModeStateCallback { +class SweeperWorkModeView : ConstraintLayout, ICleaningModeStateCallback { private var isSelectPureSweepMode: Boolean = false private val TAG = "SweeperWorkModeView" diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltMapOverView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltMapOverView.kt new file mode 100644 index 0000000000..749767df93 --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltMapOverView.kt @@ -0,0 +1,212 @@ +package com.mogo.och.sweeper.view + +import android.content.Context +import android.graphics.Color +import android.os.Bundle +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.ImageView +import androidx.constraintlayout.widget.ConstraintLayout +import com.amap.api.maps.AMap +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.model.* +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil +import com.mogo.och.sweeper.R +import com.mogo.och.sweeper.bean.WeltDataBean +import kotlinx.android.synthetic.main.sweeper_welt_map_overview.view.* + +/** + * 作业任务全览图 + */ +class WeltMapOverView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { + private var mWeltData: MutableList = mutableListOf() //任务数据集合 + private var mCoordinatesLatLng: MutableList = mutableListOf() //任务坐标点 + private var mCarMarker: Marker? = null + private var mAMap: AMap? = null + private var mPolyline: Polyline? = null + private var colorList: MutableList = mutableListOf() + private val mLineMarkers: MutableList = mutableListOf() + //清扫车任务地图 + private val TAG = "WeltMapOverView" + constructor(context: Context) : super(context) {} + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { + initView(context) + } + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {} + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {} + + private fun initView(context: Context) { + LayoutInflater.from(context).inflate(R.layout.sweeper_welt_map_overview, this) + initAMapView() + // 注册定位监听 + CallerChassisLocationGCJ02ListenerManager.addListener(TAG, this) + setLegendData() + } + private fun initAMapView() { + mAMap = sweeperTextureMapView.map + // 地图文字标注 + mAMap?.showMapText(true) + //显示3D建筑物 + mAMap?.showBuildings(true) + // 设置导航地图模式,aMap是地图控制器对象。 + mAMap?.mapType = AMap.MAP_TYPE_NIGHT + // 关闭显示实时路况图层,aMap是地图控制器对象。 + mAMap?.isTrafficEnabled = false + // 设置 锚点 图标 + mCarMarker = mAMap?.addMarker( + MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(R.drawable.sweeper_car_small)) + .anchor(0.5f, 0.5f) + ) + // 设置地图的样式 + val uiSettings = mAMap?.uiSettings + uiSettings?.isZoomControlsEnabled = false // 地图缩放级别的交换按钮 + uiSettings?.setAllGesturesEnabled(false) // 所有手势 + uiSettings?.isMyLocationButtonEnabled = false // 显示默认的定位按钮 + uiSettings?.setLogoBottomMargin(-150) //设置Logo下边界距离屏幕底部的边距,设置为负值即可 + mAMap?.setOnMapLoadedListener(AMap.OnMapLoadedListener { + CallerLogger.d(SceneConstant.M_SWEEPER + TAG, "WeltView---onMapLoaded") + // 实时路况图层关闭,必须添加在loaded结束之后,其他位置不生效 + mAMap?.isTrafficEnabled = false + mAMap?.showBuildings(true) + }) + } + + /** + * 添加画线颜色值 + */ + private fun addRouteColorList() { + for (i in mWeltData.indices) { + if (mWeltData[i].weltDistance == -9999.0) {//未经过 + colorList.add(Color.parseColor("#3BA1CC")) + } else if (mWeltData[i].weltDistance == -10000.0) {//非贴边 + colorList.add(Color.parseColor("#236299")) + } else if (mWeltData[i].weltDistance < 0) { + colorList.add(Color.parseColor("#C22101")) + } else if (mWeltData[i].weltDistance >= 0 && mWeltData[i].weltDistance < 10) { + colorList.add(Color.parseColor("#4DFFA4")) + } else if (mWeltData[i].weltDistance >= 10 && mWeltData[i].weltDistance < 20) { + colorList.add(Color.parseColor("#FFDD4D")) + } else if (mWeltData[i].weltDistance >= 20) { + colorList.add(Color.parseColor("#FF912B")) + } + } + } + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + mogoLocation?.let { gnssInfo -> + val currentLatLng = LatLng(gnssInfo.latitude, gnssInfo.longitude) + //更新车辆位置 + mCarMarker?.rotateAngle = (360 - gnssInfo.heading).toFloat() + mCarMarker?.position = currentLatLng + mCarMarker?.setToTop() + //圈定地图显示范围 + val boundsBuilder = LatLngBounds.Builder() + if (mCoordinatesLatLng.size > 0) { + //存放经纬度 + for (i in mCoordinatesLatLng.indices) { + boundsBuilder.include(mCoordinatesLatLng[i]) + } + boundsBuilder.include(currentLatLng) + mAMap?.moveCamera(CameraUpdateFactory.newLatLngBoundsRect(boundsBuilder.build(), 100, 100, 100, 100)) + } + } + } + /** + * 根据贴边数据绘制任务路线 + */ + fun drawablePolyline() { + mPolyline?.remove() + if (mAMap != null) { + addRouteColorList() + if (mWeltData.size >= 2 && mCoordinatesLatLng.size > 2) { + //设置线段纹理 + val polylineOptions = PolylineOptions() + polylineOptions.addAll(mCoordinatesLatLng) + polylineOptions.width(14f) //线段宽度 + polylineOptions.isUseTexture = false + polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapSquare) + polylineOptions.colorValues(colorList) + // 绘制线 + mPolyline = mAMap?.addPolyline(polylineOptions) + } + } + } + + /** + * 添加起点和终点的marker + */ + fun addStartAndEndMarker(startPoint: LatLng, endPoint: LatLng) { + val startMarker = mAMap?.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.start_maker_icon))) + startMarker?.position = startPoint + mLineMarkers.add(startMarker) + val endMarker = mAMap?.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.end_maker_icon))) + endMarker?.position = endPoint + mLineMarkers.add(endMarker) + } + + /** + * 清除maker + */ + private fun clearMarkers() { + for (i in mLineMarkers.indices) { + mLineMarkers[i]?.isVisible = false + mLineMarkers[i]?.remove() + } + mLineMarkers.clear() + } + + /** + * 清除任务路线 + */ + fun clearPolyline() { + mPolyline?.remove() + } + + /** + * 设置贴边数据 + */ + fun setWeltData(weltData: MutableList) { + this.mWeltData = weltData + for (i in mWeltData.indices) { + mCoordinatesLatLng.add(CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(context, mWeltData[i].locLon, mWeltData[i].locLat)) + } + } + /** + * 设置图例数据 + */ + private fun setLegendData() { + sweeperLegend1.setData(R.drawable.sweeper_legend1, "a<10") + sweeperLegend2.setData(R.drawable.sweeper_legend2, "0≤a<10") + sweeperLegend3.setData(R.drawable.sweeper_legend3, "10≤a<20") + sweeperLegend4.setData(R.drawable.sweeper_legend4, "a≥20") + sweeperLegend5.setData(R.drawable.sweeper_legend5, "非贴边") + sweeperLegend6.setData(R.drawable.sweeper_legend6, "未经过") + } + + fun onCreateView(savedInstanceState: Bundle?) { + sweeperTextureMapView.onCreate(savedInstanceState) + } + + fun onResume() { + sweeperTextureMapView.onResume() + } + + fun onPause() { + sweeperTextureMapView.onPause() + } + + fun onDestroy() { + sweeperTextureMapView.onDestroy() + } + + fun getSweeperSwitchToSmall(): ImageView { + return sweeperSwitchToSmall + } +} \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltSmallMapView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltSmallMapView.kt new file mode 100644 index 0000000000..0f0829095e --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltSmallMapView.kt @@ -0,0 +1,208 @@ +package com.mogo.och.sweeper.view + +import android.content.Context +import android.graphics.Color +import android.os.Bundle +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import com.amap.api.maps.AMap +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.model.* +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil +import com.mogo.och.sweeper.R +import com.mogo.och.sweeper.bean.WeltDataBean +import kotlinx.android.synthetic.main.sweeper_welt_small_map_view.view.* + +/** + * 作业任务小地图 + */ +class WeltSmallMapView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { + private var mWeltData: MutableList = mutableListOf() //任务数据集合 + private var mCoordinatesLatLng: MutableList = mutableListOf() //任务坐标点 + private var mCarMarker: Marker? = null + private var mAMap: AMap? = null + private var mPolyline: Polyline? = null + private var colorList: MutableList = mutableListOf() + private val mLineMarkers: MutableList = mutableListOf() + + //清扫车任务地图 + private val TAG = "WeltMapView" + + constructor(context: Context) : super(context) {} + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { + initView(context) + } + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {} + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {} + + private fun initView(context: Context) { + LayoutInflater.from(context).inflate(R.layout.sweeper_welt_small_map_view, this) + initAMapView() + // 注册定位监听 + CallerChassisLocationGCJ02ListenerManager.addListener(TAG, this) + } + + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + mogoLocation?.let { + val currentLatLng = LatLng(it.latitude, it.longitude) + drawCarMarker(mogoLocation) + //圈定地图显示范围 + val boundsBuilder = LatLngBounds.Builder() + if (mCoordinatesLatLng.size > 0) { + //存放经纬度 + for (i in mCoordinatesLatLng.indices) { + boundsBuilder.include(mCoordinatesLatLng[i]) + } + } + boundsBuilder.include(currentLatLng) + mAMap!!.moveCamera(CameraUpdateFactory.newLatLngBoundsRect(boundsBuilder.build(), 100, 100, 100, 100)) + } + } + + /** + * 绘制自车 + * + * @param location + */ + private fun drawCarMarker(location: MogoLocation?) { + if (location == null) return + val currentLatLng = LatLng(location.latitude, location.longitude) + //更新车辆位置 + if (mCarMarker != null) { + mCarMarker!!.rotateAngle = (360 - location.heading).toFloat() + mCarMarker!!.position = currentLatLng + mCarMarker!!.setToTop() + } + } + + private fun initAMapView() { + mAMap = sweeperSmallTextureMapView?.map + // 地图文字标注 + mAMap?.showMapText(true) + // 设置导航地图模式,aMap是地图控制器对象。 + mAMap?.mapType = AMap.MAP_TYPE_NIGHT + // 关闭显示实时路况图层,aMap是地图控制器对象。 + mAMap?.isTrafficEnabled = false + // 设置 锚点 图标 + mCarMarker = mAMap?.addMarker( + MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(R.drawable.sweeper_car_small)) + .anchor(0.5f, 0.5f) + ) + // 设置地图的样式 + val uiSettings = mAMap?.uiSettings + uiSettings?.isZoomControlsEnabled = false // 地图缩放级别的交换按钮 + uiSettings?.setAllGesturesEnabled(false) // 所有手势 + uiSettings?.isMyLocationButtonEnabled = false // 显示默认的定位按钮 + uiSettings?.setLogoBottomMargin(-150) //设置Logo下边界距离屏幕底部的边距,设置为负值即可 + mAMap?.setOnMapLoadedListener(AMap.OnMapLoadedListener { + d(SceneConstant.M_SWEEPER + TAG, "WeltView---onMapLoaded") + //mAMap?.setPointToCenter(mAMapNaviView?.width?.div(2) ?: 0, mAMapNaviView?.height?.div(2) ?: 0) + }) + } + + /** + * 添加画线颜色值 + */ + private fun addRouteColorList() { + for (i in mWeltData.indices) { + if (mWeltData[i].weltDistance == -9999.0) {//未经过 + colorList.add(Color.parseColor("#3BA1CC")) + } else if (mWeltData[i].weltDistance == -10000.0) {//非贴边 + colorList.add(Color.parseColor("#236299")) + } else if (mWeltData[i].weltDistance < 0) { + colorList.add(Color.parseColor("#C22101")) + } else if (mWeltData[i].weltDistance >= 0 && mWeltData[i].weltDistance < 10) { + colorList.add(Color.parseColor("#4DFFA4")) + } else if (mWeltData[i].weltDistance >= 10 && mWeltData[i].weltDistance < 20) { + colorList.add(Color.parseColor("#FFDD4D")) + } else if (mWeltData[i].weltDistance >= 20) { + colorList.add(Color.parseColor("#FF912B")) + } + } + } + + /** + * 根据贴边数据绘制任务路线 + */ + fun drawablePolyline() { + mPolyline?.remove() + if (mAMap != null) { + addRouteColorList() + if (mWeltData.size >= 2 && mCoordinatesLatLng.size > 2) { + val polylineOptions = PolylineOptions() + polylineOptions.addAll(mCoordinatesLatLng) + polylineOptions.width(14f) //线段宽度 + polylineOptions.isUseTexture = false + polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapSquare) + polylineOptions.colorValues(colorList) + // 绘制线 + mPolyline = mAMap?.addPolyline(polylineOptions) + addStartAndEndMarker(mCoordinatesLatLng[0], mCoordinatesLatLng[mCoordinatesLatLng.size - 1]) + } + } + } + + /** + * 添加起点和终点的marker + */ + private fun addStartAndEndMarker(startPoint: LatLng, endPoint: LatLng) { + val startMarker = mAMap?.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.start_maker_icon))) + startMarker?.position = startPoint + mLineMarkers.add(startMarker) + val endMarker = mAMap?.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.end_maker_icon))) + endMarker?.position = endPoint + mLineMarkers.add(endMarker) + } + + /** + * 清除数据 + */ + private fun clearMarkers() { + for (i in mLineMarkers.indices) { + mLineMarkers[i]?.isVisible = false + mLineMarkers[i]?.remove() + } + mLineMarkers.clear() + } + + /** + * 清除任务路线 + */ + fun clearPolyline() { + mPolyline?.remove() + } + + /** + * 设置贴边数据 + */ + fun setWeltData(weltData: MutableList) { + this.mWeltData = weltData + for (i in mWeltData.indices) { + mCoordinatesLatLng.add(CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(context, mWeltData[i].locLon, mWeltData[i].locLat)) + } + } + + fun onCreateView(savedInstanceState: Bundle?) { + sweeperSmallTextureMapView?.onCreate(savedInstanceState) + } + + fun onResume() { + sweeperSmallTextureMapView?.onResume() + } + + fun onPause() { + sweeperSmallTextureMapView?.onPause() + } + + fun onDestroy() { + sweeperSmallTextureMapView?.onDestroy() + } +} \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/end_maker_icon.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/end_maker_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..438ee2136a8e5a9f7169af7b257591f577a9f579 GIT binary patch literal 10262 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 literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/start_maker_icon.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/start_maker_icon.png index 9eca61e19996a42ed03050e805b26fdde8687795..ba3747994ce777545bd7e81be342936d7d1b121a 100644 GIT binary patch literal 9720 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 LNkvXXu0mjfisOX- literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_full_screen_icon.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_full_screen_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f39894922dccd6070c96e3bc629b9835d777c7fb GIT binary patch literal 1083 zcmV-B1jPG^P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91N}vM(1ONa40RR91N&o-=06xuyNB{r>rAb6VRCodHoH2;hKoo{|MN#w= zK~RfRZnv_MD{QQ_P`qBmN~{IJPQgOFv$3&ML0vl~xNN zbLcBl?PnFeI|ivUj&lGyCC0*AvLfa?sLd=by_SU(6(|!( z(SS0A6a^?7kb(zg3sTUaY(fealx;{sf^q>VI8d%21qI3_q+md~h7<&-Dj?M!R8^4b z4ysEBdMNKIz`gOS0MhB;j5Fps(pg_uF;+gho@5HA&X-y8uJ>C#lj;mA>m(6KH?ww_ zwk||a)*%Vhywi7D@Y}ur0}@zdjMCkB7-S^a=Pc}J)cadShqDIru`%1qs@(1QgwCZA z3GuC$*3Tkk!r~-)4Xo2@g9emJWOF#WrWX4SYE4bJqV0)W=)QwmsR)c3X1n65c@*Df zym*YNv{ix~QZsC;1-@;QwB&dh$o|Fj9`Z5aw+)AlkA^@)pdru@@Qgs} ztjA03wkfH!(15)syY(WYdluby%g0c-MNKh^y1qaF%q@X~# zgcJ-Y*N}#w_7X>DFJ&LEjm&3Jp-UyE9U;zV4XN9vzMZ!xarsZTJhSpEC4yW`3G{=q ziDxFAcYN9aBq@JUH28MW>L + + + + \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend2.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend2.xml new file mode 100644 index 0000000000..d521b0a45d --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend2.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend3.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend3.xml new file mode 100644 index 0000000000..59edb172fa --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend3.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend4.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend4.xml new file mode 100644 index 0000000000..2a4efb7072 --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend4.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend5.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend5.xml new file mode 100644 index 0000000000..c3ac48e545 --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend5.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend6.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend6.xml new file mode 100644 index 0000000000..a8b8ac1b06 --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend6.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/fragment_welt_map_overview.xml b/OCH/mogo-och-sweeper/src/main/res/layout/fragment_welt_map_overview.xml new file mode 100644 index 0000000000..e5655ea229 --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/res/layout/fragment_welt_map_overview.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_base_fragment.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_base_fragment.xml index 9fd699603b..17bf4d63a9 100644 --- a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_base_fragment.xml +++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_base_fragment.xml @@ -2,15 +2,15 @@ + android:layout_marginTop="@dimen/dp_72"> + android:layout_height="match_parent" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + app:layout_goneMarginTop="@dimen/module_mogo_och_station_panel_container_margin_top_no_call" /> + + + + + + + android:background="@drawable/sweeper_setting_btn_bg" /> + android:layout_marginBottom="@dimen/module_mogo_och_margin_bottom" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintRight_toRightOf="parent" /> + + android:layout_marginTop="@dimen/dp_26" + android:src="@drawable/sweeper_close_navi_icon" + android:visibility="gone" + app:layout_constraintStart_toStartOf="@+id/module_mogo_och_navi_panel_container" + app:layout_constraintTop_toTopOf="@+id/module_mogo_och_navi_panel_container" /> + + +