[6.7.0][状态栏改版] 优化代码逻辑

This commit is contained in:
renwj
2024-09-26 17:14:05 +08:00
parent 87aab03e36
commit 0b2aa64741
10 changed files with 271 additions and 72 deletions

View File

@@ -17,8 +17,8 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.Group;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentTransaction;
import com.mogo.commons.mvp.IView;
@@ -29,7 +29,6 @@ import com.mogo.eagle.core.function.api.och.toolkit.IToolKitItemClickListener;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager;
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager;
import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchManager;
import com.mogo.eagle.core.function.hmi.map.MapContainerLayout;
import com.mogo.eagle.core.function.view.MapRoamView;
@@ -46,9 +45,6 @@ import com.mogo.och.taxi.R;
import java.lang.ref.WeakReference;
import me.jessyan.autosize.utils.AutoSizeUtils;
/**
* 网约车基础Fragment主要负责布局通用界面处理站点面板和通话面板互斥情况
* <p>
@@ -56,7 +52,7 @@ import me.jessyan.autosize.utils.AutoSizeUtils;
*
* @author tongchenfei
*/
public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V>> extends MvpFragment<V, P> implements IMogoMapListener{
public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V>> extends MvpFragment<V, P> implements IMogoMapListener {
private static final String TAG = "BaseOchFragment";
private RelativeLayout ctvAutopilotStatusRL;
@@ -66,7 +62,7 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
private FrameLayout flNaviPanelContainer;
private MapRoamView mapRoamView;
private Group groupTestPanel;
// private FrameLayout mSpeedView;
// private FrameLayout mSpeedView;
private ImageView mAutopilotImage;
private TextView mAutopilotTv;
private ImageView mCloseNaviIcon;
@@ -75,7 +71,7 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
protected TaxiAmapNaviFragment ochAmapNaviFragment = null;
protected TaxiRottingNaviFragment taxiRottingNaviFragment = null;
// protected AppCompatImageView acivShowGuid;
// protected AppCompatImageView acivShowGuid;
private MapContainerLayout mapContainerLayout;
private OverMapDialog overMapDialog;
private final Handler mHandler = new Handler(Looper.getMainLooper());
@@ -147,24 +143,24 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
// 模拟 不可自动驾驶目前场景是刚开机adas还未和工控机连接
findViewById(R.id.btnAutopilotDisable).setOnClickListener(view ->
onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE,true)
onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE, true)
);
// 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态
findViewById(R.id.btnAutopilotEnable).setOnClickListener(view ->
onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE,true)
onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE, true)
);
// 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人
findViewById(R.id.btnAutopilotRunning).setOnClickListener(view ->
onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING,true)
onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING, true)
);
findViewById(R.id.btnAutopilotmanco).setOnClickListener(view ->
onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING,true));
onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING, true));
tvOperationStatus.setOnClickListener(new OnPreventFastClickListener() {
@Override
@@ -190,16 +186,19 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
// }
// });
if(getContext()!=null){
CallerEagleBaseFunctionCall4OchManager.INSTANCE.addSingleToolKitDefaultItem(runningTaskGateWay,"运营面板", R.drawable.common_biz_operation,4);
CallerEagleBaseFunctionCall4OchManager.INSTANCE.addToolKitDefaultItemClickListener(runningTaskGateWay,new IToolKitItemClickListener() {
if (getContext() != null) {
CallerEagleBaseFunctionCall4OchManager.INSTANCE.addSingleToolKitDefaultItem(runningTaskGateWay, "运营面板", R.drawable.common_biz_operation, 4);
CallerEagleBaseFunctionCall4OchManager.INSTANCE.addToolKitDefaultItemClickListener(runningTaskGateWay, new IToolKitItemClickListener() {
@Override
public void onItemClick(@NonNull String toolTag, @Nullable Context ctx) {
personalDialogFragment = new WeakReference<>(new TaxiPersonalDialogFragment());
personalDialogFragment.get().show(getActivity().getSupportFragmentManager(), "service_data");
FragmentActivity activity = getActivity();
if (activity != null) {
personalDialogFragment.get().show(activity.getSupportFragmentManager(), "service_data");
}
}
});
CallerEagleBaseFunctionCall4OchManager.INSTANCE.addSingleToolKitCustomItem(lineView, new LineView(getContext()),10);
CallerEagleBaseFunctionCall4OchManager.INSTANCE.addSingleToolKitCustomItem(lineView, new LineView(getContext()), 10);
}
}
@@ -245,7 +244,7 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
public void onDestroyView() {
mapContainerLayout.onDestroy();
mapRoamView.onDestroy();
if(overMapDialog!=null) {
if (overMapDialog != null) {
overMapDialog.hideDialog();
overMapDialog.destory();
overMapDialog = null;
@@ -272,7 +271,7 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
super.onDestroy();
}
public void onAutopilotStatusChanged(int status,boolean canStart) {
public void onAutopilotStatusChanged(int status, boolean canStart) {
UiThreadHandler.post(new Runnable() {
@Override
public void run() {
@@ -287,9 +286,9 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
}
// 3. 其他过程直接更新
startOrStopLoadingAnim(false);
autopilotStatusAnimchanged(status,canStart);
autopilotStatusAnimchanged(status, canStart);
}
},UiThreadHandler.MODE.QUEUE);
}, UiThreadHandler.MODE.QUEUE);
}
public void stopAnimAndUpdateBtnStatus() {
@@ -297,8 +296,8 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
startAutopilotDone(false);
}
public void onManMachineCoDriving(int manMachineCoDriving,boolean canStartAuto) {
autopilotStatusAnimchanged(manMachineCoDriving,canStartAuto);
public void onManMachineCoDriving(int manMachineCoDriving, boolean canStartAuto) {
autopilotStatusAnimchanged(manMachineCoDriving, canStartAuto);
}
public void updateCtvAutopilotStatusTag(boolean tag) {
@@ -312,7 +311,7 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
protected abstract void updateOrderBottomBtnUI();
public void autopilotStatusAnimchanged(int status,boolean canStart) {
public void autopilotStatusAnimchanged(int status, boolean canStart) {
if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == status) {
mAutopilotTv.setText("自动驾驶");
mAutopilotTv.setTextColor(ResourcesUtils.getColor(R.color.taxi_autopilot_text_color_normal));
@@ -320,11 +319,11 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
ctvAutopilotStatusRL.setBackgroundResource(R.drawable.common_autopilot_in_autopilot);
} else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == status) {
mAutopilotTv.setText("自动驾驶");
if(canStart){
if (canStart) {
mAutopilotTv.setTextColor(ResourcesUtils.getColor(R.color.taxi_autopilot_text_color_normal));
mAutopilotImage.setImageResource(R.drawable.taxi_ic_autopilot);
ctvAutopilotStatusRL.setBackgroundResource(R.drawable.common_autopilot_press);
}else {
} else {
mAutopilotTv.setTextColor(ResourcesUtils.getColor(R.color.taxi_autopilot_text_color_disable));
mAutopilotImage.setImageResource(R.drawable.taxi_ic_autopilot_disable);
ctvAutopilotStatusRL.setBackgroundResource(R.drawable.common_autopilot_press);
@@ -345,7 +344,7 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
}
private void startAutopilotDone(boolean success) {
if(mAutopilotImage==null){
if (mAutopilotImage == null) {
return;
}
if (autopilotLoadingAnimator != null) {
@@ -366,7 +365,7 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
@Override
public void run() {
startOrStopLoadingAnim(false);
onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getState(),CallerAutoPilotControlManager.INSTANCE.isCanStartAutopilot(false, 0));
onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getState(), CallerAutoPilotControlManager.INSTANCE.isCanStartAutopilot(false, 0));
}
}, 1000L);
}
@@ -424,7 +423,7 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
UiThreadHandler.post(new Runnable() {
@Override
public void run() {
if(flStationPanelContainer!=null) {
if (flStationPanelContainer != null) {
flStationPanelContainer.setVisibility(View.GONE);
// ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) visualViewDirver.getLayoutParams();
// layoutParams.startToStart = ConstraintLayout.LayoutParams.PARENT_ID;
@@ -435,14 +434,14 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
// visualViewDirver.setLayoutParams(layoutParams);
}
}
},UiThreadHandler.MODE.QUEUE);
}, UiThreadHandler.MODE.QUEUE);
}
public void showPanel() {
UiThreadHandler.post(new Runnable() {
@Override
public void run() {
if(flStationPanelContainer!=null) {
if (flStationPanelContainer != null) {
flStationPanelContainer.setVisibility(View.VISIBLE);
// ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) visualViewDirver.getLayoutParams();
// layoutParams.startToStart = ConstraintLayout.LayoutParams.PARENT_ID;
@@ -453,7 +452,7 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
// visualViewDirver.setLayoutParams(layoutParams);
}
}
},UiThreadHandler.MODE.QUEUE);
}, UiThreadHandler.MODE.QUEUE);
}
/**
@@ -478,7 +477,7 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
}
tvOperationStatus.setVisibility(visible);
}
},UiThreadHandler.MODE.QUEUE);
}, UiThreadHandler.MODE.QUEUE);
}
protected void showAmapNaviToStationFragment(boolean isShow) {
@@ -549,7 +548,8 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
public void setGuidShow() {
// acivShowGuid.setVisibility(View.VISIBLE);
}
public void setGuidHide(){
public void setGuidHide() {
// acivShowGuid.setVisibility(View.GONE);
}
}

View File

@@ -8,7 +8,7 @@ apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
//apply from: rootProject.file('gradle/bytex/bytex.gradle')
apply from: rootProject.file('gradle/bytex/bytex.gradle')
Properties properties = new Properties()
properties.load(project.rootProject.file("gradle.properties").newDataInputStream())

View File

@@ -10,6 +10,7 @@ import android.view.ViewGroup
import android.widget.LinearLayout
import androidx.annotation.CallSuper
import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceGroup
@@ -22,11 +23,14 @@ import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.config.HmiBuildConfig
import com.mogo.eagle.core.data.multidisplay.TelematicConstant
import com.mogo.eagle.core.data.obu.MogoObuConst
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener
import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangProvider
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_DEMO
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_RAIN
import com.mogo.eagle.core.function.api.setting.ISopSettingListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
@@ -35,20 +39,26 @@ import com.mogo.eagle.core.function.call.obu.CallerObuApiManager
import com.mogo.eagle.core.function.call.setting.CallerSopSettingManager
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager
import com.mogo.eagle.core.function.call.unmanned.CallerUnmannedListenerManager
import com.mogo.eagle.core.function.call.vehicle.CallerSweeperModeListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.operate.preferences.PreferenceWithMoFang
import com.mogo.eagle.core.function.hmi.ui.operate.preferences.PreferenceWithSpeedSetting
import com.mogo.eagle.core.function.hmi.ui.operate.preferences.PreferenceWithUnmanInterval
import com.mogo.eagle.core.function.hmi.ui.operate.preferences.PreferenceWithWelcomeWords
import com.mogo.eagle.core.function.hmi.ui.tools.SweeperModeChangedConfirmDialog
import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog.Companion.hmiAction
import com.mogo.eagle.core.function.hmi.ui.utils.SOPAnalyticsManager.clickEventAnalytics
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.vehicle.SweeperVehicleConfigUtils
import com.mogo.eagle.core.utilcode.rv.divider.CommonDividerItemDecoration
import com.mogo.eagle.core.utilcode.util.AppStateManager
import com.mogo.eagle.core.utilcode.util.ToastUtils
import kotlinx.android.synthetic.main.layout_operate_panel.view.iv_operate_panel_close
import kotlinx.coroutines.launch
import me.jessyan.autosize.utils.AutoSizeUtils
import mogo.telematics.pad.MessagePad
class OperatePanelLayout : LinearLayout {
@@ -397,14 +407,35 @@ class OperatePanelLayout : LinearLayout {
}
}
class DemoPreferenceFragmentCompat : OperatePanelDetailBase() {
class DemoPreferenceFragmentCompat : OperatePanelDetailBase(), IViewControlListener {
companion object {
private const val TAG = "DemoPreferenceFragmentCompat"
private const val KEY_DEMO_SWITCH = "demo_switch"
private const val KEY_RECORD_BAG_DIALOG = "record_bag_dialog"
private const val KEY_TAKE_OVER_WAKE = "take_over_wake"
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
CallerHmiViewControlListenerManager.addListener(TAG, this)
}
override fun updateFuncMode(tag: String, checked: Boolean) {
super.updateFuncMode(tag, checked)
if (tag == FUNC_MODE_DEMO) {
preferenceScreen.findPreferenceReal<SwitchPreferenceCompat>(KEY_DEMO_SWITCH)?.also {
it.extras.putBoolean("is_pressed", false)
changeValue(it, checked)
}
}
}
override fun onDestroyView() {
super.onDestroyView()
CallerHmiViewControlListenerManager.removeListener(TAG)
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.operate_panel_preference_details_demo, rootKey)
}
@@ -427,13 +458,17 @@ class OperatePanelLayout : LinearLayout {
override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean {
when (preference.key) {
KEY_DEMO_SWITCH -> {
val isPressed = preference.extras.getBoolean("is_pressed", true)
if (!isPressed) {
preference.extras.remove("is_pressed")
return true
}
val isChecked = newValue as? Boolean ?: false
hmiAction("SOP 演示模式开关, ", !FunctionBuildConfig.isDemoMode)
clickEventAnalytics("美化模式", isChecked)
FunctionBuildConfig.isDemoMode = !FunctionBuildConfig.isDemoMode
CallerAutoPilotControlManager.setDemoMode(FunctionBuildConfig.isDemoMode)
CallerHmiViewControlListenerManager.invokeFuncMode(FUNC_MODE_DEMO, FunctionBuildConfig.isDemoMode)
CallerSopSettingManager.invokeDemoModeListener(isChecked)
if (!FunctionBuildConfig.isDemoMode) { //关闭美化模式时,通知工控机
CallerAutoPilotControlManager.setIPCDemoMode(FunctionBuildConfig.isDemoMode)
}
@@ -455,14 +490,35 @@ class OperatePanelLayout : LinearLayout {
}
}
class HdMapPreferenceFragmentCompat : OperatePanelDetailBase() {
class HdMapPreferenceFragmentCompat : OperatePanelDetailBase(), ISopSettingListener {
companion object {
private const val TAG = "HdMapPreferenceFragmentCompat"
private const val KEY_DANGER_OBSTACLES_COLOR_MARK = "danger_obstacles_color_mark"
private const val KEY_ROUTE_GUIDE_LINE_DYNAMIC_EFFECT = "route_guide_line_dynamic_effect"
private const val KEY_POINT_CLOUD_EFFECT = "point_cloud_effect"
private const val KEY_SELF_CAR_APERTURE = "self_car_aperture"
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
CallerSopSettingManager.addListener(TAG, this)
}
override fun onDestroyView() {
super.onDestroyView()
CallerSopSettingManager.removeListener(TAG)
}
override fun onPointCloudClickEvent(status: Boolean) {
super.onPointCloudClickEvent(status)
preferenceScreen.findPreferenceReal<SwitchPreferenceCompat>(KEY_POINT_CLOUD_EFFECT)?.also { changeValue(it, status) }
}
override fun onCarApertureClickEvent(status: Boolean) {
super.onCarApertureClickEvent(status)
preferenceScreen.findPreferenceReal<SwitchPreferenceCompat>(KEY_SELF_CAR_APERTURE)?.also { changeValue(it, status) }
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.operate_panel_preference_details_hdmap, rootKey)
}
@@ -539,11 +595,12 @@ class OperatePanelLayout : LinearLayout {
private const val KEY_RED_OR_GREEN_LIGHT_MERGE_MARKER = "red_or_green_light_merge_marker"
private const val KEY_FAULT_REPORT_TIP = "fault_report_tip"
private const val KEY_LIMIT_SPEED_MARKER = "limit_speed_marker"
private const val KEY_SELF_ROUTING_VERIFY_MODE = "self_routing_verify_mode"
private const val KEY_LOOK_AROUND_360 = "look_around_360"
private const val KEY_WEATHER_EFFECT_SWITCH = "weather_effect_switch"
private const val KEY_SYSTEM_BOOT_STATUS_SHOW = "system_boot_status_show"
private const val KEY_SELF_ROUTING_VERIFY_MODE = "self_routing_verify_mode"
private const val KEY_UNMANNED_DEMO_PULL_INTERVAL = "unmanned_demo_pull_interval"
private const val KEY_SWEEPER_CLOUD_CONTROL = "sweeper_cloud_control"
private const val KEY_LOOK_AROUND_360 = "look_around_360"
}
override fun getDefaultVal(pref: Preference): Any? {
@@ -575,6 +632,16 @@ class OperatePanelLayout : LinearLayout {
KEY_UNMANNED_DEMO_PULL_INTERVAL -> {
return CallerUnmannedListenerManager.getVirtualTaskPullTaskIntervalF()
}
KEY_SWEEPER_CLOUD_CONTROL -> {
if (!isEnabled(pref)) {
return false
}
return if (SweeperVehicleConfigUtils.isSPExistCurrentSweeperModeConfig()) {
SweeperVehicleConfigUtils.isSPCurrentSweeperCloudMode()
} else {
SweeperVehicleConfigUtils.isDefaultSweeperCloudMode(FunctionBuildConfig.sweeperDefaultMode)
}
}
}
return super.getDefaultVal(pref)
}
@@ -590,6 +657,9 @@ class OperatePanelLayout : LinearLayout {
KEY_WEATHER_EFFECT_SWITCH -> {
AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)
}
KEY_SWEEPER_CLOUD_CONTROL -> {
return AppIdentityModeUtils.isSweeper(FunctionBuildConfig.appIdentityMode) && (SweeperVehicleConfigUtils.isDefaultSweeperCanSwitchMode(FunctionBuildConfig.sweeperCanSwitchMode))
}
else -> super.isEnabled(pref)
}
}
@@ -606,7 +676,7 @@ class OperatePanelLayout : LinearLayout {
PreferenceWithUnmanInterval.Interval.FORTY_FIVE_SECOND -> CallerUnmannedListenerManager.dispatchVirtualTaskPullTaskInterval(45)
PreferenceWithUnmanInterval.Interval.NEVER -> CallerUnmannedListenerManager.dispatchVirtualTaskPullTaskInterval(-1)
}
clickEventAnalytics("Taxi无人化演练任务拉取时间间隔",true)
clickEventAnalytics("Taxi无人化演练任务拉取时间间隔", true)
}
}
return super.onPreferenceClick(preference)
@@ -701,6 +771,27 @@ class OperatePanelLayout : LinearLayout {
HmiBuildConfig.isShowConnectionProgressView = isChecked
CallerHmiViewControlListenerManager.updateConnectionProgressView(isChecked)
}
KEY_SWEEPER_CLOUD_CONTROL -> {
val isChecked = newValue as? Boolean ?: false
val activity = AppStateManager.currentActivity()
if (activity != null) {
val confirmDialog = SweeperModeChangedConfirmDialog(activity)
confirmDialog.setClickListener(object: SweeperModeChangedConfirmDialog.ClickListener {
override fun confirm() {
CallerSweeperModeListenerManager.invokeSweeperModeListeners(
if (isChecked) SweeperVehicleConfigUtils.BUSINESS_MODE_CLOUD
else SweeperVehicleConfigUtils.BUSINESS_MODE_OPERATE
)
}
override fun cancel() {
preferenceScreen.findPreferenceReal<SwitchPreferenceCompat>(KEY_WEATHER_EFFECT_SWITCH)?.also { changeValue(it, !isChecked) }
}
})
confirmDialog.showSweeperModeChangeConfirmDialog()
}
clickEventAnalytics("清扫云控业务",isChecked)
}
}
return super.onPreferenceChange(preference, newValue)
}
@@ -788,8 +879,9 @@ class OperatePanelLayout : LinearLayout {
}
}
class VehiclesPreferenceFragmentCompat : OperatePanelDetailBase() {
class VehiclesPreferenceFragmentCompat : OperatePanelDetailBase(), IMoGoAutopilotCarConfigListener, ISopSettingListener, IViewControlListener {
companion object {
private const val TAG = "VehiclesPreferenceFragmentCompat"
private const val KEY_PNC_PARK_INTERSECTION_CAR = "pnc_park_intersection_car"
private const val KEY_PNC_PARK_OVERTAKE_CAR = "pnc_park_overtake_car"
private const val KEY_DETOUR_RETARD_PARK = "detour_retard_park"
@@ -807,10 +899,52 @@ class OperatePanelLayout : LinearLayout {
private const val KEY_OVERTAKE_SPEED_THRESHOLDSS = "overtake_speed_thresholds"
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
CallerAutopilotCarConfigListenerManager.addListener(TAG, this)
CallerSopSettingManager.addListener(TAG, this)
CallerHmiViewControlListenerManager.addListener(TAG, this)
return super.onCreateView(inflater, container, savedInstanceState)
}
override fun updateFuncMode(tag: String, checked: Boolean) {
super.updateFuncMode(tag, checked)
if (tag == FUNC_MODE_RAIN) {
preferenceScreen.findPreferenceReal<SwitchPreferenceCompat>(KEY_RAIN_DAY)?.also {
it.extras.putBoolean("is_pressed", false)
changeValue(it, checked)
}
}
}
override fun onDestroyView() {
CallerAutopilotCarConfigListenerManager.removeListener(TAG)
CallerSopSettingManager.removeListener(TAG)
CallerHmiViewControlListenerManager.removeListener(TAG)
super.onDestroyView()
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.operate_panel_preference_details_vehicles, rootKey)
}
override fun onExamControlClickEvent(status: Boolean) {
super.onExamControlClickEvent(status)
preferenceScreen.findPreferenceReal<SwitchPreferenceCompat>(KEY_EXAM_FUNCTION_PANEL)?.also { changeValue(it, status) }
}
override fun onRainModeClickEvent(status: Boolean) {
super.onRainModeClickEvent(status)
preferenceScreen.findPreferenceReal<SwitchPreferenceCompat>(KEY_RAIN_DAY)?.also { changeValue(it, status) }
}
override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) {
super.onAutopilotCarConfig(carConfigResp)
lifecycleScope.launch {
val max = carConfigResp.speedLimit * 3.6
preferenceScreen.findPreferenceReal<PreferenceWithSpeedSetting>(KEY_AUTO_PILOT_SPEED_THRESHOLDS)?.update(listOf("0", "$max", "$max", "5"))
}
}
override fun isEnabled(pref: Preference): Boolean {
when (pref.key) {
KEY_AUTO_PILOT_SPEED_THRESHOLDS, KEY_OVERTAKE_SPEED_THRESHOLDSS -> {
@@ -855,13 +989,14 @@ class OperatePanelLayout : LinearLayout {
KEY_PURE_OBU_MODE -> {
return FunctionBuildConfig.fusionMode == 5
}
KEY_AUTO_PILOT_SPEED_THRESHOLDS -> {
return listOf("0.0", "${FunctionBuildConfig.maxSpeedLimit}", "${FunctionBuildConfig.maxSpeedLimit}", "5.0")
}
KEY_CHANGE_LANE_SPEED_THRESHOLDS -> {
return setOf("3.0", "7.0", "${FunctionBuildConfig.detouringSpeed}", "0.5")
return listOf("3.0", "7.0", "${FunctionBuildConfig.detouringSpeed}", "0.5")
}
KEY_OVERTAKE_SPEED_THRESHOLDSS -> {
return setOf("3.0", "12.5", "${FunctionBuildConfig.overTakeSpeed}", "0.5")
}
KEY_AUTO_PILOT_SPEED_THRESHOLDS -> { //TODO renwj 自动驾驶速度阈值,旧版本没有看到
return listOf("3.0", "12.5", "${FunctionBuildConfig.overTakeSpeed}", "0.5")
}
}
return super.getDefaultVal(pref)
@@ -871,7 +1006,20 @@ class OperatePanelLayout : LinearLayout {
Log.d(TAG, "-- onPreferenceClick --:pref -> $preference")
when (preference.key) {
KEY_AUTO_PILOT_SPEED_THRESHOLDS -> {
FunctionBuildConfig.detouringSpeed = preference.extras.getFloat(PreferenceWithSpeedSetting.KEY_BUNDLE_CURRENT_VALUE, FunctionBuildConfig.detouringSpeed.toFloat()).toInt()
FunctionBuildConfig.maxSpeedLimit = preference.extras.getDouble(PreferenceWithSpeedSetting.KEY_BUNDLE_CURRENT_VALUE, FunctionBuildConfig.maxSpeedLimit)
val isSuccess = CallerAutoPilotControlManager.setAutoPilotSpeed(FunctionBuildConfig.maxSpeedLimit.toInt())
when {
isSuccess -> {
ToastUtils.showShort("车速设置成功,立即生效")
}
else -> {
ToastUtils.showShort("设置车速失败,请启动域控制器")
}
}
return true
}
KEY_CHANGE_LANE_SPEED_THRESHOLDS -> {
FunctionBuildConfig.detouringSpeed = preference.extras.getDouble(PreferenceWithSpeedSetting.KEY_BUNDLE_CURRENT_VALUE, FunctionBuildConfig.detouringSpeed.toDouble()).toInt()
hmiAction("SOP 变道绕障的目标障碍物速度阈值", FunctionBuildConfig.detouringSpeed)
val isSuccess = CallerAutoPilotControlManager.sendDetouringSpeed(FunctionBuildConfig.detouringSpeed.toDouble())
if (isSuccess == true) {
@@ -882,9 +1030,10 @@ class OperatePanelLayout : LinearLayout {
hmiAction("SOP 变道绕障的目标障碍物速度阈值设置", "失败")
}
clickEventAnalytics("变道速度阈值", true)
return true
}
KEY_OVERTAKE_SPEED_THRESHOLDSS -> {
FunctionBuildConfig.overTakeSpeed = preference.extras.getFloat(PreferenceWithSpeedSetting.KEY_BUNDLE_CURRENT_VALUE, FunctionBuildConfig.overTakeSpeed)
FunctionBuildConfig.overTakeSpeed = preference.extras.getDouble(PreferenceWithSpeedSetting.KEY_BUNDLE_CURRENT_VALUE, FunctionBuildConfig.overTakeSpeed.toDouble()).toFloat()
val isSuccess = CallerAutoPilotControlManager.sendOvertakeMaxSpeed(FunctionBuildConfig.overTakeSpeed.toDouble())
if (isSuccess == true) {
ToastUtils.showShort("SOP 超车目标障碍物速度阈值设置成功")
@@ -894,6 +1043,7 @@ class OperatePanelLayout : LinearLayout {
hmiAction("SOP 超车目标障碍物速度阈值设置", "失败")
}
clickEventAnalytics("超车速度阈值", true)
return true
}
}
return super.onPreferenceClick(preference)
@@ -906,12 +1056,14 @@ class OperatePanelLayout : LinearLayout {
hmiAction("SOP PNC-park-会车, ", isChecked)
CallerAutoPilotControlManager.sendParkVehCross(isChecked)
FunctionBuildConfig.isOpenParkVehCross = isChecked
return true
}
KEY_PNC_PARK_OVERTAKE_CAR -> {
val isChecked = newValue as? Boolean ?: false
hmiAction("SOP PNC-park-超车, ", isChecked)
CallerAutoPilotControlManager.sendParkVehOvertake(isChecked)
FunctionBuildConfig.isOpenOvertake = isChecked
return true
}
KEY_DETOUR_RETARD_PARK -> {
val isChecked = newValue as? Boolean ?: false
@@ -919,8 +1071,14 @@ class OperatePanelLayout : LinearLayout {
CallerAutoPilotControlManager.sendDetouring(isChecked)
FunctionBuildConfig.isDetouring = isChecked
clickEventAnalytics("绕障类功能", isChecked)
return true
}
KEY_RAIN_DAY -> {
val isPressed = preference.extras.getBoolean("is_pressed", true)
if (!isPressed) {
preference.extras.remove("is_pressed")
return true
}
val isChecked = newValue as? Boolean ?: false
hmiAction("SOP 雨天模式开关, ", isChecked)
clickEventAnalytics("雨天模式", isChecked)
@@ -928,6 +1086,7 @@ class OperatePanelLayout : LinearLayout {
CallerAutoPilotControlManager.setRainMode(isChecked)
CallerHmiViewControlListenerManager.invokeFuncMode(FUNC_MODE_RAIN, isChecked)
CallerSopSettingManager.invokeRainModeListener(isChecked)
return true
}
KEY_WEAK_NET_DECELERATION_PARK -> {
val isChecked = newValue as? Boolean ?: false
@@ -935,6 +1094,7 @@ class OperatePanelLayout : LinearLayout {
CallerAutoPilotControlManager.sendWeakNetSlowDown(isChecked)
hmiAction("SOP 弱网减速停车, ", isChecked)
clickEventAnalytics("弱网减速停车", isChecked)
return true
}
KEY_FAULT_DECELERATION_PARK -> {
val isChecked = newValue as? Boolean ?: false
@@ -942,6 +1102,7 @@ class OperatePanelLayout : LinearLayout {
CallerAutoPilotControlManager.sendBreakdownSlowDown(isChecked)
hmiAction("SOP 故障减速停车, ", isChecked)
clickEventAnalytics("故障减速停车", isChecked)
return true
}
KEY_EXAM_FUNCTION_PANEL -> {
val isChecked = newValue as? Boolean ?: false
@@ -949,36 +1110,42 @@ class OperatePanelLayout : LinearLayout {
CallerDevaToolsManager.showExamControlWindow(isChecked)
hmiAction("SOP 考试功能面板, ", isChecked)
clickEventAnalytics("考试功能面板", isChecked)
return true
}
KEY_ALL_MERGE_MODE -> {
FunctionBuildConfig.fusionMode = 1
hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode)
clickEventAnalytics("融合模式", true)
CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode)
return true
}
KEY_BLIND_AREA_MODE -> {
FunctionBuildConfig.fusionMode = 2
hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode)
clickEventAnalytics("融合模式", true)
CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode)
return true
}
KEY_BEYOND_VISUAL_RANGE_MODE -> {
FunctionBuildConfig.fusionMode = 3
hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode)
clickEventAnalytics("融合模式", true)
CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode)
return true
}
KEY_TRANSPARENT_TRANSFER_MODE -> {
FunctionBuildConfig.fusionMode = 4
hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode)
clickEventAnalytics("融合模式", true)
CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode)
return true
}
KEY_PURE_OBU_MODE -> {
FunctionBuildConfig.fusionMode = 5
hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode)
clickEventAnalytics("融合模式", true)
CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode)
return true
}
}
return super.onPreferenceChange(preference, newValue)

View File

@@ -21,24 +21,34 @@ class PreferenceWithSpeedSetting : Preference {
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context) : super(context)
private var mDefaultValueSet: Any? = null
private var mSpeedData: Any? = null
private var mFlag = true
override fun setDefaultValue(defaultValue: Any?) {
super.setDefaultValue(defaultValue)
mDefaultValueSet = defaultValue
mSpeedData = defaultValue
notifyChanged()
}
fun update(data: List<String>) {
mSpeedData = data
notifyChanged()
}
override fun onSetInitialValue(defaultValue: Any?) {
super.onSetInitialValue(defaultValue)
}
override fun onBindViewHolder(holder: PreferenceViewHolder) {
super.onBindViewHolder(holder)
val defaultSet = mDefaultValueSet ?: return
if (defaultSet !is Set<*> || defaultSet.size != 4) {
val speedData = mSpeedData ?: return
if (speedData !is List<*> || speedData.size != 4) {
throw AssertionError()
}
val min = (defaultSet.elementAt(0) as String).toFloat()
val max = (defaultSet.elementAt(1) as String).toFloat()
var cur = (defaultSet.elementAt(2) as String).toFloat()
val step = (defaultSet.elementAt(3) as String).toFloat()
val min = (speedData.elementAt(0) as String).toDouble()
val max = (speedData.elementAt(1) as String).toDouble()
var cur = (speedData.elementAt(2) as String).toDouble()
val step = (speedData.elementAt(3) as String).toDouble()
if (min > max) {
throw AssertionError()
}
@@ -52,7 +62,7 @@ class PreferenceWithSpeedSetting : Preference {
val btnOk = holder.findViewById(R.id.bt_ok)
val speedLimit = holder.findViewById(R.id.tv_speed_limit) as? TextView
if (speedLimit?.tag != null && speedLimit.tag is Float) {
cur = max(cur, speedLimit.tag as Float)
cur = max(cur, speedLimit.tag as Double)
}
speedLimit?.text = cur.toString()
val minus = holder.findViewById(R.id.iv_speed_minus)
@@ -83,11 +93,14 @@ class PreferenceWithSpeedSetting : Preference {
speedLimit?.tag = addAfter
speedLimit?.text = addAfter.toString()
}
btnOk.isEnabled = false
if (mFlag) {
mFlag = false
btnOk.isEnabled = false
}
btnOk.setOnClickListener(null)
btnOk.onClick {
onPreferenceClickListener?.also {
extras.putFloat(KEY_BUNDLE_CURRENT_VALUE, cur)
extras.putDouble(KEY_BUNDLE_CURRENT_VALUE, cur)
it.onPreferenceClick(this)
}
}

View File

@@ -11,7 +11,7 @@
android:layout_width="match_parent"
android:layout_height="@dimen/dp_86"
android:layout_marginStart="@dimen/dp_60"
android:layout_marginTop="@dimen/dp_112"
android:layout_marginTop="@dimen/dp_56"
android:orientation="horizontal">
<ImageView

View File

@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/recycler_view"
android:paddingTop="0dip"
app:pressed_enabled="false"
android:paddingBottom="@dimen/dp_20" />

View File

@@ -2,6 +2,7 @@
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@android:id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -11,6 +12,7 @@
android:paddingBottom="@dimen/dp_25"
android:paddingStart="@dimen/dp_30"
android:layout_marginEnd="@dimen/dp_30"
app:pressed_enabled="false"
android:background="@drawable/bg_operate_panel_preference_header"
tools:text="地图效果"
android:gravity="start"

View File

@@ -27,18 +27,6 @@
android:title="限速标识"
android:persistent="false"
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:persistent="false"
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:persistent="false"
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"
@@ -57,5 +45,23 @@
android:title="无人化演练任务拉取时间间隔"
android:persistent="false"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_radio_group_custom" />
<SwitchPreferenceCompat
android:key="self_routing_verify_mode"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="自主算路验证模式"
android:persistent="false"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<SwitchPreferenceCompat
android:key="sweeper_cloud_control"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="清扫车云控业务"
android:persistent="false"
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:persistent="false"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
</PreferenceCategory>
</androidx.preference.PreferenceScreen>

View File

@@ -441,4 +441,11 @@ object FunctionBuildConfig {
@Volatile
@JvmField
var welcomeWords: String? = null
/**
* 最大限速值
*/
@Volatile
@JvmField
var maxSpeedLimit: Double = 0.0
}

View File

@@ -1,5 +1,6 @@
package com.mogo.eagle.core.function.call.autopilot
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener
import com.mogo.eagle.core.function.call.base.CallerBase
import mogo.telematics.pad.MessagePad
@@ -28,6 +29,7 @@ object CallerAutopilotCarConfigListenerManager : CallerBase<IMoGoAutopilotCarCon
@Synchronized
fun invokeAutopilotCarConfigData(carConfigResp: MessagePad.CarConfigResp) {
mCarConfigResp = carConfigResp
FunctionBuildConfig.maxSpeedLimit = carConfigResp.maxSpeedLimit
M_LISTENERS.forEach {
val listener = it.value
try {