[6.7.0][运营面板] 代码部分提交

This commit is contained in:
renwj
2024-09-20 19:34:03 +08:00
parent b7e58d6c4e
commit 4a3fb0bb7e
34 changed files with 768 additions and 11 deletions

View File

@@ -8,6 +8,7 @@ import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewStub;
import android.view.animation.LinearInterpolator; import android.view.animation.LinearInterpolator;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ImageView; import android.widget.ImageView;

View File

@@ -431,4 +431,13 @@
android:elevation="100dp" android:elevation="100dp"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<!-- 运营面板 -->
<ViewStub
android:id="@+id/vsOperateView"
android:layout_width="@dimen/dp_1000"
android:layout_height="match_parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -238,7 +238,11 @@ ext {
handler_proxy_runtime : "com.mogo.eagle.core.handler.proxy:runtime:10.0.10", handler_proxy_runtime : "com.mogo.eagle.core.handler.proxy:runtime:10.0.10",
//======================== jts-core ============== //======================== jts-core ==============
jts_core : "org.locationtech.jts:jts-core:1.19.0" jts_core : "org.locationtech.jts:jts-core:1.19.0",
//========================= androidx-preference ====
preference : "androidx.preference:preference:1.2.1",
preference_ktx : "androidx.preference:preference-ktx:1.2.1"
] ]
android = [ android = [
fLauncherApplicationId : "com.mogo.launcher.f", fLauncherApplicationId : "com.mogo.launcher.f",

View File

@@ -77,6 +77,8 @@ dependencies {
implementation rootProject.ext.dependencies.koomjava implementation rootProject.ext.dependencies.koomjava
implementation rootProject.ext.dependencies.koomnative implementation rootProject.ext.dependencies.koomnative
implementation rootProject.ext.dependencies.koomxhook implementation rootProject.ext.dependencies.koomxhook
implementation rootProject.ext.dependencies.preference
implementation rootProject.ext.dependencies.preference_ktx
implementation rootProject.ext.dependencies.thread_opt implementation rootProject.ext.dependencies.thread_opt
api project(':test:crashreport-apmbyte') api project(':test:crashreport-apmbyte')

View File

@@ -2,8 +2,11 @@ package com.mogo.eagle.core.function.hmi.ui
import android.content.Context import android.content.Context
import android.text.TextUtils import android.text.TextUtils
import android.transition.Slide
import android.util.Log
import android.view.Gravity import android.view.Gravity
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager
import androidx.lifecycle.ProcessLifecycleOwner import androidx.lifecycle.ProcessLifecycleOwner
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.facade.annotation.Route
@@ -38,6 +41,8 @@ import com.mogo.eagle.core.function.hmi.ui.notice.DispatchDialogManager
import com.mogo.eagle.core.function.hmi.ui.notice.NoticeCheckDialog import com.mogo.eagle.core.function.hmi.ui.notice.NoticeCheckDialog
import com.mogo.eagle.core.function.hmi.ui.notice.traffic.NoticeTrafficDialog import com.mogo.eagle.core.function.hmi.ui.notice.traffic.NoticeTrafficDialog
import com.mogo.eagle.core.function.hmi.ui.setting.CameraLiveView.Companion.cameraLiveView import com.mogo.eagle.core.function.hmi.ui.setting.CameraLiveView.Companion.cameraLiveView
import com.mogo.eagle.core.function.hmi.bone.status.fsm.FSMStatusDetailWindowManager
import com.mogo.eagle.core.function.hmi.ui.operate.OperatePanelLayout
import com.mogo.eagle.core.function.hmi.ui.setting.StatusView import com.mogo.eagle.core.function.hmi.ui.setting.StatusView
import com.mogo.eagle.core.function.hmi.ui.setting.ToolsView.Companion.toolsView import com.mogo.eagle.core.function.hmi.ui.setting.ToolsView.Companion.toolsView
import com.mogo.eagle.core.function.hmi.ui.tools.AdUpgradeDialog import com.mogo.eagle.core.function.hmi.ui.tools.AdUpgradeDialog
@@ -59,6 +64,8 @@ import com.zhjt.service_biz.BizConfig
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import me.jessyan.autosize.utils.AutoSizeUtils
import java.lang.ref.WeakReference
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicReference import java.util.concurrent.atomic.AtomicReference
@@ -86,6 +93,8 @@ class MoGoHmiProvider : IMoGoHmiProvider {
private val xiaozhi by lazy { XiaoZhiStateManager() } private val xiaozhi by lazy { XiaoZhiStateManager() }
private val operatePanel by lazy { AtomicReference<WeakReference<MoGoPopWindow>>(null) }
override fun init(context: Context?) { override fun init(context: Context?) {
this.context = context this.context = context
} }
@@ -436,4 +445,34 @@ class MoGoHmiProvider : IMoGoHmiProvider {
override fun registerToolKitDefaultItemClickListener(tag: String, listener: IToolKitItemClickListener) { override fun registerToolKitDefaultItemClickListener(tag: String, listener: IToolKitItemClickListener) {
ToolKitDataManager.addListener(TAG, listener) ToolKitDataManager.addListener(TAG, listener)
} }
override fun toggleOperatePanel(show: Boolean) {
val activity = AppStateManager.currentActivity()
if (activity == null) {
Log.d(TAG, "toggleOperatePanel --- activity is null, show: $show")
return
}
if (show) {
if (operatePanel.get()?.get()?.isShowing() == true) {
return
}
MoGoPopWindow.Builder()
.attachToActivity(activity)
.gravityInActivity(Gravity.START or Gravity.TOP)
.contentView(OperatePanelLayout(activity))
.width(AutoSizeUtils.dp2px(activity, 1000.0f))
.height(WindowManager.LayoutParams.MATCH_PARENT)
.transition(Slide(Gravity.START), Slide(Gravity.START))
.onDismissed {
operatePanel.set(null)
}
.build()
.also {
operatePanel.set(WeakReference(it))
}
.show()
} else {
operatePanel.get()?.get()?.hide()
}
}
} }

View File

@@ -0,0 +1,103 @@
package com.mogo.eagle.core.function.hmi.ui.operate
import android.content.Context
import android.os.Bundle
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
import android.widget.LinearLayout
import androidx.core.content.ContextCompat
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceHeaderFragmentCompat
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.kotlin.onClick
import kotlinx.android.synthetic.main.layout_operate_panel.view.iv_operate_panel_close
class OperatePanelLayout: LinearLayout {
companion object {
private const val TAG = "OperatePanelLayout"
}
class PreferenceHeaderFragmentCompatImpl: PreferenceHeaderFragmentCompat() {
override fun onCreatePreferenceHeader(): PreferenceFragmentCompat {
Log.d(TAG, "--- onCreatePreferenceHeader ---")
return PreferenceHeader()
}
}
class PreferenceHeader: PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
Log.d(TAG, "PreferenceHeader --- onCreatePreferences ---")
setPreferencesFromResource(R.xml.operate_preference_headers, rootKey)
}
}
class V2XPreferenceFragmentCompat: PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
Log.d(TAG, "V2XPreferenceFragmentCompat --- onCreatePreferences ---")
setPreferencesFromResource(R.xml.operate_preference_details_v2x, rootKey)
}
}
class DemoPreferenceFragmentCompat: PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
Log.d(TAG, "DemoPreferenceFragmentCompat --- onCreatePreferences ---")
setPreferencesFromResource(R.xml.operate_preference_details_demo, rootKey)
}
}
class HdMapPreferenceFragmentCompat: PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
Log.d(TAG, "HdMapPreferenceFragmentCompat --- onCreatePreferences ---")
setPreferencesFromResource(R.xml.operate_preference_details_hdmap, rootKey)
}
}
class BusinessPreferenceFragmentCompat: PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
Log.d(TAG, "BusinessPreferenceFragmentCompat --- onCreatePreferences ---")
setPreferencesFromResource(R.xml.operate_preference_details_business, rootKey)
}
}
class MoFangPreferenceFragmentCompat: PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
Log.d(TAG, "MoFangPreferenceFragmentCompat --- onCreatePreferences ---")
setPreferencesFromResource(R.xml.operate_preference_details_mofang, rootKey)
}
}
class VehiclesPreferenceFragmentCompat: PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
Log.d(TAG, "VehiclesPreferenceFragmentCompat --- onCreatePreferences ---")
setPreferencesFromResource(R.xml.operate_preference_details_vehicles, rootKey)
}
}
constructor(context: Context) : this(context, null)
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
orientation = VERTICAL
Log.d(TAG, "--- init ----")
LayoutInflater.from(context).inflate(R.layout.layout_operate_panel, this, true)
background = ContextCompat.getDrawable(context, R.drawable.bg_operate_panel)
iv_operate_panel_close?.onClick {
CallerHmiManager.toggleOperatePanel(false)
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
Log.d(TAG, "--- onAttachedToWindow ---")
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
Log.d(TAG, "--- onDetachedFromWindow ---")
}
}

View File

@@ -15,6 +15,7 @@ import com.mogo.eagle.core.function.angle.scenes.Default
import com.mogo.eagle.core.function.angle.scenes.LongSight import com.mogo.eagle.core.function.angle.scenes.LongSight
import com.mogo.eagle.core.function.api.map.angle.IMoGoVisualAngleChangeProvider import com.mogo.eagle.core.function.api.map.angle.IMoGoVisualAngleChangeProvider
import com.mogo.eagle.core.function.api.map.angle.Scene import com.mogo.eagle.core.function.api.map.angle.Scene
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager
import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.kotlin.scope import com.mogo.eagle.core.utilcode.kotlin.scope
@@ -84,6 +85,8 @@ class VisualAngleToggleView : FrameLayout, IMoGoVisualAngleChangeProvider.OnMoGo
override fun onAnimationEnd(animation: Animator, isReverse: Boolean) { override fun onAnimationEnd(animation: Animator, isReverse: Boolean) {
super.onAnimationEnd(animation, isReverse) super.onAnimationEnd(animation, isReverse)
iv_toggle_block?.isEnabled = true iv_toggle_block?.isEnabled = true
//TODO renwj
CallerHmiManager.toggleOperatePanel(false)
} }
}) })
animator.interpolator = AccelerateDecelerateInterpolator() animator.interpolator = AccelerateDecelerateInterpolator()
@@ -107,11 +110,12 @@ class VisualAngleToggleView : FrameLayout, IMoGoVisualAngleChangeProvider.OnMoGo
animator.addListener(object : AnimatorListenerAdapter() { animator.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationStart(animation: Animator, isReverse: Boolean) { override fun onAnimationStart(animation: Animator, isReverse: Boolean) {
CallerVisualAngleManager.changeScene(LongSight()) CallerVisualAngleManager.changeScene(LongSight())
} }
override fun onAnimationEnd(animation: Animator, isReverse: Boolean) { override fun onAnimationEnd(animation: Animator, isReverse: Boolean) {
iv_toggle_block?.isEnabled = true iv_toggle_block?.isEnabled = true
//TODO renwj
CallerHmiManager.toggleOperatePanel(true)
} }
}) })
animator.interpolator = AccelerateDecelerateInterpolator() animator.interpolator = AccelerateDecelerateInterpolator()

Binary file not shown.

After

Width:  |  Height:  |  Size: 640 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true">
<shape android:shape="rectangle">
<solid android:color="#1AFFFFFF" />
<corners android:radius="@dimen/dp_30" />
</shape>
</item>
<item android:drawable="@android:color/transparent" />
</selector>

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:background="@drawable/bg_operate_panel"
tools:layout_height="match_parent"
tools:layout_width="@dimen/dp_1000"
tools:orientation="vertical"
tools:parentTag="android.widget.LinearLayout">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dp_86"
android:layout_marginStart="@dimen/dp_60"
android:layout_marginTop="@dimen/dp_112"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="@drawable/icon_operate_panel_rect_blue"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_10"
android:layout_marginTop="@dimen/dp_10"
android:text="运营面板"
android:textColor="#ffffff"
android:textSize="@dimen/dp_42"
tools:ignore="HardcodedText,SpUsage" />
<Space
android:layout_width="0dip"
android:layout_height="@dimen/dp_1"
android:layout_gravity="center_vertical"
android:layout_weight="1" />
<ImageView
android:id="@+id/iv_operate_panel_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_8"
android:layout_marginEnd="@dimen/dp_90"
android:background="@drawable/icon_operate_panel_close"
tools:ignore="ContentDescription" />
</LinearLayout>
<androidx.fragment.app.FragmentContainerView
android:id="@+id/operate_panel"
android:name="com.mogo.eagle.core.function.hmi.ui.operate.OperatePanelLayout$PreferenceHeaderFragmentCompatImpl"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_marginStart="@dimen/dp_60"
android:layout_marginEnd="@dimen/dp_90"
android:layout_weight="1" />
</merge>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@android:id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#FF999999"
android:textSize="@dimen/dp_30"
android:paddingTop="@dimen/dp_30"
android:paddingStart="@dimen/dp_30"
tools:text="地图效果"
android:gravity="start" />

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/dp_30"
android:paddingEnd="@dimen/dp_30"
android:orientation="horizontal"
tools:background="#83000000">
<TextView
android:id="@android:id/title"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="wrap_content"
android:textSize="@dimen/dp_34"
android:layout_gravity="center_vertical"
android:textColor="#FFFFFF"
tools:text="V2X总开关"/>
<LinearLayout
android:id="@android:id/widget_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="vertical"/>
</LinearLayout>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@android:id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#FFFFFFFF"
android:textSize="@dimen/dp_40"
android:paddingTop="@dimen/dp_25"
android:paddingBottom="@dimen/dp_25"
android:paddingStart="@dimen/dp_30"
tools:text="地图效果"
android:gravity="start" />

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/dp_30"
android:paddingEnd="@dimen/dp_30"
android:orientation="horizontal"
tools:background="#83000000">
<TextView
android:id="@android:id/title"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="wrap_content"
android:textSize="@dimen/dp_34"
android:layout_gravity="center_vertical"
android:textColor="#FFFFFF"
tools:text="V2X总开关"/>
<LinearLayout
android:id="@android:id/widget_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="vertical"/>
</LinearLayout>

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/dp_30"
android:paddingEnd="@dimen/dp_30"
android:orientation="horizontal"
tools:background="#83000000">
<TextView
android:id="@android:id/title"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="wrap_content"
android:textSize="@dimen/dp_34"
android:layout_gravity="center_vertical"
android:textColor="#FFFFFF"
tools:text="V2X总开关"/>
<LinearLayout
android:id="@android:id/widget_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="vertical"/>
</LinearLayout>

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/dp_60"
android:paddingEnd="@dimen/dp_30"
android:orientation="horizontal"
tools:background="#83000000">
<TextView
android:id="@android:id/title"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="wrap_content"
android:textSize="@dimen/dp_34"
android:layout_gravity="center_vertical"
android:textColor="#FFFFFF"
tools:text="V2X总开关"/>
<LinearLayout
android:id="@android:id/widget_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="vertical"/>
</LinearLayout>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.AppCompatCheckBox
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:clickable="false" />

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.SwitchCompat xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:clickable="false" />

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.SwitchCompat xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:clickable="false" />

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.SwitchCompat xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:clickable="false" />

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.SwitchCompat xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:clickable="false" />

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/dp_30"
android:paddingEnd="@dimen/dp_30"
android:orientation="vertical"
tools:background="#83000000">
<TextView
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/dp_34"
android:layout_gravity="center_vertical"
android:textColor="#FFFFFF"
tools:text="V2X总开关"/>
<LinearLayout
android:id="@android:id/widget_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:visibility="gone"
android:orientation="vertical"/>
</LinearLayout>

View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:layout="@layout/layout_operate_panel_preference_category_title"
android:title="业务类">
<SwitchPreferenceCompat
android:key="red_or_green_light_marker"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="红绿灯标识"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<SwitchPreferenceCompat
android:key="red_or_green_light_merge_marker"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="红绿灯融合标识"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<SwitchPreferenceCompat
android:key="fault_report_tip"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="异常上报提示"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<SwitchPreferenceCompat
android:key="limit_speed_marker"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="限速标识"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<SwitchPreferenceCompat
android:key="self_routing_verify_mode"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="自主算路验证模式"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<SwitchPreferenceCompat
android:key="look_around_360"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="360环视"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<SwitchPreferenceCompat
android:key="weather_effect_switch"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="天气效果开关"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<SwitchPreferenceCompat
android:key="system_boot_status_show"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="系统启动状态展示"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<Preference
android:key="unmanned_demo_pull_interval"
android:layout="@layout/layout_operate_panel_preference_with_title_above"
android:title="无人化演练任务拉取时间间隔"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_radio_group_custom" />
</PreferenceCategory>
</androidx.preference.PreferenceScreen>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="美化模式" android:layout="@layout/layout_operate_panel_preference_category_title">
<SwitchPreferenceCompat
android:key="demo_switch"
android:title="美化模式"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
<SwitchPreferenceCompat
android:key="record_bag_dialog"
android:title="录包弹窗"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
<SwitchPreferenceCompat
android:key="take_over_wake"
android:title="接管提醒"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
</PreferenceCategory>
</androidx.preference.PreferenceScreen>

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="地图效果" android:layout="@layout/layout_operate_panel_preference_category_title">
<SwitchPreferenceCompat
android:key="danger_obstacles_color_mark"
android:title="危险障碍物颜色标记"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
<SwitchPreferenceCompat
android:key="route_guide_line_dynamic_effect"
android:title="引导线动态效果"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
<SwitchPreferenceCompat
android:key="point_cloud_effect"
android:title="点云效果"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
<SwitchPreferenceCompat
android:key="self_car_aperture"
android:title="自车光圈"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
</PreferenceCategory>
</androidx.preference.PreferenceScreen>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:layout="@layout/layout_operate_panel_preference_category_title"
android:title="蘑方">
<Preference
android:key="mofang_connect"
android:title="连接蘑方"
android:layout="@layout/layout_operate_panel_preference_mofang_connect"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_mofang_connect"/>
<SwitchPreferenceCompat
android:key="mofang_command_test"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="蘑方指令测试"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
</PreferenceCategory>
</androidx.preference.PreferenceScreen>

View File

@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="V2X" android:layout="@layout/layout_operate_panel_preference_category_title">
<SwitchPreferenceCompat
android:key="v2x_total_switch"
android:title="V2X总开关"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
<SwitchPreferenceCompat
android:key="v2n_total_switch"
android:title="V2N总开关"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
<SwitchPreferenceCompat
android:key="v2n_new_linked"
android:title="V2N新链路"
android:dependency="v2n_total_switch"
android:layout="@layout/layout_operate_panel_preference_switch_compat_dependee"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
<SwitchPreferenceCompat
android:key="v2n_new_linked_from_pnc"
android:title="V2N场景进PNC"
android:dependency="v2n_total_switch"
android:layout="@layout/layout_operate_panel_preference_switch_compat_dependee"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
<SwitchPreferenceCompat
android:key="v2n_new_linked_green_wave"
android:title="绿波通行"
android:dependency="v2n_total_switch"
android:layout="@layout/layout_operate_panel_preference_switch_compat_dependee"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
<SwitchPreferenceCompat
android:key="v2i_total_switch"
android:title="V2I总开关"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
<SwitchPreferenceCompat
android:key="v2i_from_pnc"
android:title="V2I场景进PNC"
android:dependency="v2i_total_switch"
android:layout="@layout/layout_operate_panel_preference_switch_compat_dependee"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
<SwitchPreferenceCompat
android:key="v2i_run_on_red_light"
android:title="闯红灯预警"
android:dependency="v2i_total_switch"
android:layout="@layout/layout_operate_panel_preference_switch_compat_dependee"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
<SwitchPreferenceCompat
android:key="v2i_weakness_participant"
android:title="路侧弱势交通参与者"
android:dependency="v2i_total_switch"
android:layout="@layout/layout_operate_panel_preference_switch_compat_dependee"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
<SwitchPreferenceCompat
android:key="v2v_total_switch"
android:title="V2V总开关"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
<SwitchPreferenceCompat
android:key="obu_total_switch"
android:title="OBU总开关"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat"/>
</PreferenceCategory>
</androidx.preference.PreferenceScreen>

View File

@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:layout="@layout/layout_operate_panel_preference_category_title"
android:title="车辆相关">
<SwitchPreferenceCompat
android:key="pnc_park_intersection_car"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="PNC-Park-会车"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<SwitchPreferenceCompat
android:key="pnc_park_overtake_car"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="PNC-Park-超车"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<SwitchPreferenceCompat
android:key="detour_retard_park"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="绕障减速停车"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<SwitchPreferenceCompat
android:key="rain_day"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="雨天模式"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<SwitchPreferenceCompat
android:key="fault_deceleration_park"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="故障减速停车"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<SwitchPreferenceCompat
android:key="weak_net_deceleration_park"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="弱网减速停车"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<SwitchPreferenceCompat
android:key="exam_function_panel"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="考试功能面板"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<CheckBoxPreference
android:key="all_merge_mode"
android:layout="@layout/layout_operate_panel_preference_checkbox_compat"
android:title="全融合模式"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_checkbox_compat" />
<CheckBoxPreference
android:key="blind_area_mode"
android:layout="@layout/layout_operate_panel_preference_checkbox_compat"
android:title="盲区模式"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_checkbox_compat" />
<CheckBoxPreference
android:key="beyond_visual_range_mode"
android:layout="@layout/layout_operate_panel_preference_checkbox_compat"
android:title="超视距模式"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_checkbox_compat" />
<CheckBoxPreference
android:key="transparent_transfer_mode"
android:layout="@layout/layout_operate_panel_preference_checkbox_compat"
android:title="超视距模式"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_checkbox_compat" />
<CheckBoxPreference
android:key="pure_obu_mode"
android:layout="@layout/layout_operate_panel_preference_checkbox_compat"
android:title="纯路侧模式"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_checkbox_compat" />
<Preference
android:key="auto_pilot_speed_thresholds"
android:layout="@layout/layout_operate_panel_preference_with_title_above"
android:title="自动驾驶速度阈值"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_edit_with_button" />
<Preference
android:key="change_lane_speed_thresholds"
android:title="变道速度阈值"
android:layout="@layout/layout_operate_panel_preference_with_title_above"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_edit_with_button" />
<Preference
android:key="overtake_speed_thresholds"
android:title="超车速度阈值"
android:layout="@layout/layout_operate_panel_preference_with_title_above"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_edit_with_button" />
</PreferenceCategory>
</androidx.preference.PreferenceScreen>

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<Preference
android:fragment="com.mogo.eagle.core.function.hmi.ui.operate.OperatePanelLayout$V2XPreferenceFragmentCompat"
android:key="v2x"
android:selectable="true"
android:layout="@layout/layout_operate_panel_preference_header"
android:title="V2X" />
<Preference
android:fragment="com.mogo.eagle.core.function.hmi.ui.operate.OperatePanelLayout$HdMapPreferenceFragmentCompat"
android:key="hdmap"
android:layout="@layout/layout_operate_panel_preference_header"
android:title="地图效果" />
<Preference
android:fragment="com.mogo.eagle.core.function.hmi.ui.operate.OperatePanelLayout$DemoPreferenceFragmentCompat"
android:key="demo"
android:layout="@layout/layout_operate_panel_preference_header"
android:title="美化模式" />
<Preference
android:fragment="com.mogo.eagle.core.function.hmi.ui.operate.OperatePanelLayout$VehiclesPreferenceFragmentCompat"
android:key="vehicle"
android:layout="@layout/layout_operate_panel_preference_header"
android:title="车辆相关" />
<Preference
android:fragment="com.mogo.eagle.core.function.hmi.ui.operate.OperatePanelLayout$BusinessPreferenceFragmentCompat"
android:key="biz"
android:layout="@layout/layout_operate_panel_preference_header"
android:title="业务类" />
<Preference
android:fragment="com.mogo.eagle.core.function.hmi.ui.operate.OperatePanelLayout$MoFangPreferenceFragmentCompat"
android:key="mofang"
android:layout="@layout/layout_operate_panel_preference_header"
android:title="蘑方" />
</androidx.preference.PreferenceScreen>

View File

@@ -246,4 +246,9 @@ interface IMoGoHmiProvider :IProvider{
* 注册 工具箱 item点击事件监听 (默认样式item的点击事件监听自定义样式的item的点击交给view自己处理) * 注册 工具箱 item点击事件监听 (默认样式item的点击事件监听自定义样式的item的点击交给view自己处理)
*/ */
fun registerToolKitDefaultItemClickListener( tag: String, listener: IToolKitItemClickListener) fun registerToolKitDefaultItemClickListener( tag: String, listener: IToolKitItemClickListener)
/**
* 显示/隐藏 运营面板
*/
fun toggleOperatePanel(show: Boolean)
} }

View File

@@ -360,4 +360,11 @@ object CallerHmiManager {
fun registerToolKitDefaultItemClickListener(tag: String, listener: IToolKitItemClickListener) { fun registerToolKitDefaultItemClickListener(tag: String, listener: IToolKitItemClickListener) {
hmiProviderApi?.registerToolKitDefaultItemClickListener(tag, listener) hmiProviderApi?.registerToolKitDefaultItemClickListener(tag, listener)
} }
/**
* 显示/隐藏 运营面板
*/
fun toggleOperatePanel(show: Boolean) {
hmiProviderApi?.toggleOperatePanel(show)
}
} }

View File

@@ -4,6 +4,7 @@ import android.annotation.*
import android.app.Activity import android.app.Activity
import android.graphics.Rect import android.graphics.Rect
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.transition.Transition
import android.util.Log import android.util.Log
import android.view.Gravity import android.view.Gravity
import android.view.LayoutInflater import android.view.LayoutInflater
@@ -50,6 +51,10 @@ class MoGoPopWindow private constructor(builder: Builder){
private val onViewAttachedToWindow: ((content: View) -> Unit)? = builder.onViewAttachedToWindow private val onViewAttachedToWindow: ((content: View) -> Unit)? = builder.onViewAttachedToWindow
private val enterTransition: Transition? = builder.enterTransition
private val exitTransition: Transition? = builder.exitTransition
@SuppressLint("ClickableViewAccessibility") fun show() { @SuppressLint("ClickableViewAccessibility") fun show() {
if (isPendingShow.get() || pop.isShowing) { if (isPendingShow.get() || pop.isShowing) {
return return
@@ -58,12 +63,18 @@ class MoGoPopWindow private constructor(builder: Builder){
activity.lifeCycleScope.launchWhenResumed { activity.lifeCycleScope.launchWhenResumed {
val parent = activity.findViewById<View>(android.R.id.content) ?: throw AssertionError("附着的Activity上的ID为[android.R.id.content]的控件不存在.") val parent = activity.findViewById<View>(android.R.id.content) ?: throw AssertionError("附着的Activity上的ID为[android.R.id.content]的控件不存在.")
pop.contentView = content pop.contentView = content
pop.isAttachedInDecor = true pop.isAttachedInDecor = false
pop.setBackgroundDrawable(ColorDrawable()) pop.setBackgroundDrawable(ColorDrawable())
content.doOnAttach { content.doOnAttach {
onViewAttachedToWindow?.invoke(content) onViewAttachedToWindow?.invoke(content)
onShowed?.invoke() onShowed?.invoke()
} }
if (enterTransition != null) {
pop.enterTransition = enterTransition
}
if (exitTransition != null) {
pop.exitTransition = exitTransition
}
pop.setOnDismissListener { pop.setOnDismissListener {
onDismissed?.invoke() onDismissed?.invoke()
} }
@@ -113,17 +124,11 @@ class MoGoPopWindow private constructor(builder: Builder){
val oldX = params.x val oldX = params.x
val oldY = params.y val oldY = params.y
Logger.d(TAG, "oldX: $oldX, oldY: $oldY, dx: $dx, dy:$dy") Logger.d(TAG, "oldX: $oldX, oldY: $oldY, dx: $dx, dy:$dy")
var newX = oldX + dx val newX = oldX + dx
var newY = oldY + dy val newY = oldY + dy
if (outer.contains(rawX.toInt(), rawY.toInt())) { if (outer.contains(rawX.toInt(), rawY.toInt())) {
val width = activity.resources.displayMetrics.widthPixels val width = activity.resources.displayMetrics.widthPixels
val height = activity.resources.displayMetrics.heightPixels val height = activity.resources.displayMetrics.heightPixels
// if (newX < 0) {
// newX += newX
// }
// if (newY < 0) {
// newY += height
// }
Logger.d(TAG, "screen_width: $width, screen_height: $height, newX: $newX, newY: $newY, rawX: ${rawX.toInt()}, rawY: ${rawY.toInt()}, width: ${content.width}, height: ${content.height}") Logger.d(TAG, "screen_width: $width, screen_height: $height, newX: $newX, newY: $newY, rawX: ${rawX.toInt()}, rawY: ${rawY.toInt()}, width: ${content.width}, height: ${content.height}")
pop.update(newX, newY, content.width, content.height) pop.update(newX, newY, content.width, content.height)
} }
@@ -244,6 +249,16 @@ class MoGoPopWindow private constructor(builder: Builder){
*/ */
internal var onViewAttachedToWindow: ((content: View) -> Unit)? = null internal var onViewAttachedToWindow: ((content: View) -> Unit)? = null
/**
* 进场动画
*/
internal var enterTransition: Transition? = null
/**
* 出场动画
*/
internal var exitTransition: Transition? = null
fun contentView(content: View) = apply { fun contentView(content: View) = apply {
this.content = content this.content = content
} }
@@ -296,6 +311,11 @@ class MoGoPopWindow private constructor(builder: Builder){
this.onDismissed = block this.onDismissed = block
} }
fun transition(enter: Transition?, exit: Transition?) = apply {
this.enterTransition = enter
this.exitTransition = exit
}
fun onViewAttachedToWindow(block: (content: View) -> Unit) = apply { fun onViewAttachedToWindow(block: (content: View) -> Unit) = apply {
this.onViewAttachedToWindow = block this.onViewAttachedToWindow = block
} }