package com.mogo.och; import android.view.LayoutInflater; import android.view.View; import android.widget.CheckedTextView; import android.widget.FrameLayout; import android.widget.TextView; import androidx.constraintlayout.widget.Group; import com.mogo.commons.debug.DebugConfig; import com.mogo.commons.mvp.IView; import com.mogo.commons.mvp.MvpFragment; import com.mogo.commons.mvp.Presenter; import com.mogo.commons.voice.AIAssist; import com.mogo.module.common.MogoApisHandler; import com.mogo.module.common.view.OnPreventFastClickListener; import com.mogo.och.view.SlidePanelView; import com.mogo.service.adas.IMogoAdasOCHCallback; import com.mogo.service.adas.RemoteControlAutoPilotParameters; import com.mogo.utils.logger.Logger; /** * 网约车基础Fragment,主要负责布局通用界面,处理站点面板和通话面板互斥情况 *

* 部分业务放在了此处处理 * * @author tongchenfei */ public abstract class BaseOchFragment> extends MvpFragment { private static final String TAG = "BaseOchFragment"; protected SlidePanelView slidePanelView; private CheckedTextView ctvAutopilotStatus; protected TextView tvOperationStatus; public boolean isOperationStatus;//false-收车,true-出车 private FrameLayout flStationPanelContainer; private Group groupTestPanel; /** * 滑动按钮触发的事件 */ private final SlidePanelView.OnSlidePanelMoveToEndListener onSlideToEndListener = () -> { // 此处做一个代理,处理一下共有情况 if (getSlidePanelOnEndListener() != null) { getSlidePanelOnEndListener().moveToEnd(); } }; @Override protected int getLayoutId() { return R.layout.module_mogo_och_base_fragment; } private View panelView; @Override protected void initViews() { groupTestPanel = findViewById(R.id.groupTestPanel); slidePanelView = findViewById(R.id.module_mogo_och_slide_panel); ctvAutopilotStatus = findViewById(R.id.module_mogo_och_autopilot_status); flStationPanelContainer = findViewById(R.id.module_mogo_och_station_panel_container); tvOperationStatus = findViewById(R.id.module_mogo_och_operation_status); panelView = LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer); slidePanelView.setOnSlidePanelMoveToEndListener(onSlideToEndListener); ctvAutopilotStatus.setOnClickListener(new OnPreventFastClickListener() { @Override public void onClickImpl(View v) { // 如果能自动驾驶,就自动驾驶,不能就提示 restartAutopilot(); } }); // debug下调用测试面板 if (DebugConfig.isDebug()) { ctvAutopilotStatus.setOnLongClickListener(v -> { if (groupTestPanel.getVisibility() == View.VISIBLE) { groupTestPanel.setVisibility(View.GONE); } else { groupTestPanel.setVisibility(View.VISIBLE); } return false; }); } onAutopilotStatusChanged(MogoApisHandler.getInstance().getApis().getAdasControllerApi().getAutopilotStatus() == IMogoAdasOCHCallback.STATUS_AUTOPILOT_RUNNING); // 模拟 不可自动驾驶,目前场景是刚开机,adas还未和工控机连接 findViewById(R.id.btnAutopilotDisable).setOnClickListener(view -> { MogoApisHandler.getInstance().getApis() .getAdasControllerApi() .mockOchStatus(IMogoAdasOCHCallback.STATUS_AUTOPILOT_DISABLE, "不能使用"); // Logger.d("lianglihui","模拟 不可自动驾驶"); } ); // 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态 findViewById(R.id.btnAutopilotEnable).setOnClickListener(view -> { MogoApisHandler.getInstance().getApis() .getAdasControllerApi() .mockOchStatus(IMogoAdasOCHCallback.STATUS_AUTOPILOT_ENABLE, "能使用"); // Logger.d("lianglihui","模拟 可自动驾驶"); } ); // 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人 findViewById(R.id.btnAutopilotRunning).setOnClickListener(view -> { MogoApisHandler.getInstance().getApis() .getAdasControllerApi() .mockOchStatus(IMogoAdasOCHCallback.STATUS_AUTOPILOT_RUNNING, "Running"); // Logger.d("lianglihui","模拟 自动驾驶能力"); } ); // 模拟 自动驾驶站 findViewById(R.id.btnAutopilotArrive).setOnClickListener(view -> { MogoApisHandler.getInstance().getApis() .getAdasControllerApi().mockOchStatus(-1, "Arrived"); // Logger.d("lianglihui","模拟 自动驾驶站"); } ); // 模拟 站点下发工控 findViewById(R.id.btnAutopilotControl).setOnClickListener(view -> { // Logger.d("lianglihui","模拟 站点下发工控"); RemoteControlAutoPilotParameters currentAutopilot = new RemoteControlAutoPilotParameters(); currentAutopilot.isSpeakVoice = true; // 万集东门站 currentAutopilot.startLatLon = new RemoteControlAutoPilotParameters.AutoPilotLonLat(40.194795425,116.724476409); // 市政府前街18号 currentAutopilot.endLatLon = new RemoteControlAutoPilotParameters.AutoPilotLonLat(40.1939540844,116.720067); // 订单运营类型 (9出租车,10小巴) currentAutopilot.vehicleType = 10; Logger.d(TAG, "模拟 订单站点下发:" + currentAutopilot); MogoApisHandler.getInstance().getApis().getAdasControllerApi().aiCloudToAdasData(currentAutopilot); } ); tvOperationStatus.setOnClickListener(view -> { onChangeOperationStatus(); }); } protected void onChangeOperationStatus() { } /** * 展示滑动按钮 * * @param text 指定的文字 */ public void showSlidePanle(String text) { if (isOperationStatus) { getActivity().runOnUiThread(() -> { slidePanelView.setText(text); slidePanelView.setVisibility(View.VISIBLE); }); } } /** * 隐藏滑动按钮 */ public void hideSlidePanel() { getActivity().runOnUiThread(() -> { slidePanelView.setVisibility(View.GONE); }); } public void showNotice(String notice) { getActivity().runOnUiThread(() -> { AIAssist.getInstance(getContext()).speakTTSVoice(notice); }); } /** * 改变自动驾驶状态 * * @param isInAutopilot true - 在自动驾驶中 false - 不在自动驾驶中 */ public void onAutopilotStatusChanged(boolean isInAutopilot) { getActivity().runOnUiThread(() -> { ctvAutopilotStatus.setChecked(isInAutopilot); }); } /** * 隐藏【自动驾驶】按钮 */ public void hideAutopilotBiz() { getActivity().runOnUiThread(() -> { // ctvAutopilotStatus.setVisibility(View.GONE); // slidePanelView.setVisibility(View.GONE); }); } /** * 展示【自动驾驶】按钮 */ public void showAutopilotBiz() { getActivity().runOnUiThread(() -> { ctvAutopilotStatus.setVisibility(View.VISIBLE); if (isOperationStatus) { slidePanelView.setVisibility(View.VISIBLE); } else { slidePanelView.setVisibility(View.GONE); } }); } public void hidPanel() { getActivity().runOnUiThread(() -> { flStationPanelContainer.setVisibility(View.GONE); }); } public void showPanel() { getActivity().runOnUiThread(() -> { flStationPanelContainer.setVisibility(View.VISIBLE); }); } public View getPanelView() { return panelView; } public SlidePanelView.OnSlidePanelMoveToEndListener getSlidePanelOnEndListener() { return null; } @Override public void onDestroyView() { super.onDestroyView(); } /** * 获取站点面板view,在{@link #initViews()}时候添加到container中 * * @return 站点面板view */ public abstract int getStationPanelViewId(); /** * 重新开启自动驾驶 */ public abstract void restartAutopilot(); public void changeOperationViewVisible(int visible){ getActivity().runOnUiThread(() -> { tvOperationStatus.setVisibility(visible); }); } }