stationList,
- int arrivingOrArrivedIndex,
- boolean isArrived);
-
- /**
- * 结束清理一遍、选择任务后清理一遍
- */
- void clearBusStationsMarkers();
-
- void updateEmptyUi();
-}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/callback/ISlidePannelHideCallback.java b/OCH/offline/driver/src/main/java/com/mogo/och/offline/callback/ISlidePannelHideCallback.java
deleted file mode 100644
index 1740015a4a..0000000000
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/callback/ISlidePannelHideCallback.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.mogo.och.offline.callback;
-
-/**
- * @author: wangmingjun
- * @date: 2021/10/22
- */
-public interface ISlidePannelHideCallback {
- void hideSlidePanel();
-}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/constant/BusConst.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/constant/BusConst.kt
index 97e1e15ea5..a305c45e56 100644
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/constant/BusConst.kt
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/constant/BusConst.kt
@@ -36,6 +36,8 @@ class BusConst {
//终点UUID
const val BUS_END_MAP_MAKER = "bus_end_map_maker";
+ const val SEND_OUTVOICE_DISTANCES_TARTSTATIONE = 15
+
/**
* 订单起终点Marker类型
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/fragment/BaseShuttleTabFragment.java b/OCH/offline/driver/src/main/java/com/mogo/och/offline/fragment/BaseShuttleTabFragment.java
deleted file mode 100644
index 61e86e3838..0000000000
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/fragment/BaseShuttleTabFragment.java
+++ /dev/null
@@ -1,558 +0,0 @@
-package com.mogo.och.offline.fragment;
-
-import static com.mogo.och.offline.constant.BusConst.TIMER_START_AUTOPILOT_INTERVAL;
-
-import android.animation.ObjectAnimator;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.animation.LinearInterpolator;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.constraintlayout.widget.Group;
-import androidx.core.content.ContextCompat;
-
-import com.mogo.commons.AbsMogoApplication;
-import com.mogo.commons.mvp.IView;
-import com.mogo.commons.mvp.MvpFragment;
-import com.mogo.commons.mvp.Presenter;
-import com.mogo.eagle.core.data.config.FunctionBuildConfig;
-import com.mogo.eagle.core.data.config.HdMapBuildConfig;
-import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
-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.map.CallerMapUIServiceManager;
-import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxBubbleView;
-import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxButtonView;
-import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxListView;
-import com.mogo.eagle.core.function.smp.view.SmallMapView;
-import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils;
-import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener;
-import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
-import com.mogo.map.MogoMap;
-import com.mogo.map.uicontroller.IMogoMapUIController;
-import com.mogo.och.common.module.utils.ResourcesUtils;
-import com.mogo.och.offline.R;
-import com.mogo.och.offline.model.OrderModel;
-import com.mogo.och.offline.view.BizMapView;
-import com.mogo.och.data.bean.BusRoutesResult;
-import com.mogo.och.offline.view.SlidePanelView;
-import com.mogo.och.common.module.utils.SoundPoolHelper;
-
-import org.greenrobot.eventbus.EventBus;
-/**
- * 网约车基础Fragment,主要负责布局通用界面,处理站点面板和通话面板互斥情况
- *
- * 部分业务放在了此处处理
- *
- * @author tongchenfei
- */
-public abstract class BaseShuttleTabFragment> extends MvpFragment {
-
- private static final String TAG = "BaseBusTabFragment";
-
- protected SlidePanelView slidePanelView;
- private RelativeLayout ctvAutopilotStatus;
- private ImageView ctvAutopilotStatusIv;
- private TextView ctvAutopilotStatusTv;
- protected TextView tvArrived;
- private FrameLayout flStationPanelContainer;
- private BizMapView mapBizView;
- private Group groupTestPanel;
-
- protected SmallMapView smallMapView;
-
- //消息盒子
- private DriverMsgBoxButtonView viewDriverMsgBoxButton;
- private DriverMsgBoxListView viewDriverMsgBoxList;
- private DriverMsgBoxBubbleView viewDriverMsgBoxBubble;
-
- private ObjectAnimator autopilotLoadingAnimator;
-
- public boolean isAnimateRunning = false;
-
- /**
- * 滑动按钮触发的事件
- */
- private final SlidePanelView.OnSlidePanelMoveToEndListener onSlideToEndListener = () -> {
- // 此处做一个代理,处理一下共有情况
- if (getSlidePanelOnEndListener() != null) {
- getSlidePanelOnEndListener().moveToEnd();
- }
- };
-
- @Override
- protected int getLayoutId() {
- return R.layout.offline_base_fragment;
- }
-
- @Override
- protected void initViews() {
- mapBizView = findViewById(R.id.mapBizView);
- groupTestPanel = findViewById(R.id.groupTestPanel);
- slidePanelView = findViewById(R.id.module_mogo_och_slide_panel);
- ctvAutopilotStatus = findViewById(R.id.module_mogo_och_autopilot_status);
- ctvAutopilotStatusIv = findViewById(R.id.bus_autopilot_btn_iv);
- ctvAutopilotStatusTv = findViewById(R.id.bus_autopolot_btn_tv);
- flStationPanelContainer = findViewById(R.id.module_mogo_och_station_panel_container);
-
- tvArrived = findViewById(R.id.module_mogo_och_arrived_tv);
-
- FrameLayout flSpeed = findViewById(R.id.fl_speed);
- if (flSpeed != null) {
- CallerDevaToolsManager.INSTANCE.attachAutopilotBeforeLaunchView(flSpeed.getContext(), flSpeed);
- }
-
- LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer);
- slidePanelView.setOnSlidePanelMoveToEndListener(onSlideToEndListener);
-
- updateSwitchMapIcon();
-
- initListener();
- setAutopilotBtnStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getState(),
- CallerAutoPilotControlManager.INSTANCE.isCanStartAutopilot(false, 0));
- ctvAutopilotStatus.setOnClickListener(new OnPreventFastClickListener() {
-
- @Override
- public void onClickImpl(View v) {
- restartAutopilot();
- }
- });
-
- // 模拟 不可自动驾驶,目前场景是刚开机,adas还未和工控机连接
- findViewById(R.id.btnAutopilotDisable).setOnClickListener(view ->
- debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE)
- );
-
- // 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态
- findViewById(R.id.btnAutopilotEnable).setOnClickListener(view ->
- debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE)
- );
-
- // 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人
- findViewById(R.id.btnAutopilotRunning).setOnClickListener(view ->
- debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING)
- );
-
- findViewById(R.id.btnAutopilotPingxing).setOnClickListener(view ->
- debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING)
- );
-
- // 模拟 自动驾驶网约车回调数据
- findViewById(R.id.btnAutopilotArrive).setOnClickListener(view ->
- debugArrivedStation()
- );
-
- tvArrived.setOnClickListener(view -> {
- onArriveStation();
- });
-
- //消息盒子
- viewDriverMsgBoxButton = findViewById(R.id.viewDriverMsgBoxButton);
- viewDriverMsgBoxList = findViewById(R.id.viewDriverMsgBoxList);
- viewDriverMsgBoxBubble = findViewById(R.id.viewDriverMsgBoxBubble);
- viewDriverMsgBoxButton.setClickListener(show -> {
- if(show){
- viewDriverMsgBoxList.setVisibility(View.VISIBLE);
- viewDriverMsgBoxList.notifyData();
- viewDriverMsgBoxBubble.setVisibility(View.GONE);
- viewDriverMsgBoxBubble.isShowData(false);
- }else{
- viewDriverMsgBoxList.setVisibility(View.GONE);
- viewDriverMsgBoxBubble.setVisibility(View.VISIBLE);
- viewDriverMsgBoxBubble.isShowData(true);
- }
- });
-
- smallMapView = findViewById(R.id.smallMapView);
- }
-
- @Override
- protected void initViews(Bundle savedInstanceState) {
- super.initViews(savedInstanceState);
- mapBizView.onCreate(savedInstanceState);
- smallMapView.onCreateView(savedInstanceState);
- }
-
- @Override
- public void onResume() {
- super.onResume();
- mapBizView.onResume();
- smallMapView.onResume();
- }
-
- @Nullable
- @Override
- public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container
- , @Nullable Bundle savedInstanceState) {
- EventBus.getDefault().register(this);
- return super.onCreateView(inflater, container, savedInstanceState);
- }
-
- protected abstract void onArriveStation();
-
- private void updateSwitchMapIcon() {
-
- IMogoMapUIController mapUIController = CallerMapUIServiceManager.INSTANCE.getMapUIController(MogoMap.DEFAULT);
- if(mapUIController!=null){
- if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) {
- mapUIController.changeCurrentIcon(R.raw.m2);
- HdMapBuildConfig.currentCarVrIconRes = R.raw.m2;
- }else if (AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode)) {
- mapUIController.changeCurrentIcon(R.raw.xiaoba);
- HdMapBuildConfig.currentCarVrIconRes = R.raw.xiaoba;
- }
- }
- }
-
- @Override
- public void onSaveInstanceState(@NonNull Bundle outState) {
- super.onSaveInstanceState(outState);
- mapBizView.onSaveInstanceState(outState);
- }
-
- @Override
- public void onLowMemory() {
- super.onLowMemory();
- mapBizView.onLowMemory();
- }
-
- @Override
- public void onPause() {
- super.onPause();
- mapBizView.onPause();
- smallMapView.onPause();
- }
-
- @Override
- public void onDestroyView() {
- mapBizView.onDestroy();
- if(smallMapView != null){
- smallMapView.onDestroy();
- }
- super.onDestroyView();
- CallerAutopilotRecordListenerManager.INSTANCE.removeListener(TAG);
- EventBus.getDefault().unregister(this);
- }
-
- /**
- * 测试到站
- */
- protected abstract void debugArrivedStation();
-
- private void initListener() {
-
- }
-
- /**
- * 展示滑动按钮
- *
- * @param text 指定的文字
- */
- public void showSlidePanel(String text) {
- UiThreadHandler.post(new Runnable() {
- @Override
- public void run() {
- slidePanelView.setText(text);
- slidePanelView.setVisibility(View.VISIBLE);
- }
- }, UiThreadHandler.MODE.QUEUE);
- setArrivedClikable(false);
- }
-
- /**
- * 设置进站按钮状态
- *
- * @param isClickable
- */
- public void setArrivedClikable(boolean isClickable) {
- UiThreadHandler.post(new Runnable() {
- @Override
- public void run() {
- tvArrived.setEnabled(isClickable);
- if (isClickable) {
- tvArrived.setTextColor(ContextCompat.getColor(AbsMogoApplication.getApp(),R.color.bus_white));
- } else {
- tvArrived.setTextColor(ContextCompat.getColor(AbsMogoApplication.getApp(),R.color.bus_arrived_btn_un_clickable_color));
- }
- }
- }, UiThreadHandler.MODE.QUEUE);
- }
-
- /**
- * 隐藏滑动按钮
- */
- public void hideSlidePanel() {
- UiThreadHandler.post(new Runnable() {
- @Override
- public void run() {
- slidePanelView.setVisibility(View.GONE);
- }
- }, UiThreadHandler.MODE.QUEUE);
- }
-
- public void playDI() {
- SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(getContext(), R.raw.bus_di);
- }
-
- /**
- * 改变自动驾驶状态
- *
- * @param autopilotStatus 0:不可用 1:可用状态 2:自动驾驶中
- */
- public void onAutopilotStatusChanged(int autopilotStatus,boolean canStartAuto) {
- UiThreadHandler.post(new Runnable() {
- @Override
- public void run() {
- changeAutopilotBtnView(autopilotStatus, isAnimateRunning,canStartAuto);
- }
- }, UiThreadHandler.MODE.QUEUE);
- }
-
- public void setAutopilotBtnStatus(int autopilotStatus,boolean canStartAuto) {
- if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE == autopilotStatus) {//0不可用
- ctvAutopilotStatusTv.setTextColor(ResourcesUtils.getColor(R.color.bus_autopilot_text_color_disable));
- ctvAutopilotStatusTv.setText(ResourcesUtils.getString(R.string.bus_loading_autopilot_runnig_tv));
- ctvAutopilotStatusIv.setImageResource(R.drawable.bus_disable_autopilot_icon);
- ctvAutopilotStatus.setClickable(true);
- ctvAutopilotStatus.setBackgroundResource(R.drawable.common_autopilot_start_fail);
- } else {
- ctvAutopilotStatusTv.setTextColor(AbsMogoApplication.getApp().getColor(R.color.bus_autopilot_text_color_normal));
- ctvAutopilotStatusIv.setImageResource(R.drawable.bus_ic_autopilot);
- if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == autopilotStatus) { //1可用
- ctvAutopilotStatusTv.setText(ResourcesUtils.getString(R.string.bus_loading_autopilot_runnig_tv));
- if(canStartAuto){
- ctvAutopilotStatus.setClickable(true);
- ctvAutopilotStatus.setBackgroundResource(R.drawable.common_autopilot_press);
- }else {
- ctvAutopilotStatusTv.setTextColor(ResourcesUtils.getColor(R.color.bus_autopilot_text_color_disable));
- ctvAutopilotStatusIv.setImageResource(R.drawable.bus_disable_autopilot_icon);
- ctvAutopilotStatus.setClickable(true);
- ctvAutopilotStatus.setBackgroundResource(R.drawable.common_autopilot_start_fail);
- }
- } else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == autopilotStatus) {
- ctvAutopilotStatusTv.setText(R.string.bus_loading_autopilot_runnig_tv);
- ctvAutopilotStatus.setClickable(true);
- ctvAutopilotStatus.setBackgroundResource(R.drawable.common_autopilot_in_autopilot);
- } else if (IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING
- == autopilotStatus){
- ctvAutopilotStatusTv.setText(R.string.bus_pingxing_driver);
- ctvAutopilotStatus.setClickable(false);
- ctvAutopilotStatus.setBackgroundResource(R.drawable.common_autopilot_pxjs);
- }
- }
- }
-
- public void updateAutopilotStatus(int autopilotStatus) {
- if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
- == autopilotStatus) {//2 running
- ctvAutopilotStatusIv.setImageResource(R.drawable.bus_right_autopilot_icon);
- ctvAutopilotStatusTv.setTextColor(ResourcesUtils.getColor(R.color.bus_autopilot_text_color_normal));
- ctvAutopilotStatusTv.setText(ResourcesUtils.getString(R.string.bus_loading_autopilot_success_tv));
-// ctvAutopilotStatus.setSelected(false);
- ctvAutopilotStatus.setClickable(false);
- } else {
- ctvAutopilotStatusIv.setImageResource(R.drawable.bus_wrong_autopilot_icon);
- ctvAutopilotStatusTv.setTextColor(ResourcesUtils.getColor(R.color.bus_autopilot_text_color_normal));
- ctvAutopilotStatusTv.setText(ResourcesUtils.getString(R.string.bus_loading_autopilot_failure_tv));
- ctvAutopilotStatus.setClickable(false);
-// ctvAutopilotStatus.setSelected(false);
- }
- UiThreadHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- setAutopilotBtnStatus(autopilotStatus,CallerAutoPilotControlManager.INSTANCE.isCanStartAutopilot(false, 0));
- }
- }, 1000);
- }
-
- private void changeAutopilotBtnView(int autopilotStatus, boolean isAnimateRunning,boolean canStartAuto) {
- if (isAnimateRunning && IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
- != autopilotStatus) {
- // 主动开启自动驾驶中,不为2(为0、1)则继续loading
- return;
- }
- if (isAnimateRunning) {
- stopAnimAndUpdateBtnStatus();
- } else {
- setAutopilotBtnStatus(autopilotStatus,canStartAuto);
- }
-
- }
-
- public void stopAnimAndUpdateBtnStatus() {
- stopAutopilotAnimation();
- updateAutopilotStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getState());
- }
-
- /**
- * 隐藏【自动驾驶】按钮
- */
- public void hideAutopilotBiz() {
- }
-
- /**
- * 展示【自动驾驶】按钮
- */
- public void showAutopilotBiz() {
- }
-
- public SlidePanelView.OnSlidePanelMoveToEndListener getSlidePanelOnEndListener() {
- return null;
- }
-
- /**
- * 获取站点面板view,在{@link #initViews()}时候添加到container中
- *
- * @return 站点面板view
- */
- public abstract int getStationPanelViewId();
-
- /**
- * 重新开启自动驾驶
- */
- public abstract void restartAutopilot();
-
- /**
- * 模拟自动驾驶返回状态
- *
- * @param status
- */
- public abstract void debugAutoPilotStatus(int status);
-
- /**
- * 开启自动驾驶中间动画
- */
- public void startAutopilotAnimation() {
- isAnimateRunning = true;
- ctvAutopilotStatusTv.setText(ResourcesUtils.getString(R.string.bus_loading_autopilot_tv));
- ctvAutopilotStatusTv.setTextColor(ResourcesUtils.getColor(R.color.bus_autopilot_text_color_normal));
- ctvAutopilotStatus.setClickable(true);
- ctvAutopilotStatusIv.setImageResource(R.drawable.bus_loading_autopilot_icon);
- if (autopilotLoadingAnimator == null) {
- autopilotLoadingAnimator = ObjectAnimator.ofFloat(ctvAutopilotStatusIv, "rotation", 0f, 360f);
- autopilotLoadingAnimator.setInterpolator(new LinearInterpolator());
- autopilotLoadingAnimator.setRepeatCount(-1);//无限循环
- autopilotLoadingAnimator.setDuration(1000);//设置持续时间
- }
- autopilotLoadingAnimator.start();//动画开始
-
- startingAutoApilotCountDown();
-
- }
-
- private void startingAutoApilotCountDown() {
- //10s 若自动驾驶没有开启,则结束动画
- UiThreadHandler.postDelayed(new Runnable() {
- @Override
- public void run() { //未启动成功做处理
- if (isAnimateRunning) {// 只判断动画是否在进行,根据自动驾驶当前状态去设置自动驾驶状态
- stopAutopilotAnimation();
- updateAutopilotStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getState());
- }
- }
- }, TIMER_START_AUTOPILOT_INTERVAL);
-
- }
-
- /**
- * 停止自动驾驶中间动画
- */
- protected void stopAutopilotAnimation() {
- if (autopilotLoadingAnimator != null) {
- autopilotLoadingAnimator.end();
- ctvAutopilotStatusIv.clearAnimation();
- autopilotLoadingAnimator = null;
- isAnimateRunning = false;
- }
- }
-
-// /**
-// * 迈速表实时更新
-// *
-// * @param newSpeed
-// */
-// public void updateSpeedView(float newSpeed) {
-// int speed = (int) (Math.abs(newSpeed) * 3.6F); // 倒车时工控机反馈定位信息中speed为负值
-// if (mTrafficDataView != null) {
-// mTrafficDataView.updateSpeedWithValue(speed);
-// }
-// }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- }
-
- /**
- * bus调试面板打开关闭
- */
- public void debugTestBar() {
- if (groupTestPanel.getVisibility() == View.VISIBLE) {
- groupTestPanel.setVisibility(View.GONE);
- } else {
- groupTestPanel.setVisibility(View.VISIBLE);
- }
- }
-
- /**
- * Bus调试信息:线路、轨迹等信息
- *
- * START
- */
- private View busTestBar;
- private TextView lineIdTV;
- private TextView lineNameTV;
- private TextView trajMd5TV;
- private TextView stopMd5TV;
- private TextView trajMd5DPQPTV;
- private TextView stopMd5DPQPTV;
-
- public void showHideTestBar() {
- if (busTestBar == null) {
- busTestBar = findViewById(R.id.module_mogo_och_bus_test_bar);
- lineIdTV = findViewById(R.id.bus_test_bar_current_line_id);
- lineNameTV = findViewById(R.id.bus_test_bar_current_line_name);
- trajMd5TV = findViewById(R.id.bus_test_bar_current_traj_md5);
- stopMd5TV = findViewById(R.id.bus_test_bar_current_stop_md5);
- trajMd5DPQPTV = findViewById(R.id.bus_test_bar_current_traj_md5_dpqp);
- stopMd5DPQPTV = findViewById(R.id.bus_test_bar_current_stop_md5_dpqp);
- }
-
- if (busTestBar.getVisibility() == View.VISIBLE) {
- busTestBar.setVisibility(View.GONE);
- } else {
- BusRoutesResult routesResult = OrderModel.getInstance().getBusRoutesResult();
- lineIdTV.setText("lineId:" + (routesResult == null ? "" : String.valueOf(routesResult.getLineId())));
- lineNameTV.setText("lineName:" + (routesResult == null ? "" : routesResult.getName()));
- trajMd5TV.setText("TMd5:" + (routesResult == null ? "" : routesResult.csvFileMd5));
- stopMd5TV.setText("SMd5:" + (routesResult == null ? "" : routesResult.txtFileMd5));
- trajMd5DPQPTV.setText("TMd5DPQP:" + (routesResult == null ? "" : routesResult.csvFileMd5DPQP));
- stopMd5DPQPTV.setText("SMd5DPQP:" + (routesResult == null ? "" : routesResult.txtFileMd5DPQP));
- busTestBar.setVisibility(View.VISIBLE);
- }
- }
-
- public void updateBusTestBarInfo() {
- if (busTestBar != null && busTestBar.getVisibility() == View.VISIBLE) {
- BusRoutesResult routesResult = OrderModel.getInstance().getBusRoutesResult();
- lineIdTV.setText("lineId:" + (routesResult == null ? "" : String.valueOf(routesResult.getLineId())));
- lineNameTV.setText("lineName:" + (routesResult == null ? "" : routesResult.getName()));
- trajMd5TV.setText("TMd5:" + (routesResult == null ? "" : routesResult.csvFileMd5));
- stopMd5TV.setText("SMd5:" + (routesResult == null ? "" : routesResult.txtFileMd5));
- trajMd5DPQPTV.setText("TMd5DPQP:" + (routesResult == null ? "" : routesResult.csvFileMd5DPQP));
- stopMd5DPQPTV.setText("SMd5DPQP:" + (routesResult == null ? "" : routesResult.txtFileMd5DPQP));
- }
- }
- /**
- * END
- */
-}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/fragment/ShuttleFragment.java b/OCH/offline/driver/src/main/java/com/mogo/och/offline/fragment/ShuttleFragment.java
deleted file mode 100644
index 6a945be4db..0000000000
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/fragment/ShuttleFragment.java
+++ /dev/null
@@ -1,554 +0,0 @@
-package com.mogo.och.offline.fragment;
-
-import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
-import static com.mogo.map.MogoMap.DEFAULT;
-
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.constraintlayout.widget.ConstraintLayout;
-import androidx.constraintlayout.widget.Group;
-import androidx.annotation.Nullable;
-
-import com.mogo.commons.storage.SharedPrefsMgr;
-import com.mogo.eagle.core.data.config.FunctionBuildConfig;
-import com.mogo.eagle.core.data.temp.EventLogout;
-import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
-import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
-import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager;
-import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
-import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant;
-import com.mogo.eagle.core.utilcode.util.ActivityUtils;
-import com.mogo.eagle.core.utilcode.util.ImageUtils;
-import com.mogo.eagle.core.utilcode.util.ToastUtils;
-import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
-import com.mogo.map.overlay.IMoGoOverlayManager;
-import com.mogo.map.overlay.core.Level;
-import com.mogo.map.overlay.point.Point;
-import com.mogo.och.common.module.utils.ResourcesUtils;
-import com.mogo.och.offline.R;
-import com.mogo.och.offline.presenter.BusPresenter;
-import com.mogo.och.offline.ui.BusStationCommonItem;
-import com.mogo.och.offline.ui.BusSwitchLineActivity;
-import com.mogo.och.data.bean.BusStationBean;
-import com.mogo.och.offline.constant.BusConst;
-import com.mogo.och.offline.view.SlidePanelView;
-import com.mogo.och.common.module.utils.BlinkAnimationUtil;
-import com.mogo.och.common.module.utils.OCHThreadPoolManager;
-import com.mogo.och.common.module.utils.QRUtilsKt;
-import com.mogo.och.common.module.wigets.BindQRCodeDialog;
-import com.mogo.och.common.module.wigets.MarqueeTextView;
-import com.mogo.och.common.module.wigets.OCHCommitDialog;
-import com.mogo.skin.utils.SkinResources;
-
-import org.greenrobot.eventbus.Subscribe;
-import org.greenrobot.eventbus.ThreadMode;
-
-import java.util.List;
-import java.util.Objects;
-
-import me.jessyan.autosize.utils.AutoSizeUtils;
-
-
-/**
- * 网约车小巴界面
- *
- * @author tongchenfei
- */
-public class ShuttleFragment extends BaseShuttleTabFragment
- implements SlidePanelView.OnSlidePanelMoveToEndListener, View.OnClickListener {
- public static final String TAG = "BusFragment";
-
- private TextView mSwitchLine; //切换路线
- private MarqueeTextView mLineName;
- private TextView mTaskTime;
- private Group groupStationsPanel;
- private ConstraintLayout noDataView;
-
- private BusStationBean startStation = null;
- private BusStationBean endStation = null;
- private BusStationCommonItem firstStationItem;
- private BusStationCommonItem secondStationItem;
- private BusStationCommonItem thirdStationItem;
-
-
- @Override
- public String getTagName() {
- return "BusFragment";
- }
-
- @Override
- public void onActivityCreated(@Nullable Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- }
- @Override
- public void onDestroyView() {
- if (mPresenter != null) {
- mPresenter.onDestroy(this);
- }
- super.onDestroyView();
- }
-
- @Override
- protected void initViews() {
- super.initViews();
-
- mSwitchLine = findViewById(R.id.switch_line_btn);
- mSwitchLine.setTag(0);
- mLineName = findViewById(R.id.module_och_bus_line_name);
-
- firstStationItem = findViewById(R.id.bus_panel_first_station);
- secondStationItem = findViewById(R.id.bus_panel_second_station);
- thirdStationItem = findViewById(R.id.bus_panel_third_station);
- mTaskTime = findViewById(R.id.bus_task_time_tv);
- groupStationsPanel = findViewById(R.id.group_stations_panel);
- noDataView = findViewById(R.id.no_line_data_view);
-
- CallerLogger.d(M_BUS + TAG, "initView: " + CallerAutoPilotStatusListenerManager.INSTANCE.getState());
- // 初始化的时候设置 UI 按钮状态
- showAutopilotBiz();
-
- mSwitchLine.setOnClickListener(this);
-
- mLineName.setOnLongClickListener(new View.OnLongClickListener() {
- @Override
- public boolean onLongClick(View v) {
- showHideTestBar();
- return false;
- }
- });
- }
-
- @Subscribe(threadMode = ThreadMode.MAIN)
- public void changeOverview(EventLogout eventLogout){
- if (eventLogout.getMessgae() == EventLogout.LOGOUT_TYPE){
- CallerLogger.d(M_BUS + TAG,"changeOverview Event消息去登出");
- mPresenter.logout();
- }else if (eventLogout.getMessgae() == EventLogout.SHOW_QR_TYPE){ //显示二维码
- CallerLogger.d(M_BUS + TAG,"changeOverview Event qrcode,sn = "
- + SharedPrefsMgr.getInstance().getSn());
- String qrUrl = String.format(FunctionBuildConfig.urlJson.getBindDriverQRUrl(),
- SharedPrefsMgr.getInstance().getSn());
-
- Drawable qrCenterLogoDrawable =
- SkinResources.getInstance().getDrawable(R.drawable.icon_qr_center_logo);
- Bitmap qrCenterLogoBitmap = ImageUtils.drawable2Bitmap(qrCenterLogoDrawable);
-
- Bitmap bmQr = QRUtilsKt.createQRCodeWithPicture(
- qrCenterLogoBitmap
- ,qrUrl, AutoSizeUtils.dp2px(getContext(),340f),
- AutoSizeUtils.dp2px(getContext(),340f),true);
- if (bmQr != null){
- BindQRCodeDialog.Builder builder = new BindQRCodeDialog.Builder();
- builder.title(getString(R.string.bind_driver_qr_title))
- .cancelStr(getString(R.string.qr_cancel))
- .qrBm(bmQr).build(getContext()).show();
- }else {
- CallerLogger.d(M_BUS + TAG,"bmQr = null ");
- }
- }
- }
-
- @Override
- protected void onArriveStation() {
- mPresenter.onAutopilotArriveAtStation(null);
- mPresenter.arriveStation(null,"点击进站触发进站操作");
- }
-
- @Override
- protected void debugArrivedStation() {
- mPresenter.onAutopilotArriveAtStation(null);
- mPresenter.arriveStation(null,"点击debug进站按钮触发进站操作");
- }
-
- @NonNull
- @Override
- protected BusPresenter createPresenter() {
- return new BusPresenter(this);
- }
-
- @Override
- public void onResume() {
- super.onResume();
- }
-
- public void hideStationsPanel(){
- groupStationsPanel.setVisibility(View.GONE);
- noDataView.setVisibility(View.VISIBLE);
- }
-
- public void showStationsPanel(){
- groupStationsPanel.setVisibility(View.VISIBLE);
- noDataView.setVisibility(View.GONE);
- }
-
- public void updateLineEmptyUI(){
- setArrivedClikable(false);
- showOrHideSwitchLineBtn(true);
- hideStationsPanel();
- hideSlidePanel();
- resetStationBlinkAnim();
- }
-
- private void resetStationBlinkAnim() {
- BlinkAnimationUtil.clearAnimation(firstStationItem.getCircleImageView());
- BlinkAnimationUtil.clearAnimation(secondStationItem.getCircleImageView());
- BlinkAnimationUtil.clearAnimation(thirdStationItem.getCircleImageView());
- }
-
- public void updateBusTaskStatus(String lineName, String lineTime,
- List stationList,
- int arrivingOrArrivedIndex,
- boolean isArrived){
-
- if (getActivity() == null) {
- return;
- }
-
- UiThreadHandler.post(new Runnable() {
- @Override
- public void run() {
- if (stationList == null) {
- // 获取小巴数据失败
- return;
- }
-
- showStationsPanel();
- showOrHideSwitchLineBtn(false);
-
- mLineName.setText(lineName);
- mTaskTime.setText(getString(R.string.bus_line_time_tag)+ lineTime);
- // 渲染小巴路线数据
- updateBusStationStatus(stationList,arrivingOrArrivedIndex,isArrived);
- }
- },UiThreadHandler.MODE.QUEUE);
- }
-
- private void updateBusStationStatus(List stationList,
- int arrivingOrArrivedIndex,
- boolean isArrived) {
-
- startStation = stationList.get(0);
- endStation = stationList.get(stationList.size() - 1);
-
- if (arrivingOrArrivedIndex == stationList.size() - 1 && isArrived){
- //切换路线和结束路线按钮切换
- showSlidePanel("单程结束");
-
- setOrRemoveMapMaker(false, BusConst.BUS_END_MAP_MAKER, endStation.getLat()
- , endStation.getLon(),R.raw.end_marker);
- }else if (arrivingOrArrivedIndex == 0 && isArrived){
-
- showSlidePanel("滑动出发");
-
- setOrRemoveMapMaker(true, BusConst.BUS_START_MAP_MAKER,
- startStation.getLat(), startStation.getLon(),R.raw.star_marker);
- setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER,
- endStation.getLat(), endStation.getLon(),R.raw.end_marker);
- }else{
- if (isArrived){
- // 重置滑动按钮文字
- showSlidePanel("滑动出发");
- }
-
- setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat()
- , startStation.getLon(),R.raw.star_marker);
- setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat()
- , endStation.getLon(),R.raw.end_marker);
- }
-
- if (stationList.size() > 2){ //只有两个站点
- updateMoreThanTwoStationsUI(stationList,arrivingOrArrivedIndex,isArrived);
- }else {
- updateTwoStationsUI(stationList,arrivingOrArrivedIndex,isArrived);
- }
-
- updateBusTestBarInfo();
- }
-
- /**
- * 有两个以上站点的路线
- * @param stationList
- * @param arrivingOrArrivedIndex
- * @param isArrived
- */
- private void updateMoreThanTwoStationsUI(List stationList,
- int arrivingOrArrivedIndex,
- boolean isArrived) {
- secondStationItem.setStationTag("");
- secondStationItem.showOrHideStationArrowBg(true);
- thirdStationItem.setStationTag("");
- secondStationItem.setVisibility(View.VISIBLE);
- thirdStationItem.showOrHideStationArrowBg(false);
-
- if (arrivingOrArrivedIndex == 0 || arrivingOrArrivedIndex -1 == 0
- || (arrivingOrArrivedIndex -2 == 0 && stationList.size() == 3)){
- firstStationItem.setStationTag(ResourcesUtils.getString(R.string.bus_station_txt_tag_start));
- }else {
- firstStationItem.setStationTag("");
- }
-
- if (arrivingOrArrivedIndex + 1 == stationList.size() - 1 || arrivingOrArrivedIndex == stationList.size() - 1
- || (arrivingOrArrivedIndex == 0 && arrivingOrArrivedIndex + 2 == stationList.size() - 1)){ //确认是否显示 "终"
- thirdStationItem.setStationTag(ResourcesUtils.getString(R.string.bus_station_txt_tag_end));
- }else {
- thirdStationItem.setStationTag("");
- }
-
- //圆点: 0:灰色 过站 1:绿色 到站或者即将到站 2:蓝色:未到站
- if (arrivingOrArrivedIndex == 0 && isArrived){
- firstStationItem.setStationNameColor(ResourcesUtils.getColor(R.color.bus_line_station_color_selected));
- secondStationItem.setStationNameColor(ResourcesUtils.getColor(R.color.bus_arrived_station_name_text_color));
- thirdStationItem.setStationNameColor(ResourcesUtils.getColor(R.color.bus_arrived_station_name_text_color));
-
- firstStationItem.setStationName(stationList.get(0).getName());
- secondStationItem.setStationName(stationList.get(1).getName());
- thirdStationItem.setStationName(stationList.get(2).getName());
-
- firstStationItem.setStationPointBg(1);
- secondStationItem.setStationPointBg(2);
- thirdStationItem.setStationPointBg(2);
-
- firstStationItem.setStationArrowBg(2);
- secondStationItem.setStationArrowBg(2);
-
- }else if (arrivingOrArrivedIndex == stationList.size() - 1){
- firstStationItem.setStationNameColor(ResourcesUtils.getColor(R.color.bus_station_tag_txt_un_color));
- secondStationItem.setStationNameColor(ResourcesUtils.getColor(R.color.bus_station_tag_txt_un_color));
- thirdStationItem.setStationNameColor(ResourcesUtils.getColor(R.color.bus_line_station_color_selected));
-
- firstStationItem.setStationName(stationList.get(arrivingOrArrivedIndex -2).getName());
- secondStationItem.setStationName(stationList.get(arrivingOrArrivedIndex -1).getName());
- thirdStationItem.setStationName(stationList.get(arrivingOrArrivedIndex).getName());
-
- firstStationItem.setStationPointBg(0);
- secondStationItem.setStationPointBg(0);
- thirdStationItem.setStationPointBg(1);
-
- firstStationItem.setStationArrowBg(0);
- if (isArrived){
- secondStationItem.setStationArrowBg(0);
- }else {
- secondStationItem.setStationArrowBg(1);
- }
-
- }else {
- firstStationItem.setStationNameColor(ResourcesUtils.getColor(R.color.bus_station_tag_txt_un_color));
- secondStationItem.setStationNameColor(ResourcesUtils.getColor(R.color.bus_line_station_color_selected));
- thirdStationItem.setStationNameColor(ResourcesUtils.getColor(R.color.bus_arrived_station_name_text_color));
-
- firstStationItem.setStationName(stationList.get(arrivingOrArrivedIndex -1).getName());
- secondStationItem.setStationName(stationList.get(arrivingOrArrivedIndex).getName());
- thirdStationItem.setStationName(stationList.get(arrivingOrArrivedIndex + 1).getName());
-
- firstStationItem.setStationPointBg(0);
- secondStationItem.setStationPointBg(1);
- thirdStationItem.setStationPointBg(2);
-
- secondStationItem.setStationArrowBg(2);
- if (isArrived){
- firstStationItem.setStationArrowBg(0);
- }else {
- firstStationItem.setStationArrowBg(1);
- }
- }
-
- }
-
- /**
- * 只有两个站点的路线
- * @param stationList
- * @param arrivingOrArrivedIndex
- * @param isArrived
- */
- private void updateTwoStationsUI(List stationList,
- int arrivingOrArrivedIndex,
- boolean isArrived) {
-
- secondStationItem.setVisibility(View.GONE);
- secondStationItem.showOrHideStationArrowBg(false);
- thirdStationItem.showOrHideStationArrowBg(false);
-
- firstStationItem.setStationTag(ResourcesUtils.getString(R.string.bus_station_txt_tag_start));
- thirdStationItem.setStationTag(ResourcesUtils.getString(R.string.bus_station_txt_tag_end));
-
- firstStationItem.setStationName(stationList.get(0).getName());
- thirdStationItem.setStationName(stationList.get(1).getName());
-
- //圆点: 0:灰色 过站 1:绿色 到站或者即将到站 2:蓝色:未到站
- if (arrivingOrArrivedIndex == 0 && isArrived){//到站
- firstStationItem.setStationNameColor(ResourcesUtils.getColor(R.color.bus_line_station_color_selected));
- thirdStationItem.setStationNameColor(ResourcesUtils.getColor(R.color.bus_arrived_station_name_text_color));
- firstStationItem.setStationPointBg(1);
- firstStationItem.setStationArrowBg(2);
- thirdStationItem.setStationPointBg(0);
-
- }else {
- firstStationItem.setStationNameColor(ResourcesUtils.getColor(R.color.bus_station_tag_txt_un_color));
- thirdStationItem.setStationNameColor(ResourcesUtils.getColor(R.color.bus_line_station_color_selected));
- if (isArrived){ //到终点
- firstStationItem.setStationPointBg(0);
- firstStationItem.setStationArrowBg(0);
- thirdStationItem.setStationPointBg(1);
-
- }else { //到终点途中
- firstStationItem.setStationPointBg(0);
- firstStationItem.setStationArrowBg(1);
- thirdStationItem.setStationPointBg(1);
- }
- }
- }
-
- private void showOrHideSwitchLineBtn(boolean isShow) {
- if (isShow){//显示切换路线
- mSwitchLine.setTag(0);
- mSwitchLine.setText(ResourcesUtils.getString(R.string.bus_switch_line_btn));
- }else {//显示结束路线
- mSwitchLine.setTag(1);
- mSwitchLine.setText(ResourcesUtils.getString(R.string.bus_close_line_btn));
- }
- }
-
- public void hideOchBus() {
-// tvNotice.setVisibility(View.GONE);
- }
-
- @Override
- public int getStationPanelViewId() {
- return R.layout.offline_fragment_och;
- }
-
- @Override
- public void restartAutopilot() {
- if (!isAnimateRunning) {
- mPresenter.restartAutopilot();
- }
- }
-
- @Override
- public SlidePanelView.OnSlidePanelMoveToEndListener getSlidePanelOnEndListener() {
- return this;
- }
-
- @Override
- public void moveToEnd() {
- // 开启自动驾驶到下一站
- if (isAnimateRunning){
- stopAutopilotAnimation();
- }
- mPresenter.autoDriveToNextStation();
- }
-
- /**
- * 设置自动驾驶可用状态
- */
- public void onAutopilotEnableChange(boolean isEnable) {
- if (isEnable) {
- showAutopilotBiz();
- } else {
- hideAutopilotBiz();
- }
- }
-
- public void clearBusStationsMarkers(){
- CallerLogger.d(M_BUS + TAG,"clearBusStationsMarkers()");
- if (null != startStation) {
- setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat()
- , startStation.getLon(),R.raw.star_marker);
- }
- if (null != endStation) {
- setOrRemoveMapMaker(false, BusConst.BUS_END_MAP_MAKER, endStation.getLat()
- , endStation.getLon(),R.raw.end_marker);
- }
-
- //清除鹰眼右下角小地图轨迹
- CallerLogger.d(SceneConstant.M_BUS, "clearBusStationsMarkers --------->");
- smallMapView.clearPolyline();
- }
-
- /**
- * 绘制地图起点终点
- *
- * @param isAdd
- * @param uuid
- */
- private void setOrRemoveMapMaker(boolean isAdd, String uuid, double lat, double longi,int resourceId) {
- if (isAdd) {
- Runnable setMapMarkerRunnable = () -> {
- CallerLogger.d(M_BUS + "setMapMaker= "+Thread.currentThread().getName(),
- uuid + "=latitude=" + lat + ",longitude=" + longi);
-
- Point.Options.Builder builder = new Point.Options.Builder(BusConst.TYPE_MARKER_BUS_ORDER, Level.MAP_MARKER)
- .setId(uuid)
- .anchor(0.5f, 0.5f)
- .set3DMode(true)
- .isUseGps(true)
- .controlAngle(false)
- .icon3DRes(resourceId)
- .latitude(lat)
- .longitude(longi);
- IMoGoOverlayManager overlayManager = CallerMapUIServiceManager.INSTANCE.getOverlayManager();
- if (overlayManager != null) {
- overlayManager.showOrUpdatePoint(builder.build(),DEFAULT);
- }
- };
-
- OCHThreadPoolManager.getsInstance().execute(setMapMarkerRunnable);
-
- }else {
- Runnable removeMapMarkerRunnable = () -> {
- CallerLogger.d(M_BUS + "RemoveMapMaker="+Thread.currentThread().getName(),
- uuid+"=latitude="+lat+",longitude="+longi);
- Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getOverlayManager()).removePoint(uuid);
- };
- OCHThreadPoolManager.getsInstance().execute(removeMapMarkerRunnable);
- }
- }
-
- @Override
- public void debugAutoPilotStatus(int status) {
- mPresenter.debugAutoPilotStatus(status);
- }
-
- @Override
- public void onClick(View v) {
- if (v.getId() == R.id.switch_line_btn) {//切换路线条件: 自动驾驶过程中,点击则toast提示:自动驾驶中,不可切换路线
- //本次行程未结束,不支持切换路线。点击则toast提示:当前行程未完成,不可切换路线
- if (CallerAutoPilotStatusListenerManager.INSTANCE.getState()
- == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
- ToastUtils.showLong(ResourcesUtils.getString(R.string.bus_switch_line_btn_warning1));
- return;
- }
- if ((int)mSwitchLine.getTag() == 0){//切换路线
- Intent intent = new Intent(getContext(), BusSwitchLineActivity.class);
- ActivityUtils.startActivity(intent);
- }else {//结束任务
- OCHCommitDialog.Builder builder = new OCHCommitDialog.Builder();
- OCHCommitDialog closeLineConfirmDialog = builder
- .title(getString(R.string.bus_dialog_title))
- .tips(getString(R.string.bus_dialog_tips))
- .confirmStr(getString(R.string.bus_dialog_confirm))
- .cancelStr(getString(R.string.bus_dialog_cancel))
- .build(getContext());
- closeLineConfirmDialog.setClickListener(new OCHCommitDialog.ClickListener() {
- @Override
- public void confirm() {
- mPresenter.abortTask();
- }
-
- @Override
- public void cancel() {
- closeLineConfirmDialog.dismiss();
- }
- });
- closeLineConfirmDialog.show();
- }
- }
- }
-}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/BusLineModel.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/BusLineModel.kt
deleted file mode 100644
index adf135aca1..0000000000
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/BusLineModel.kt
+++ /dev/null
@@ -1,105 +0,0 @@
-package com.mogo.och.offline.model
-
-import com.mogo.commons.storage.SharedPrefsMgr
-import com.mogo.eagle.core.utilcode.util.GsonUtils
-import com.mogo.och.common.module.manager.loop.BizLoopManager
-import com.mogo.och.common.module.manager.loop.LoopInfo
-import com.mogo.och.common.module.network.OchCommonServiceCallback
-import com.mogo.och.offline.bean.BindLineListResponse
-import com.mogo.och.offline.callback.IBusLinesCallback
-import com.mogo.och.offline.net.OrderServiceManager
-import io.reactivex.schedulers.Schedulers
-
-/**
- * @author: wangmingjun
- * @date: 2022/2/9
- */
-object BusLineModel {
- private var mBusLinesCallback: IBusLinesCallback? = null
-
- private const val Catche4AllLines = "Catche4AllLines"
- private const val TAG = "BusLineModel"
-
- private var lastAllLinesJson = ""
-
- @JvmStatic
- fun setBusLinesCallback(callback: IBusLinesCallback?) {
- mBusLinesCallback = callback
- }
-
- @JvmStatic
- fun queryBusLines() {
- val catche4AllLines = SharedPrefsMgr.getInstance().getString(Catche4AllLines)
- val bindLineListResponse =
- GsonUtils.fromJson(catche4AllLines, BindLineListResponse::class.java)
- if (bindLineListResponse != null && mBusLinesCallback != null) {
- mBusLinesCallback!!.onBusLinesChange(bindLineListResponse)
- }
- lastAllLinesJson = catche4AllLines
- OrderServiceManager.queryBindLineListBySn(object : OchCommonServiceCallback {
- override fun onSuccess(data: BindLineListResponse) {
- if (null == data && mBusLinesCallback != null) {
- mBusLinesCallback?.onBusLinesChange(null)
- return
- }
- mBusLinesCallback?.onBusLinesChange(data)
- val toJson = GsonUtils.toJson(data)
- if(lastAllLinesJson==toJson){
- return
- }else{
- lastAllLinesJson = toJson
- SharedPrefsMgr.getInstance().putString(Catche4AllLines, toJson)
- }
- }
-
- override fun onError() {
- }
-
- override fun onFail(code: Int, failMsg: String) {
- }
- })
-
- }
- @JvmStatic
- fun queryBusLinesByIo() {
- OrderServiceManager.queryBindLineListBySn(object : OchCommonServiceCallback {
- override fun onSuccess(data: BindLineListResponse) {
- if (null == data) {
- return
- }
-
- val toJson = GsonUtils.toJson(data)
- if(lastAllLinesJson==toJson){
- return
- }else{
- lastAllLinesJson = toJson
- SharedPrefsMgr.getInstance().putString(Catche4AllLines, toJson)
- }
- }
-
- override fun onError() {
- }
-
- override fun onFail(code: Int, failMsg: String) {
- }
- })
- }
-
-
- @JvmStatic
- fun commitSwitchLineId(checkLineInfo: BindLineListResponse.Result?) {
- if (mBusLinesCallback != null) {
- mBusLinesCallback!!.onChangeLineIdSuccess(checkLineInfo)
- }
- }
- @JvmStatic
- fun startLoopAllLine() {
- BizLoopManager.setLoopFunction(TAG, LoopInfo(60,::queryBusLinesByIo, scheduler = Schedulers.io()))
- }
- @JvmStatic
- fun stopLoopAllLine() {
- BizLoopManager.removeLoopFunction(TAG)
- }
-
-
-}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/LineModel.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/LineModel.kt
new file mode 100644
index 0000000000..3f70f3481e
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/LineModel.kt
@@ -0,0 +1,509 @@
+package com.mogo.och.offline.model
+
+import android.annotation.SuppressLint
+import android.content.Context
+import com.mogo.commons.AbsMogoApplication
+import com.mogo.commons.storage.SharedPrefsMgr
+import com.mogo.eagle.core.data.config.FunctionBuildConfig
+import com.mogo.eagle.core.data.map.SiteMarkerBean
+import com.mogo.eagle.core.data.och.OchInfo
+import com.mogo.eagle.core.data.v2x.Point
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
+import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener
+import com.mogo.eagle.core.network.utils.digest.DigestUtils
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
+import com.mogo.eagle.core.utilcode.util.NetworkUtils
+import com.mogo.eagle.core.utilcode.util.ToastUtils
+import com.mogo.och.bridge.autopilot.line.LineManager
+import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
+import com.mogo.och.common.module.manager.loop.BizLoopManager
+import com.mogo.och.common.module.manager.socket.lan.LanSocketManager
+import com.mogo.och.common.module.manager.socket.lan.bean.WriteOffResultMsg
+import com.mogo.och.common.module.network.OchCommonServiceCallback
+import com.mogo.och.common.module.utils.DateTimeUtil
+import com.mogo.och.common.module.utils.ResourcesUtils
+import com.mogo.och.common.module.utils.RxUtils
+import com.mogo.och.data.bean.BusStationBean
+import com.mogo.och.data.db.bean.LineDataBean
+import com.mogo.och.offline.R
+import com.mogo.och.offline.callback.IBusLinesCallback
+import com.mogo.och.offline.model.OrderModel.isGoingToNextStation
+import com.mogo.och.offline.repository.RepositoryManager
+import com.mogo.och.offline.repository.db.bean.TaskDataBean
+import com.mogo.och.offline.repository.db.bean.TaskSiteDataBean
+import com.mogo.och.offline.repository.db.repository.SiteDb
+import com.mogo.och.offline.repository.exception.DataException
+import com.mogo.och.offline.repository.net.bean.BindLineListResponse
+import com.mogo.och.offline.util.ShuttleVoiceManager
+import io.reactivex.Observer
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.disposables.Disposable
+import io.reactivex.schedulers.Schedulers
+import java.util.concurrent.ConcurrentHashMap
+import java.util.concurrent.atomic.AtomicBoolean
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/2/9
+ */
+@SuppressLint("StaticFieldLeak")
+object LineModel {
+ private var mContext: Context? = null
+
+ private val mBusLinesCallbackMap: MutableMap = ConcurrentHashMap()
+
+ const val TAG = "${M_BUS}BusLineModel"
+
+ private val context = AbsMogoApplication.getApp()
+
+ // 判断接口是否变化
+ private const val EXECUTABLECHANGEMD5 = "EXECUTABLECHANGEMD5"
+
+ // 展示上一次刷新时间
+ const val EXECUTABLECHANGETIME = "executablechangetime"
+
+ var currentTask: TaskDataBean? = null
+
+ // 当前任务的站点列表
+ var stationList: MutableList? = mutableListOf()
+
+
+ private val isRequesting = AtomicBoolean(false)
+ private var startTaskDisposable: Disposable? = null
+
+ private var queryCarInfo: Disposable? = null
+
+ // 当前站点
+ @JvmStatic
+ var startStationIndex: Int = 0 //A->B 此处值是A站点索引
+
+ @JvmStatic
+ fun init() {
+ d(TAG, "init")
+ mContext = AbsMogoApplication.getApp()
+ queryCarExecutableTaskList(true)
+ }
+
+ @JvmStatic
+ @Synchronized
+ fun release() {
+ d(TAG, "release")
+ mContext = null
+ isRequesting.set(false)
+ mBusLinesCallbackMap.clear()
+ RxUtils.disposeSubscribe(queryCarInfo)
+ }
+
+ @JvmStatic
+ fun setBusLinesCallback(tag: String?, callback: IBusLinesCallback?) {
+ if (tag == null || "" == tag) return
+ if (callback == null) {
+ mBusLinesCallbackMap.remove(tag)
+ return
+ }
+ mBusLinesCallbackMap[tag] = callback
+ }
+
+ fun refreshTask() {
+ RxUtils.disposeSubscribe(queryCarInfo)
+ queryCarExecutableTaskList(false)
+ }
+
+ /**
+ * 同步基础信息
+ */
+ private fun queryCarExecutableTaskList(isBackground: Boolean) {
+ if (isRequesting.get()) {
+ d(TAG, "正在同步请稍等")
+ val lastUpdateTime = SharedPrefsMgr.getInstance().getLong(EXECUTABLECHANGETIME, 0)
+ mBusLinesCallbackMap.forEach { callback ->
+ callback.value.onRefreshSuccess(lastUpdateTime)
+ }
+ return
+ }
+ isRequesting.set(true)
+ d(TAG, "开始同步数据")
+ RepositoryManager.queryCarExecutableTaskList(
+ object : OchCommonServiceCallback {
+ override fun onSuccess(data: BindLineListResponse) {
+ isRequesting.set(false)
+ d(TAG, "同步数据成功")
+ RxUtils.disposeSubscribe(queryCarInfo)
+ queryCarInfo = RxUtils.createSubscribe(60_000) {
+ queryCarExecutableTaskList(true)
+ }
+ // 第一次过滤 请求返回值的md5
+ val currentRequest = DigestUtils.md5Hex(data.data.toString())
+ val lastChangeMd5 = SharedPrefsMgr.getInstance().getString(EXECUTABLECHANGEMD5)
+ val lastUpdateTime =
+ SharedPrefsMgr.getInstance().getLong(EXECUTABLECHANGETIME, 0)
+ val currentTimeStamp = DateTimeUtil.getCurrentTimeStamp()
+
+ SharedPrefsMgr.getInstance().putLong(EXECUTABLECHANGETIME, currentTimeStamp)
+ val sameDay = DateTimeUtil.isSameDay(currentTimeStamp, lastUpdateTime)
+ mBusLinesCallbackMap.forEach { callback ->
+ callback.value.onRefreshSuccess(currentTimeStamp)
+ }
+ if (isBackground) {
+ if (currentRequest == lastChangeMd5 && sameDay) {
+ return
+ }
+ }
+ SharedPrefsMgr.getInstance().putString(EXECUTABLECHANGEMD5, currentRequest)
+ OchChainLogManager.writeChainLog(
+ "数据发生变化",
+ "接口信息发生变化 $lastChangeMd5 new md5${currentRequest}"
+ )
+ val startTime = System.currentTimeMillis()
+ BindLineListResponse.save2Db(data)
+ d(TAG, "更新数据耗时${System.currentTimeMillis() - startTime}")
+ RxUtils.createSubscribe(800) {
+ // 等待写入数据库
+ mBusLinesCallbackMap.forEach { callback ->
+ callback.value.onRefreshSuccessWIthData()
+ }
+ }
+ }
+
+ override fun onError() {
+ isRequesting.set(false)
+ d(TAG, "同步数据失败 onError")
+ RxUtils.disposeSubscribe(queryCarInfo)
+ queryCarInfo = RxUtils.createSubscribe(60_000) {
+ queryCarExecutableTaskList(true)
+ }
+ if (!isBackground) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort(ResourcesUtils.getString(R.string.network_error_tip))
+ } else {
+ ToastUtils.showShort(ResourcesUtils.getString(R.string.request_error_tip))
+ }
+ }
+ }
+
+ override fun onFail(code: Int, failMsg: String) {
+ isRequesting.set(false)
+ d(TAG, "同步数据失败 onFail")
+ RxUtils.disposeSubscribe(queryCarInfo)
+ queryCarInfo = RxUtils.createSubscribe(60_000) {
+ queryCarExecutableTaskList(true)
+ }
+ if (!isBackground) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort("网络异常,请稍后重试")
+ } else {
+ ToastUtils.showShort(failMsg)
+ }
+ }
+
+ }
+ })
+ }
+
+ /**
+ * 开始任务
+ */
+ @JvmStatic
+ fun commitSwitchLineId(task: TaskDataBean, line: LineDataBean) {
+ RxUtils.disposeSubscribe(startTaskDisposable)
+ line.getLineIdAndName { lineId, lineName ->
+ RepositoryManager.startTask(task.taskId?:0, lineId, lineName)
+ ?.subscribeOn(Schedulers.io())
+ ?.observeOn(AndroidSchedulers.mainThread())
+ ?.subscribe(object : Observer {
+ override fun onSubscribe(d: Disposable) {
+ startTaskDisposable = d
+ d(TAG, "commitSwitchLineId onSubscribe")
+ }
+
+ override fun onError(e: Throwable) {
+ d(TAG, "commitSwitchLineId onError${e.printStackTrace()}")
+ if (e is DataException) {
+ OchChainLogManager.writeChainLog("开始任务", "${e.message}")
+ ToastUtils.showShort("选择任务失败:${e.message}")
+ mBusLinesCallbackMap.forEach {
+ it.value.onChangeLineIdFail()
+ }
+ }
+ }
+
+ override fun onComplete() {
+ d(TAG, "commitSwitchLineId onComplete")
+ }
+
+ override fun onNext(data: Boolean) {
+ d(TAG, "commitSwitchLineId onNext ${data}")
+ if (data) {
+ OrderModel.queryBusRoutes()
+ BizLoopManager.runInIoThread {
+ val querySiteByLineId = SiteDb.querySiteByLineId(lineId)
+ querySiteByLineId?.forEach {
+ if (it.seq == 1) {
+ LanSocketManager.sendMsgToClient(
+ WriteOffResultMsg(
+ -99,
+ "",
+ "",
+ System.currentTimeMillis(),
+ LineManager.lineInfos?.lineId ?: 0,
+ it.siteId ?: 0L
+ )
+ )
+ }
+ return@forEach
+ }
+ }
+ mBusLinesCallbackMap.forEach {
+ it.value.onChangeLineIdSuccess()
+ }
+ }
+ RxUtils.disposeSubscribe(startTaskDisposable)
+ }
+ })
+
+ }
+
+ }
+
+ fun haveRunningTask() {
+ mBusLinesCallbackMap.forEach { callback ->
+ callback.value.onRunningTask()
+ }
+ }
+
+ fun haveNoRunningTask() {
+ mBusLinesCallbackMap.forEach { callback ->
+ callback.value.onNoRunningTask()
+ }
+ }
+
+ fun leaveStationSuccess() {
+ mBusLinesCallbackMap.forEach { map ->
+ map.value.onLeaveStaionSuccess()
+ }
+ }
+
+ fun arrivedStationSuccess() {
+ LanSocketManager.sendMsgToClient(
+ WriteOffResultMsg(
+ -99,
+ "",
+ "",
+ System.currentTimeMillis(),
+ LineManager.lineInfos?.lineId ?: 0,
+ LineManager.getStations()?.first?.siteId?.toLong() ?: 0L
+ )
+ )
+ mBusLinesCallbackMap.forEach { callback ->
+ callback.value.onArriveStationSuccess()
+ }
+ }
+
+ fun isLastStation(): Boolean? {
+ return if (stationList.isNullOrEmpty()) {
+ null
+ } else {
+ startStationIndex == stationList!!.size - 1
+ }
+
+ }
+
+ fun getTaskTime(): String {
+ return DateTimeUtil.formatLongToString(
+ currentTask?.startTime ?: System.currentTimeMillis(),
+ DateTimeUtil.HH_mm
+ )
+ }
+
+ fun endTask() {
+ currentTask?.taskId?.let { taskId ->
+ RepositoryManager.endTask(taskId)
+ ?.subscribeOn(Schedulers.io())
+ ?.observeOn(AndroidSchedulers.mainThread())
+ ?.subscribe(object : Observer {
+ override fun onSubscribe(d: Disposable) {
+ startTaskDisposable
+ d(TAG, "endTask onSubscribe")
+ }
+
+ override fun onError(e: Throwable) {
+ d(TAG, "endTask onError${e.printStackTrace()}")
+ if (e is DataException) {
+
+ }
+ isGoingToNextStation = false
+
+ ThirdDeviceData.endTask()
+ ThirdDeviceData.sendTaskDetailsToClients()
+ ShuttleVoiceManager.endOrderBus()
+ // 取消自驾
+ CallerAutoPilotControlManager.cancelAutoPilot()
+ currentTask = null
+ LineManager.setLineInfo(null)
+ LineManager.setStartAndEndStation(null, null)
+ LanSocketManager.sendMsgToClient(
+ WriteOffResultMsg(
+ -99,
+ "",
+ "",
+ System.currentTimeMillis(),
+ LineManager.lineInfos?.lineId ?: 0,
+ LineManager.getStations()?.first?.siteId?.toLong() ?: 0L
+ )
+ )
+ LineModel.callEyeMap(1)
+ stationList = mutableListOf()
+ startStationIndex = 0
+ mBusLinesCallbackMap.forEach {
+ it.value.onCompleteTask()
+ }
+ val changeInfo =
+ "taskId:${currentTask?.taskId}--lineInfo:${LineManager.lineInfos}"
+ OchChainLogManager.writeChainLog("结束任务", changeInfo)
+
+ }
+
+ override fun onComplete() {
+ d(TAG, "endTask onComplete")
+ }
+
+ override fun onNext(data: Boolean) {
+ d(TAG, "endTask onNext ${data}")
+ if (data) {
+ isGoingToNextStation = false
+
+ ThirdDeviceData.endTask()
+ ThirdDeviceData.sendTaskDetailsToClients()
+ ShuttleVoiceManager.endOrderBus()
+ // 取消自驾
+ CallerAutoPilotControlManager.cancelAutoPilot()
+ currentTask = null
+ LineManager.setLineInfo(null)
+ LineManager.setStartAndEndStation(null, null)
+ LanSocketManager.sendMsgToClient(
+ WriteOffResultMsg(
+ -99,
+ "",
+ "",
+ System.currentTimeMillis(),
+ LineManager.lineInfos?.lineId ?: 0,
+ LineManager.getStations()?.first?.siteId?.toLong() ?: 0L
+ )
+ )
+ stationList = mutableListOf()
+ startStationIndex = 0
+ LineModel.callEyeMap(2)
+ mBusLinesCallbackMap.forEach {
+ it.value.onCompleteTask()
+ }
+ val changeInfo =
+ "taskId:${currentTask?.taskId}--lineInfo:${LineManager.lineInfos}"
+ OchChainLogManager.writeChainLog("结束任务", changeInfo)
+ }
+ onComplete()
+ }
+ })
+ }
+ }
+
+ fun startTaskMessage(): Boolean {
+ if (!stationList.isNullOrEmpty()) {
+ return startStationIndex == 0 && stationList!!.first().drivingStatus == TaskSiteDataBean.drivingStatusCurrent && !stationList!!.first().isLeaving
+ }
+ return false
+ }
+
+ fun setDemoMode() {
+ // 美化是否开始
+ if (FunctionBuildConfig.isDemoMode) { //行驶过程中设置美化
+ val (startStation, _) = LineManager.getStations()
+ if (startStation != null && startStation.isLeaving) {
+ OrderModel.startBeautificationMode()
+ d(TAG, "美化模式-ignore:置为true(每次滑动出发)")
+ } else if (startStationIndex > 0 && startStationIndex < stationList!!.size - 1) {
+ //美化模式下 中间站点到站 引导线要一直绘制,所以此处不出强制绘制不传false
+ CallerAutoPilotControlManager.setIPCDemoMode(false)
+ d(TAG, "美化模式-ignore:false(到达中间站)")
+ } else {
+ OrderModel.closeBeautificationMode()
+ }
+ }
+ }
+
+ fun callEyeMap(index: Int) {
+ d(TAG, "执行${index} callEyeMap${stationList?.size}")
+ if (stationList.isNullOrEmpty()) {
+ val ochInfo = OchInfo(1, mutableListOf())
+ ochInfo.siteMarkerList = mutableListOf()
+ CallerDataCenterBizListener.invokeOchInfo(ochInfo)
+ OchChainLogManager.writeChainLogMap("地图", "站点信息:${ochInfo}")
+ } else {
+ val siteList = mutableListOf()
+ var temp: SiteMarkerBean? = null
+ stationList?.let {
+ it.forEachIndexed { index, busStationBean ->
+ if (index == 0) {
+ temp = SiteMarkerBean(
+ Point(busStationBean.gcjLon, busStationBean.gcjLat),
+ R.drawable.offline_map_start,
+ 0.5f,
+ 0.87f
+ )
+ } else if (index == it.size - 1) {
+ temp = SiteMarkerBean(
+ Point(busStationBean.gcjLon, busStationBean.gcjLat),
+ R.drawable.offline_map_end,
+ 0.5f,
+ 0.87f
+ )
+ } else {
+ if (busStationBean.drivingStatus == 1) {
+ temp = SiteMarkerBean(
+ Point(busStationBean.gcjLon, busStationBean.gcjLat),
+ R.drawable.offline_map_pass,
+ 0.5f,
+ 0.478f
+ )
+ } else if (busStationBean.drivingStatus == 3) {
+ temp = SiteMarkerBean(
+ Point(busStationBean.gcjLon, busStationBean.gcjLat),
+ R.drawable.offline_map_notarrive,
+ 0.5f,
+ 0.478f
+ )
+ } else if (busStationBean.drivingStatus == 2) {
+ if (busStationBean.isLeaving) {
+ temp = SiteMarkerBean(
+ Point(
+ busStationBean.gcjLon,
+ busStationBean.gcjLat
+ ), R.drawable.offline_map_pass, 0.5f, 0.478f
+ )
+ } else {
+ temp = SiteMarkerBean(
+ Point(
+ busStationBean.gcjLon,
+ busStationBean.gcjLat
+ ), R.drawable.offline_map_notarrive, 0.5f, 0.478f
+ )
+ }
+ }
+ }
+ temp?.let { temp ->
+ siteList.add(temp)
+ }
+ }
+ }
+ val (start, end) = LineManager.getStations()
+ if (start != null && end != null) {
+ val ochInfo =
+ OchInfo(1, mutableListOf(start.toMogoLocation(), end.toMogoLocation()))
+ ochInfo.siteMarkerList = siteList
+ CallerDataCenterBizListener.invokeOchInfo(ochInfo)
+ OchChainLogManager.writeChainLogMap("地图", "站点信息:${ochInfo}")
+ }
+ }
+ }
+
+}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/OrderModel.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/OrderModel.kt
index 07cecc8a4b..27d6c71229 100644
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/OrderModel.kt
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/OrderModel.kt
@@ -1,961 +1,347 @@
-package com.mogo.och.offline.model;
+package com.mogo.och.offline.model
-import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
-import static com.mogo.och.offline.constant.BusConst.DELAY_10S;
-import static com.mogo.och.offline.constant.BusConst.STATION_STATUS_ARRIVING;
-import static com.mogo.och.offline.constant.BusConst.STATION_STATUS_STOPPED;
-
-import android.content.Context;
-import android.text.TextUtils;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.elegant.network.utils.GsonUtil;
-import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener;
-import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager;
-import com.mogo.eagle.core.utilcode.util.CoordinateUtils;
-import com.mogo.commons.AbsMogoApplication;
-import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
-import com.mogo.eagle.core.data.config.FunctionBuildConfig;
-import com.mogo.eagle.core.data.map.MogoLocation;
-import com.mogo.eagle.core.utilcode.util.StringUtils;
-import com.mogo.och.bridge.autopilot.OCHAdasAbilityManager;
-import com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotManager;
-import com.mogo.och.bridge.autopilot.autopilot.OchAutopilotAnalytics;
-import com.mogo.och.bridge.autopilot.autopilot.bean.ArrivedStation;
-import com.mogo.och.bridge.autopilot.callback.OchAdasStartFailureCallback;
-import com.mogo.och.bridge.autopilot.line.LineManager;
-import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager;
-import com.mogo.och.common.module.manager.socket.cloud.action.OperateAction;
-import com.mogo.och.common.module.manager.socket.lan.LanSocketManager;
-import com.mogo.och.common.module.manager.socket.lan.LedScreenManager;
-import com.mogo.och.common.module.manager.socket.lan.bean.BusinessType;
-import com.mogo.och.common.module.voice.VoiceNotice;
-import com.mogo.och.data.bean.ContraiInfo;
-import com.mogo.och.data.bean.LineInfo;
-import com.mogo.och.offline.R;
-import com.mogo.och.offline.callback.IBusADASStatusCallback;
-import com.mogo.och.offline.util.ShuttleVoiceManager;
-import com.mogo.och.common.module.manager.socket.lan.bean.AppConnectMsg;
-import com.mogo.och.common.module.manager.socket.lan.bean.BaseDPMsg;
-import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType;
-import com.mogo.och.common.module.manager.socket.lan.bean.TaskDetailsMsg;
-import com.mogo.och.common.module.biz.login.LoginStatusManager;
-import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager;
-import com.mogo.och.common.module.utils.OCHThreadPoolManager;
-import com.mogo.och.data.bean.BusStationBean;
-import com.mogo.och.common.module.constant.OchCommonConst;
-import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
-import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener;
-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.CallerChassisLocationGCJ02ListenerManager;
-import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
-import com.mogo.eagle.core.utilcode.util.GsonUtils;
-import com.mogo.eagle.core.utilcode.util.ToastUtils;
-import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
-import com.mogo.och.data.bean.BusRoutesResult;
-import com.mogo.och.offline.callback.IBusControllerStatusCallback;
-import com.mogo.och.offline.callback.IRefreshBusStationsCallback;
-import com.mogo.och.offline.callback.ISlidePannelHideCallback;
-import com.mogo.och.offline.constant.BusConst;
-import com.mogo.och.offline.util.OffLineTrajectoryManager;
-import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager;
-import com.mogo.och.common.module.manager.socket.cloud.AbnormalFactorsLoopManager;
-import com.mogo.och.common.module.utils.DateTimeUtil;
-import com.mogo.och.common.module.utils.NumberFormatUtil;
-import com.mogo.och.common.module.utils.PinYinUtil;
-import com.mogo.och.common.module.manager.socket.lan.bean.BusCacheKey;
-import com.mogo.och.data.bean.BusTransferData;
-import com.mogo.och.data.manager.cache.CacheDataManager;
-import com.mogo.skin.utils.SkinResources;
-
-import org.jetbrains.annotations.NotNull;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import io.reactivex.exceptions.UndeliverableException;
-import io.reactivex.functions.Consumer;
-import io.reactivex.plugins.RxJavaPlugins;
+import android.annotation.SuppressLint
+import android.content.Context
+import com.mogo.commons.AbsMogoApplication
+import com.mogo.eagle.core.data.config.FunctionBuildConfig
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
+import com.mogo.eagle.core.utilcode.util.CoordinateUtils
+import com.mogo.eagle.core.utilcode.util.ThreadUtils
+import com.mogo.och.common.module.biz.login.LoginStatusManager
+import com.mogo.och.bridge.autopilot.autopilot.IOchAutopilotStatusListener
+import com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotStatusListenerManager
+import com.mogo.och.bridge.autopilot.autopilot.bean.ArrivedStation
+import com.mogo.och.bridge.autopilot.line.ILineCallback
+import com.mogo.och.bridge.autopilot.line.LineManager
+import com.mogo.och.bridge.autopilot.location.OchLocationManager
+import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
+import com.mogo.och.common.module.manager.loop.BizLoopManager
+import com.mogo.och.common.module.manager.loop.LoopInfo
+import com.mogo.och.common.module.manager.socket.lan.LedScreenManager
+import com.mogo.och.common.module.manager.transform.OchTransform
+import com.mogo.och.common.module.manager.transform.OchTransformDispatch
+import com.mogo.och.common.module.map.MapMakerManager
+import com.mogo.och.common.module.utils.OCHThreadPoolManager
+import com.mogo.och.common.module.utils.ResourcesUtils
+import com.mogo.och.common.module.utils.RxUtils
+import com.mogo.och.offline.R
+import com.mogo.och.offline.constant.BusConst
+import com.mogo.och.offline.repository.RepositoryManager
+import com.mogo.och.offline.repository.db.bean.TaskSiteDataBean
+import com.mogo.och.offline.util.OffLineTrajectoryManager
+import com.mogo.och.offline.util.ShuttleVoiceManager
+import com.mogo.och.offline.repository.exception.DataException
+import io.reactivex.Observer
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.disposables.Disposable
+import io.reactivex.schedulers.Schedulers
/**
* @author congtaowang
* @since 2021/3/23
- *
+ *
+ *
* 小巴订单管理
*/
-public class OrderModel {
- private final String TAG = OrderModel.class.getSimpleName();
- private int backgroundCurrentStationIndex = 0;//A->B 此处值是A站点索引
- private static volatile OrderModel sInstance;
- private Context mContext;
- private final List stationList = new ArrayList<>();
- private BusRoutesResult busRoutesResult = null;
+@SuppressLint("StaticFieldLeak")
+object OrderModel {
+ private val TAG: String = M_BUS+OrderModel::class.java.simpleName
+
+ private var mContext: Context? = null
+
/**
* 用来表示是否正在开往下一站
*/
- private boolean isGoingToNextStation = false;
- // 运营类型
- private static final int VEHICLE_TYPE = 10;
+ @JvmStatic
+ var isGoingToNextStation: Boolean = false
- private IRefreshBusStationsCallback refreshBusStationsCallback;
- private ISlidePannelHideCallback slidePanelHideCallback;
- private IBusControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等
- private IBusADASStatusCallback mADASStatusCallback;
+ @Volatile
+ private var isArrivedStation = false
- private volatile boolean isArrivedStation = false;
+ @JvmStatic
+ fun init() {
+ mContext = AbsMogoApplication.getApp()
- //0: 代表没有启动过 1代表是启动第一次,当>=1 代表是重试 每次到站/路线结束清空置为0
- private volatile int firstStartAutopilot = 0;
+ ThirdDeviceData.init()
- public static OrderModel getInstance() {
- if (sInstance == null) {
- synchronized (OrderModel.class) {
- if (sInstance == null) {
- sInstance = new OrderModel();
- }
- }
- }
- return sInstance;
+ OchAutoPilotStatusListenerManager.addListener(TAG, ochAutopilotStatusListener)
+
+ LineManager.addListener(TAG,arriveStationBySearch)
+
+ OchTransform.addListener(TAG,ochTransform)
+
+ RxUtils.errCatch()
}
- private OrderModel() {
-
- }
-
- public void init() {
- mContext = AbsMogoApplication.getApp();
- // 定位监听
- CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG, 5, mMapLocationListener);
-
- //开启自驾后 异常信息返回
- OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(mAdasStartFailureListener);
-
- OCHSocketMessageManager.INSTANCE.registerSocketMessageListener(//监听运营消息
- OCHSocketMessageManager.msgMonitorType,
- new OperateAction(true));
-
- AbnormalFactorsLoopManager.INSTANCE.startLoopAbnormalFactors(mContext);
-
- //监听乘客屏发来的消息
- CallerTelematicListenerManager.INSTANCE.addListener(TAG, mReceivedMsgListener);
-
- //2022.1.28
- // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃
- // The exception could not be delivered to the consumer because it has already canceled/disposed
- // the flow or the excTeption has nowhere to go to begin with
- RxJavaPlugins.setErrorHandler(new Consumer() {
- @Override
- public void accept(Throwable e) {
- if (e instanceof UndeliverableException) {
- e = e.getCause();
- CallerLogger.d(M_BUS + TAG, "UndeliverableException");
- }
- if ((e instanceof IOException)) {//
- // fine, irrelevant network problem or API that throws on cancellation
- CallerLogger.d(M_BUS + TAG, "IOException");
- return;
- }
- if (e instanceof InterruptedException) {
- // fine, some blocking code was interrupted by a dispose call
- CallerLogger.d(M_BUS + TAG, "InterruptedException");
- return;
- }
- if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) {
- // that's likely a bug in the application
- CallerLogger.d(M_BUS + TAG, "NullPointerException or IllegalArgumentException");
- Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
- return;
- }
- if (e instanceof IllegalStateException) {
- // that's a bug in RxJava or in a custom operator
- CallerLogger.d(M_BUS + TAG, "IllegalStateException");
- Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
- return;
- }
- CallerLogger.d(M_BUS + TAG, "Undeliverable exception");
- }
- });
- }
-
- private final IReceivedMsgListener mReceivedMsgListener =
- new IReceivedMsgListener() {
- @Override
- public void onFusionColor(boolean fusionColor) {
-
- }
-
- @Override
- public void onDemoMode(boolean isDemoMode) {
-
- }
-
- @Override
- public void onReceivedServerSn(@Nullable String sn) {
-
- }
-
- @Override
- public void onReceivedMsg(int type, @NonNull byte[] byteArray) {
- if (OchCommonConst.BUSINESS_STRING == type) {
- CallerLogger.d(M_BUS + BaseDPMsg.TAG, new String(byteArray));
- BaseDPMsg msg = GsonUtils.fromJson(new String(byteArray), BaseDPMsg.class);
- if (msg != null) {
- if (msg.getType() == DPMsgType.TYPE_TASK_DETAILS.getType()) {
- sendTaskDetailsToClients();
- }
- }
- }
- }
- };
-
- public void setAdasStatusCallback(IBusADASStatusCallback callback) {
- this.mADASStatusCallback = callback;
- }
-
- public void setRefreshBusStationsCallback(IRefreshBusStationsCallback callback) {
- this.refreshBusStationsCallback = callback;
- }
-
- public void setSlidePanelHideCallback(ISlidePannelHideCallback callback) {
- this.slidePanelHideCallback = callback;
- }
-
- public void setControllerStatusCallback(IBusControllerStatusCallback callback) {
- this.mControllerStatusCallback = callback;
- }
-
- public void release() {
-
+ @JvmStatic
+ fun release() {
// 注销定位监听
- CallerChassisLocationGCJ02ListenerManager.INSTANCE.removeListener(TAG);
- OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(null);
+ mContext = null
- OCHSocketMessageManager.INSTANCE.releaseSocketMessageListener(
- OCHSocketMessageManager.msgMonitorType);
- OCHSocketMessageManager.INSTANCE.releaseSocketMessageListener(
- OCHSocketMessageManager.msgWriteOffPassengerType);
+ ThirdDeviceData.release()
- AbnormalFactorsLoopManager.INSTANCE.stopLoopAbnormalFactors();
- //监听乘客屏发来的消息
- CallerTelematicListenerManager.INSTANCE.removeListener(TAG);
+ OchAutoPilotStatusListenerManager.removeListener(TAG)
+
+ LineManager.removeListener(TAG)
+ OchTransform.removeListener(TAG)
}
- private Object readResolve() {
- // 阻止反序列化,必须实现 Serializable 接口
- return sInstance;
+ private val ochAutopilotStatusListener = object : IOchAutopilotStatusListener{
+ override fun onAutopilotArriveAtStation(arrivedStation: ArrivedStation?) {
+ e(TAG, "行程日志-onAutopilotArriveAtStation arrive")
+ onArriveAt(arrivedStation, "底盘触发进站")
+ }
+
}
- private final OchAdasStartFailureCallback mAdasStartFailureListener = new OchAdasStartFailureCallback() {
-
- @Override
- public void onStartAutopilotSuccess(String type) {
- OrderModel.getInstance().triggerStartServiceEvent(
- OrderModel.getInstance().isRestartAutopilot(), true,2,type);
+ private val ochTransform = object : OchTransformDispatch {
+ override fun logout() {
+ logoutInner()
}
+ }
- @Override
- public void onStartAutopilotFailure(@NotNull String startFailedCode, @NonNull String startFailedMessage) {
- if (mADASStatusCallback != null && !FunctionBuildConfig.isDemoMode) {
- CallerLogger.e(M_BUS + TAG, "mAdasStartFailureListener = " + startFailedMessage);
- mADASStatusCallback.onStartAdasFailure();
- }
- }
- };
// 自车定位
- private final IMoGoChassisLocationGCJ02Listener mMapLocationListener = new IMoGoChassisLocationGCJ02Listener() {
-
- @Override
- public void onChassisLocationGCJ02(@Nullable MogoLocation mogoLocation) {
- if (null == mogoLocation) return;
- if (mControllerStatusCallback != null) {
- mControllerStatusCallback.onCarLocationChanged(mogoLocation);
- }
-
+ private val arriveStationBySearch = object : ILineCallback {
+ override fun arrivedStationSuccessBySearch() {
//是否到站的围栏判断 离站状态并且自动驾驶还未触发到站
if (isGoingToNextStation && !isArrivedStation) {
- OCHThreadPoolManager.getsInstance().locationExecute(new Runnable() {
- @Override
- public void run() {
- judgeArrivedStation(mogoLocation);
- }
- });
+ OCHThreadPoolManager.getsInstance().locationExecute {
+ onArriveAt(null, "兜底:距离站点15m内 每秒钟向底盘查询是否到站 底盘返回")
+ }
}
}
- };
- //根据围栏判断,是否到达站点
- private void judgeArrivedStation(MogoLocation location) {
-
- if (backgroundCurrentStationIndex + 1 > stationList.size() - 1) {
- CallerLogger.e(M_BUS + TAG, "到站数组越界");
- return;
+ override fun sendStartAutopilotSuccessAck() {
+ //底盘收到启动自驾的回执
+ BizLoopManager.setLoopFunction(TAG, LoopInfo(2, ::calculateDistanceAndAutoStatus,scheduler = Schedulers.io()))
}
- BusStationBean upcomingStation = stationList.get(backgroundCurrentStationIndex + 1);
-
- double startLon = upcomingStation.getGcjLon();
- double startLat = upcomingStation.getGcjLat();
- double distance = CoordinateUtils.calculateLineDistance(
+ }
+ // 在站点15m内且启动自动驾驶成功后播报,每次启动仅播报1次
+ private fun calculateDistanceAndAutoStatus() {
+ val (start, _) = LineManager.getStations()
+ if(start==null){
+ BizLoopManager.removeLoopFunction(TAG)
+ }else{
+ val startLon = start.gcjLon
+ val startLat = start.gcjLat
+ val mogoLocation = OchLocationManager.getGCJ02Location()
+ val distance = CoordinateUtils.calculateLineDistance(
startLon, startLat,
- location.getLongitude(), location.getLatitude());
-
- if (distance <= BusConst.ARRIVE_AT_END_STATION_DISTANCE) {
- CallerLogger.d(M_BUS + TAG, "行程日志-judgeArrivedStation() distance = " + distance
- + " to " + upcomingStation.getName());
- onArriveAt(null, "兜底:根据定位计算到站");
- }
- }
-
- public void queryBusCacheRoutes() {
- String cacheData = CacheDataManager.Companion.getInstance().getCacheData(mContext,
- BusCacheKey.BUS_LINE_CACHE);
-
- if (!StringUtils.isEmpty(cacheData)) {
- BusTransferData data = GsonUtils.fromJson(cacheData, BusTransferData.class);
- BusRoutesResult routesResult = data.getRoutesResult();
- getCacheRouteSuccess(routesResult);
- }else {
- LineManager.INSTANCE.setContraiInfo(null);
- LineManager.setLineInfo(null);
- if (refreshBusStationsCallback != null) {
- refreshBusStationsCallback.updateEmptyUi();
+ mogoLocation.longitude, mogoLocation.latitude
+ )
+ if (distance < BusConst.SEND_OUTVOICE_DISTANCES_TARTSTATIONE) {
+ if(OchAutoPilotStatusListenerManager.autopilotState==IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){
+ ShuttleVoiceManager.arrivedStationOut(ResourcesUtils.getString(R.string.m2_voice_out_autopilot_start_in15m))
+ BizLoopManager.removeLoopFunction(TAG)
+ }
+ }else{
+ BizLoopManager.removeLoopFunction(TAG)
}
- clearAutopilotControlParameters();
- closeBeautificationMode();
- clearStartAutopilotTag();
- removeTipRunnables();
- CacheDataManager.Companion.getInstance().clearCacheData(mContext, BusCacheKey.BUS_LINE_CACHE);
}
}
- private void getCacheRouteSuccess(BusRoutesResult data) {
- if (data == null || data.getSites() == null
- || data.getSites().isEmpty()) {
- //当为空时,显示无绑定路线图
- CacheDataManager.Companion.getInstance().clearCacheData(mContext, BusCacheKey.BUS_LINE_CACHE);
- return;
- }
- CallerLogger.d(M_BUS + TAG, "获取到小巴路线数据: " + GsonUtils.toJson(data));
- updateBusStatus(data);
- }
/**
* 查询小巴路线
*/
- public void queryBusRoutes() {
- queryBusCacheRoutes();
- }
-
- /**
- * 更新正在运行的任务UI
- *
- * @param stations
- */
- private void updateBusTaskStatus(List stations) {
-
- int arrivingOrArrivedStationIndex = 0;//已经到站或者即将到站的索引呢
-
- for (int i = 0; i < stations.size(); i++) {
- BusStationBean station = stations.get(i);
-
- if (i == 0) { // 首发站 显示在最上面
- if (station.getDrivingStatus() == STATION_STATUS_STOPPED
- && !station.isLeaving()) { //到达第一站
- arrivingOrArrivedStationIndex = i;
- break;
+ @JvmStatic
+ fun queryBusRoutes() {
+ d(TAG, "查询小巴路线")
+ RepositoryManager.loadCurrentTaskInfo()
+ ?.subscribeOn(Schedulers.io())
+ ?.observeOn(AndroidSchedulers.mainThread())
+ ?.subscribe(object : Observer {
+ override fun onSubscribe(d: Disposable) {
+ d(TAG, "queryBusRoutes onSubscribe")
}
- } else {
- BusStationBean preStation = stations.get(i - 1);
- if ((station.getDrivingStatus() == STATION_STATUS_STOPPED && !station.isLeaving())
- || (station.getDrivingStatus() == STATION_STATUS_ARRIVING
- && preStation.isLeaving())) {
- //到站未离开 | 即将到站 显示在最中间
- arrivingOrArrivedStationIndex = i;
- break;
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ d(TAG, "queryBusRoutes onError${e.printStackTrace()}")
+ e.printStackTrace()
+ LineModel.haveNoRunningTask()
+ d(TAG, "queryBusRoutes 获取到小巴路线数据:空 ")
+ LineManager.setLineInfo(null)
+ updateBusStatus()
+ closeBeautificationMode()
}
- }
- }
- BusStationBean arrivingOrArrivedStation = stations.get(arrivingOrArrivedStationIndex);
+ override fun onComplete() {
+ d(TAG, "queryBusRoutes onComplete")
+ }
- String lineTime = DateTimeUtil.formatLongToString(
- busRoutesResult.getTaskTime(),
- DateTimeUtil.HH_mm);
+ override fun onNext(data: Boolean) {
+ if(data){
+ LineModel.haveRunningTask()
+ updateBusStatus()
+ }else{
+ LineModel.haveNoRunningTask()
+ d(TAG, "queryBusRoutes 获取到小巴路线数据:空 ")
+ LineManager.setLineInfo(null)
+ updateBusStatus()
+ closeBeautificationMode()
+ }
+ }
- if (arrivingOrArrivedStationIndex == 0 ||
- arrivingOrArrivedStation.getDrivingStatus() == STATION_STATUS_STOPPED
- && !arrivingOrArrivedStation.isLeaving()) {
- if (refreshBusStationsCallback != null) {
- refreshBusStationsCallback.updateBusTaskStatus(busRoutesResult.getName(), lineTime,
- stationList, arrivingOrArrivedStationIndex, true);
- }
- clearAutopilotControlParameters();
- } else {
- if (refreshBusStationsCallback != null) {
- refreshBusStationsCallback.updateBusTaskStatus(busRoutesResult.getName(), lineTime,
- stationList, arrivingOrArrivedStationIndex, false);
- }
- updateAutopilotControlParameters();
- }
+ })
}
/**
* 重置路线站点状态--结束路线,当前路线恢复到始发站
*/
- public void abortTask() {
- CallerLogger.d(M_BUS + TAG, "结束当前路线abortTask");
- if (busRoutesResult == null) {
- ToastUtils.showLong("数据异常、请稍后再试");
- return;
- }
- endOrAbortTaskSuccess();
- clearBusStationDatas();
- queryBusRoutes();
- removeTipRunnables();
- // 取消自驾
- CallerAutoPilotControlManager.INSTANCE.cancelAutoPilot();
- setTrajectoryStation(null, null, -1L);
- }
-
- /**
- * 中断或者正常结束任务后的处理
- */
- private void endOrAbortTaskSuccess() {
-
- isGoingToNextStation = false;
- backgroundCurrentStationIndex = 0;
-
- if (busRoutesResult != null) {
- LedScreenManager.sendTripInfo2Led(LedScreenManager.END_TRIP
- , busRoutesResult.getName()
- , ""
- , ""
- , false);
- }
-
- CacheDataManager.Companion.getInstance().clearCacheData(mContext, BusCacheKey.BUS_LINE_CACHE);
- busRoutesResult = null;
-
- sendTaskDetailsToClients();
- }
-
- /**
- * 离站上报成功后渲染站点
- * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站,
- * 车机端展示是离开当前站,下一站设置为当前站, 所以服务端数据回来要做处理,不能直接渲染
- */
- private void leaveStationSuccess(int leaveIndex, String leaveStation,
- String nextStation, String nextStationKr) {
-
- onStartAutopilot(leaveIndex);
-
- leaveTTSTips(nextStation, nextStationKr);
-
- sendStartStationToClient(nextStation);
-
- if (busRoutesResult != null) {
- boolean isLastStop = false;
- if (leaveIndex + 1 == stationList.size() - 1) {
- isLastStop = true;
- }
- //给bus外屏发送
- LedScreenManager.sendTripInfo2Led(LedScreenManager.LEAVE_STATION
- , busRoutesResult.getName()
- , leaveStation
- , nextStation
- , isLastStop);
- }
-
- reBuildCacheRouteData(leaveIndex, BusConst.STATION_STATUS_STOPPED, true);
- }
-
- private void reBuildCacheRouteData(int currentIndex, int currentDrivingStatus, boolean isLeaving) {
- if (busRoutesResult != null) {
- List sites = busRoutesResult.getSites();
- BusStationBean bean = sites.get(currentIndex);
- bean.setDrivingStatus(currentDrivingStatus);
- bean.setLeaving(isLeaving);
- sites.set(currentIndex, bean);
- if (currentDrivingStatus == STATION_STATUS_STOPPED && !isLeaving) {
- BusStationBean beanPre = sites.get(currentIndex - 1);
- beanPre.setDrivingStatus(BusConst.STATION_STATUS_LEAVING);
- beanPre.setLeaving(false);
- sites.set(currentIndex - 1, beanPre);
- }
- //busRoutesResult.setSite(sites);
-
- pushCacheTransferData(busRoutesResult);
-
- updateBusStatus(busRoutesResult);
+ @JvmStatic
+ fun completeTask() {
+ OCHThreadPoolManager.getsInstance().execute {
+ d(TAG, "结束当前路线abortTask")
+ LineModel.endTask()
}
}
- private void onStartAutopilot(int leaveIndex) {
+ private fun onStartAutopilot() {
//开启自动驾驶 2.10.0: 如果自动驾驶状态下开启, 非自动驾驶状态下不开启,需手动点击自动驾驶按钮开启
- isGoingToNextStation = true;
- if (CallerAutoPilotStatusListenerManager.INSTANCE.getState()
- == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
- startAutopilot(false, leaveIndex);
- } else {
- firstStartAutopilot = 0;
+ isGoingToNextStation = true
+ if (CallerAutoPilotStatusListenerManager.getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
+ ) {
+ LineManager.startAutopilot()
}
}
- /**
- * 开启自动驾驶
- *
- * @param isRestart
- */
- private void startAutopilot(boolean isRestart, int leaveIndex) {
-
- /**
- * 存在Session
- */
- if (!OchAutoPilotManager.canStartAutopilotBySessionId()) {
- return;
- }
-
- OchAutopilotAnalytics.INSTANCE.triggerClickStartAutopilotTime(System.currentTimeMillis());
-
- //1、判断轨迹url是否可用
- if (busRoutesResult != null) {
- //根据开关和后台是否发布轨迹启动自驾
- if (FunctionBuildConfig.isPassStartAutopilotCommand
- && TextUtils.isEmpty(busRoutesResult.csvFileUrl)
- && TextUtils.isEmpty(busRoutesResult.csvFileUrlDPQP)
- ) {
- ToastUtils.showLong("无发布轨迹, 请发布后重试");
- CallerLogger.e(
- TAG, "isPassStartAutopilotCommand = " +
- FunctionBuildConfig.isPassStartAutopilotCommand
- + "busRoutesResult.csvFileUrl = " + busRoutesResult.csvFileUrl
- );
- return;
- }
- }
- //2、6个条件判断
- if (!CallerAutoPilotControlManager.INSTANCE.isCanStartAutopilot(true, 0)) {
- return;
- }
- // 3、距离轨迹15m计算
- //3、距离轨迹15m计算
- String resion = TrajectoryAndDistanceManager.INSTANCE.canStartAutopilot((long) busRoutesResult.getLineId());
- if (TrajectoryAndDistanceManager.errorTypeNoneLineId.equals(resion)) {
- BusStationBean nextStation = new BusStationBean();
- if (backgroundCurrentStationIndex < stationList.size() - 1) {
- nextStation = stationList.get(backgroundCurrentStationIndex + 1);
- }
- BusStationBean busStationBean = stationList.get(backgroundCurrentStationIndex);
- setTrajectoryStation(busStationBean, nextStation, (long) busRoutesResult.getLineId());
- resion = TrajectoryAndDistanceManager.INSTANCE.canStartAutopilot((long) busRoutesResult.getLineId());
- }
- if (!StringUtils.isEmpty(resion)) {
- ToastUtils.showShort(resion);
- VoiceNotice.showNotice(resion);
- return;
- }
- //4、ssm 给出数据
- if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().getAutopilotAbilityStatus()) {
- ToastUtils.showLong(OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason() +
- ", 请稍候重试");
- triggerUnableStartAPReasonEvent();
- return;
- }
-
- firstStartAutopilot++;
-
- triggerStartServiceEvent(isRestart, false,0,"");
-
- AutopilotControlParameters parameters = initAutopilotControlParameters(leaveIndex);
- if (null == parameters) {
- CallerLogger.e(M_BUS + TAG, "行程日志-AutopilotControlParameters is empty.");
- return;
- }
-
- long sessionId = OchAutoPilotManager.startAutoPilot(parameters);
- triggerUpdateStartAutoPilotSessionId(sessionId);
-
- CallerLogger.d(M_BUS + TAG, "行程日志-开启自动驾驶====" + GsonUtil.jsonFromObject(parameters)
- + " startLatLon=" + parameters.startName + ",endLatLon=" + parameters.endName +
- "isRestart = " + isRestart);
-
- if (mControllerStatusCallback != null) {
- mControllerStatusCallback.startOpenAutopilot();
- }
+ @JvmStatic
+ fun startBeautificationMode() {
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true
+ CallerAutoPilotControlManager.setIgnoreConditionDraw(true)
+ CallerAutoPilotControlManager.setIPCDemoMode(true)
}
- /**
- * 到站后重置站点状态
- */
- private void arriveSiteStation(String changeInfo) {
- OchChainLogManager.writeChainLog("触发进站", changeInfo,
- true, OchChainLogManager.EVENT_KEY_INFE_WITH_BUS);
- if (backgroundCurrentStationIndex + 1 > stationList.size() - 1) { //到站短时间内调用多次
- CallerLogger.e(M_BUS + TAG, "数组越界");
- return;
- }
- int arrivedStationIndex = backgroundCurrentStationIndex + 1;
- String arriveStation = stationList.get(arrivedStationIndex).getName();
- String arriveStationKr = stationList.get(arrivedStationIndex).getNameKr();
- String departureStopName = stationList.get(backgroundCurrentStationIndex).getName();
- CallerLogger.d(M_BUS + TAG, "arriveSiteStation-currentStationIndex = " + arrivedStationIndex);
-
- isArrivedStation = true;
- isGoingToNextStation = false;
-
- arriveStationSuccess(arrivedStationIndex, departureStopName,
- arriveStation, arriveStationKr);
- }
-
- private void arriveStationSuccess(int arrivedStationIndex, String departureStopName,
- String arriveStation, String arriveStationKr) {
- if (busRoutesResult != null) {
- boolean isLastStop = false;
- if (arrivedStationIndex == busRoutesResult.getSites().size() - 1) {
- isLastStop = true;
- }
- //给bus外屏发送
- LedScreenManager.sendTripInfo2Led(LedScreenManager.ARRIVE_STATION
- , busRoutesResult.getName()
- , departureStopName
- , arriveStation
- , isLastStop);
- }
-
- ShuttleVoiceManager.INSTANCE.arrivedStationBus(arriveStation, arriveStationKr);
-
- sendArrivedStationToClient(arriveStation);
-
- reBuildCacheRouteData(arrivedStationIndex, BusConst.STATION_STATUS_STOPPED, false);
- }
-
- private void sendTaskDetailsToClients() {
-
- BusTransferData data = new BusTransferData(LoginStatusManager.isLogin() ? 1 : 0, busRoutesResult);
- TaskDetailsMsg msg = new TaskDetailsMsg(GsonUtils.toJson(data), BusinessType.shuttle);
- CallerLogger.d(M_BUS + TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(msg));
- LanSocketManager.sendMsgToClient(msg);
- }
-
- public void pushCacheTransferData(BusRoutesResult result) {
- BusTransferData data = new BusTransferData(LoginStatusManager.isLogin() ? 1 : 0, result);
- CallerLogger.d(M_BUS + TAG, "pushCacheTransferData = " + GsonUtils.toJson(data));
- CacheDataManager.Companion.getInstance().putCacheData(mContext,
- BusCacheKey.BUS_LINE_CACHE,
- GsonUtils.toJson(data));
- }
-
- private void sendArrivedStationToClient(String arriveStation) {
- AppConnectMsg arrivedMsg = new AppConnectMsg(false, true, String.format(mContext
- .getString(R.string.bus_arrived_station_tip),
- arriveStation), -1);
- LanSocketManager.sendMsgToClient(arrivedMsg);
- }
-
- private void sendStartStationToClient(String nextStation) {
- AppConnectMsg startMsg = new AppConnectMsg(false, true, String.format(mContext
- .getString(R.string.bus_leave_station_tip),
- nextStation), -1);
-
- UiThreadHandler.postDelayed(() -> LanSocketManager.sendMsgToClient(startMsg), DELAY_10S);
- }
-
- private void sendEndTaskToClient() {
- AppConnectMsg endMsg = new AppConnectMsg(false, true,
- SkinResources.getInstance().getString(R.string.bus_end_task_tip), -1);
- LanSocketManager.sendMsgToClient(endMsg);
- }
-
- public void sendWriteOffNumToClient(String msg) {
- AppConnectMsg passengerMsg = new AppConnectMsg(false, true, msg, -1);
- LanSocketManager.sendMsgToClient(passengerMsg);
- }
-
- /**
- * 离站上报
- */
- public void leaveStation() {
- CallerLogger.d(M_BUS + TAG, "leaveStation-backgroundCurrentStationIndex = " + backgroundCurrentStationIndex);
- if (busRoutesResult == null) {
- ToastUtils.showLong("数据异常、请稍后再试");
- return;
- }
- String nextStationName = "";
- String nextStationNameKr = "";
- BusStationBean nextStation = new BusStationBean();
- if (backgroundCurrentStationIndex < stationList.size() - 1) {
- nextStation = stationList.get(backgroundCurrentStationIndex + 1);
- nextStationName = nextStation.getName();
- nextStationNameKr = nextStation.getNameKr();
- }
- final String currentStationName = stationList.get(backgroundCurrentStationIndex).getName();
- String finalNextStationName = nextStationName;
- String finalNextStationNameKr = nextStationNameKr;
-
- isArrivedStation = false;
- CallerLogger.d(M_BUS + TAG, "行程日志-离站成功开往下一站====");
-
- leaveStationSuccess(backgroundCurrentStationIndex, currentStationName,
- finalNextStationName, finalNextStationNameKr);
-
- BusStationBean busStationBean = stationList.get(backgroundCurrentStationIndex);
- setTrajectoryStation(busStationBean, nextStation, (long) busRoutesResult.getLineId());
-
- String changeInfo = "taskId:" + busRoutesResult.getTaskId() + "--lineId:" + busRoutesResult.getLineId() +
- "--currentStationName:" + currentStationName + "--finalNextStationName:" + finalNextStationName;
- OchChainLogManager.writeChainLog("滑动出发", changeInfo,
- true, OchChainLogManager.EVENT_KEY_INFE_WITH_BUS);
- }
-
- //车站10s后播报
- private void leaveTTSTips(String nextStation, String nextStationKr) {
- UiThreadHandler.postDelayed(new Runnable() {
- @Override
- public void run() {//延迟10s播报
- ShuttleVoiceManager.INSTANCE.leaveStationBus(nextStation, nextStationKr);
- }
- }, DELAY_10S);
-
- }
/**
* 关闭美化模式
*/
- public void closeBeautificationMode() {
- if (FunctionBuildConfig.isDemoMode) {//收车结束美化
- FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false; //是否强制绘制引导线
- CallerAutoPilotControlManager.INSTANCE.setIgnoreConditionDraw(false);// 同步给乘客屏
- CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(false);//是否自动启动自驾
- CallerLogger.d(M_BUS + TAG, "美化模式-ignore:置为false");
+ @JvmStatic
+ fun closeBeautificationMode() {
+ if (FunctionBuildConfig.isDemoMode) { //收车结束美化
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false //是否强制绘制引导线
+ CallerAutoPilotControlManager.setIgnoreConditionDraw(false) // 同步给乘客屏
+ CallerAutoPilotControlManager.setIPCDemoMode(false) //是否自动启动自驾
+ d(TAG, "美化模式-ignore:置为false")
}
}
/**
- * 开启自动驾驶到下一站
+ * 滑动出发
*/
- public void autoDriveToNextStation() {
- if (backgroundCurrentStationIndex >= stationList.size() - 1) {
+ @JvmStatic
+ fun driveToNextStation() {
+ if (LineModel.isLastStation()==true) {
// 当前站是最后一站,结束当前行程
- travelOver();
- return;
+ completeTask()
+ return
}
- leaveStation();
+
+ LineManager.getStations().first?.let {startStation->
+ startStation.drivingStatus = TaskSiteDataBean.drivingStatusCurrent
+ startStation.isLeaving = true
+ LineModel.currentTask?.let { task->
+ RepositoryManager.leaveStation(
+ task.taskId?:0L,
+ )
+ ?.subscribeOn(Schedulers.io())
+ ?.observeOn(AndroidSchedulers.mainThread())
+ ?.subscribe(object : Observer {
+ override fun onSubscribe(d: Disposable) {
+ d(TAG, "onSubscribe")
+ }
+
+ override fun onError(e: Throwable) {
+ d(TAG, "onError${e.printStackTrace()}")
+ if (e is DataException) {
+ e.printStackTrace()
+ }
+ LineModel.leaveStationSuccess()
+ isArrivedStation = false
+ onStartAutopilot()
+
+ ThirdDeviceData.leaveStation()
+
+ updateBusStatus()
+
+ LineModel.callEyeMap(3)
+ }
+
+ override fun onComplete() {
+ d(TAG, "onComplete")
+ }
+
+ override fun onNext(data: Boolean) {
+ if (data) {
+ LineModel.leaveStationSuccess()
+ isArrivedStation = false
+ onStartAutopilot()
+
+ ThirdDeviceData.leaveStation()
+
+ updateBusStatus()
+ LineModel.callEyeMap(4)
+ }
+ }
+ })
+ }
+ }
+
}
/**
* 渲染站点信息
* 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站,
* 车机端展示 三站: 中间为即将到到达或者刚到达的站
- *
- * @param result
+ * queryBusRoutes
+ * queryBusRoutes
+ * queryBusRoutes
+ * driveToNextStation
+ * onArriveAt
*/
- private void updateBusStatus(BusRoutesResult result) {
- if (result == null) return;
- LineManager.INSTANCE.setContraiInfo(new ContraiInfo(result.getLineId(),result.csvFileUrl,result.csvFileMd5,result.txtFileUrl,result.txtFileMd5,result.contrailSaveTime,null,null,1));
- HashMap map = new HashMap();
- String taskInfo = DateTimeUtil.formatLongToString(
- result.getTaskTime(), DateTimeUtil.HH_mm
- );
- map.put("taskInfo",taskInfo);
- LineManager.setLineInfo(new LineInfo(result.getLineId(),result.getName(),map,result.getTaskId()+""));
- busRoutesResult = result;
- stationList.clear();
- stationList.addAll(result.getSites());
- for (int i = 0; i < stationList.size(); i++) {
- BusStationBean s = stationList.get(i);
-
- CallerLogger.d(M_BUS + "updateBusStationsStatus--",
- "Index=" + i + " ,name = " + s.getName() + " ," + s.isLeaving() + "," + s.getDrivingStatus());
-
- // 是否正在开往下一站
- if (s.isLeaving()) {
- isGoingToNextStation = true;
- }
- // 当前站点信息
- if (s.getDrivingStatus() == STATION_STATUS_STOPPED) {
- backgroundCurrentStationIndex = i;
- break;
+ private fun updateBusStatus() {
+ val (startStation, endStation) = LineManager.getStations()
+ if(startStation!=null&&endStation!=null){
+ if(startStation.isLeaving){// 出发需要移除
+ MapMakerManager.removeMapMaker(BusConst.BUS_START_MAP_MAKER,startStation.lat,startStation.lon)
+ }else{// 为出发展示
+ MapMakerManager.addMapMaker(TAG, BusConst.BUS_START_MAP_MAKER,startStation.lat,startStation.lon,R.raw.star_marker)
}
+ MapMakerManager.addMapMaker(TAG, BusConst.BUS_END_MAP_MAKER,endStation.lat,endStation.lon,R.raw.end_marker)
+ }else{
+ MapMakerManager.removeAllMapMarkerByOwner(TAG)
}
- if (backgroundCurrentStationIndex == 0 &&
- stationList.get(0).getDrivingStatus() == STATION_STATUS_STOPPED
- && !stationList.get(0).isLeaving()) { //默认是第一站到站查询
- if (busRoutesResult != null) { // 第一站到站也是行程开始的时候
- LedScreenManager.sendTripInfo2Led(LedScreenManager.START_TRIP
- , busRoutesResult.getName(), "", "", false);
+ LineModel.stationList?.let {
+ if (LineModel.startTaskMessage()) { //默认是第一站到站查询
+ LineManager.lineInfos?.lineName?.let { lineName->
+ LedScreenManager.sendTripInfo2Led(
+ LedScreenManager.START_TRIP,
+ lineName, "", "", false
+ )
+ }
}
- //任务选择后首发前给司机提示任务
- if (busRoutesResult != null) {
- beforeTaskTips();
+
+ LineModel.setDemoMode()
+
+ LineManager.getStartStation {
+ isGoingToNextStation = it.isLeaving
}
- } else {
- removeTipRunnables();
+
+ ThirdDeviceData.sendTaskDetailsToClients()
+
+ //需放在currentStationIndex赋值之后
+ OffLineTrajectoryManager.syncTrajectoryInfo()
}
-
- BusStationBean currentStation = stationList.get(backgroundCurrentStationIndex);
-
- CallerLogger.d(M_BUS + TAG,
- "行程日志-STATION_STATUS_STOPPED-backgroundCurrentStationIndex="
- + backgroundCurrentStationIndex
- + " isLeaving()=" + currentStation.isLeaving());
-
- // 美化是否开始
- if (FunctionBuildConfig.isDemoMode && (backgroundCurrentStationIndex >= 0
- && backgroundCurrentStationIndex <= stationList.size() - 1)) {//行驶过程中设置美化
- if (stationList.get(backgroundCurrentStationIndex).isLeaving()) {
- startBeautificationMode();
- CallerLogger.d(M_BUS + TAG, "美化模式-ignore:置为true(每次滑动出发)");
- } else if (backgroundCurrentStationIndex > 0 && backgroundCurrentStationIndex < stationList.size() - 1) {
- //美化模式下 中间站点到站 引导线要一直绘制,所以此处不出强制绘制不传false
- CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(false);
- CallerLogger.d(M_BUS + TAG, "美化模式-ignore:false(到达中间站)");
- clearStartAutopilotTag();
- } else {
- closeBeautificationMode();
- clearStartAutopilotTag();
- }
- }
-
-
- if (currentStation.isLeaving() && slidePanelHideCallback != null) {
- slidePanelHideCallback.hideSlidePanel();
- }
-
- sendTaskDetailsToClients();
-
- //更新bus路线面板
- updateBusTaskStatus(stationList);
-
- //需放在currentStationIndex赋值之后
- OffLineTrajectoryManager.INSTANCE.syncTrajectoryInfo();
- }
-
- private void beforeTaskTips() {
- if (busRoutesResult == null) return;
-
- removeTipRunnables();
-
- long taskTime = busRoutesResult.getTaskTime();
- long tip3Time = taskTime - 3 * 60 * 1000 - DateTimeUtil.getCurrentTimeStamp(); // 首站离开前3分钟提示
- long tip1Time = taskTime - 60 * 1000 - DateTimeUtil.getCurrentTimeStamp(); // 首站离开前1分钟提示
-
- if (tip3Time > 0) {
- UiThreadHandler.postDelayed(tip3Runnable, tip3Time);
- }
-
- if (tip1Time > 0) {
- UiThreadHandler.postDelayed(tip1Runnable, tip1Time);
- }
- }
-
- Runnable tip3Runnable = new Runnable() {
- @Override
- public void run() {
-
- if (backgroundCurrentStationIndex == 0 && stationList.get(0).getDrivingStatus() == STATION_STATUS_STOPPED
- && !stationList.get(0).isLeaving()) {
- tipStartTask("3");
- } else {
- removeTipRunnables();
- }
- }
- };
-
- private void tipStartTask(String s) {
- String tips = String.format(mContext
- .getString(R.string.bus_before_tips_s), s);
- //展示在运营消息
- OCHSocketMessageManager.INSTANCE.pushAppOperationalMsgBox(
- DateTimeUtil.getCurrentTimeStamp(),
- tips, OCHSocketMessageManager.OPERATION_SYSTEM);
- ShuttleVoiceManager.INSTANCE.showLeafTime(tips);
- }
-
- Runnable tip1Runnable = new Runnable() {
- @Override
- public void run() {
- if (backgroundCurrentStationIndex == 0 && stationList != null &&
- stationList.get(0).getDrivingStatus() == STATION_STATUS_STOPPED
- && !stationList.get(0).isLeaving()) {
- tipStartTask("1");
- } else {
- removeTipRunnables();
- }
- }
- };
-
- public void removeTipRunnables() {
- if (tip3Runnable != null) {
- UiThreadHandler.removeCallbacks(tip3Runnable);
- }
- if (tip1Runnable != null) {
- UiThreadHandler.removeCallbacks(tip1Runnable);
- }
- }
-
- private void clearStartAutopilotTag() {
- firstStartAutopilot = 0;
- }
-
- private void startBeautificationMode() {
- FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true;
- CallerAutoPilotControlManager.INSTANCE.setIgnoreConditionDraw(true);
- CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(true);
- }
-
- public void clearBusStationDatas() {
- if (refreshBusStationsCallback != null) {
- refreshBusStationsCallback.clearBusStationsMarkers();
- }
- }
-
- /**
- * 在踩刹车、控制方向盘等操作后,会停止自动驾驶,重启自动驾驶的话相当于重新设置自动驾驶目的地
- */
- public void restartAutopilot() {
- CallerLogger.d(M_BUS + TAG, "行程日志-重启自动驾驶===" + isGoingToNextStation);
- //只去启动自动驾驶,不再去上报离站
- startAutopilot(firstStartAutopilot >= 1, -1);
- }
-
- public boolean isRestartAutopilot() {
- return firstStartAutopilot > 1;
- }
-
- /**
- * 行程结束
- */
- private void travelOver() {
-
- if (backgroundCurrentStationIndex >= stationList.size()) {
- CallerLogger.e(M_BUS + TAG, "travel over index out of station list");
- return;
- }
- CallerLogger.d(M_BUS + TAG, "单程结束====");
- CallerAutoPilotControlManager.INSTANCE.cancelAutoPilot();
- setTrajectoryStation(null, null, -1L);
- endTask();
- }
-
- /**
- * task正常结束
- */
- private void endTask() {
- CallerLogger.d(M_BUS + TAG, "任务正常走完endTask()");
- endOrAbortTaskSuccess();
- clearBusStationDatas();
- queryBusRoutes();// 重新获取任务
- removeTipRunnables();
- ShuttleVoiceManager.INSTANCE.endOrderBus();
- sendEndTaskToClient();
}
/**
@@ -963,172 +349,101 @@ public class OrderModel {
*
* @param data
*/
- public void onArriveAt(ArrivedStation data, String type) {
- if (backgroundCurrentStationIndex + 1 > stationList.size() - 1) {
- CallerLogger.e(M_BUS + TAG, "行程日志-到站异常,取消后续操作结束");
- return;
+ @JvmStatic
+ fun onArriveAt(data: ArrivedStation?, type: String) {
+ if (LineManager.getStations().second==null) {
+ e(TAG, "行程日志-到站异常,取消后续操作结束")
+ OchChainLogManager.writeChainLog("shuttle弱网","$type 行程日志-到站异常,取消后续操作结束")
+ return
+ }
+ if(data!=null) {
+ d(TAG,"地盘到站${data}")
}
//MAP 280 每隔100ms左右返回一次到站, 导致在到达中间站后再次滑动出发后会有时间差,收到一次到站,出现问题
//此处比对 自驾告诉的到站站点坐标和本地应到站站点坐标, 一致时才能到站
- if (data != null && data.getEndLocation() != null) {
+ LineManager.getStations { start, end ->
- String latitude = NumberFormatUtil.cutOutNumber(data.getEndLocation().getLatitude(), 5); //wgs
- String longitude = NumberFormatUtil.cutOutNumber(data.getEndLocation().getLongitude(), 5);
+ if (isArrivedStation) return@getStations
- int arrivedStationIndex = backgroundCurrentStationIndex + 1;
- BusStationBean arriveStation = stationList.get(arrivedStationIndex);
- String arriveLat = NumberFormatUtil.cutOutNumber(arriveStation.getLat(), 5);
- String arriveLon = NumberFormatUtil.cutOutNumber(arriveStation.getLon(), 5);
+ OchChainLogManager.writeChainLog("触发进站", type)
+ isArrivedStation = true
+ isGoingToNextStation = false
+ start.drivingStatus = TaskSiteDataBean.drivingStatusPassed
+ start.isLeaving = false
+ end.drivingStatus = TaskSiteDataBean.drivingStatusCurrent
+ RepositoryManager.arriveStation(LineModel.currentTask?.taskId?:0L)
+ ?.subscribeOn(Schedulers.io())
+ ?.observeOn(AndroidSchedulers.mainThread())
+ ?.subscribe(object : Observer {
+ override fun onSubscribe(d: Disposable) {
+ d(TAG, "onSubscribe")
+ }
+
+ override fun onError(e: Throwable) {
+ d(TAG, "onError${e.printStackTrace()}")
+ if (e is DataException) {
+ e.printStackTrace()
+ }
+ ThirdDeviceData.arriveStation()
+ d(TAG, "arrivedStation onComplete")
+ LineModel.stationList?.let {
+ LineModel.startStationIndex +=1
+ val startStation = LineManager.getStations().second
+ if(LineModel.startStationIndex +1< it.size){
+ val endStation = it[LineModel.startStationIndex +1]
+ LineManager.setStartAndEndStation(startStation,endStation)
+ LineModel.callEyeMap(5)
+ }
+ }
+ LineModel.arrivedStationSuccess()
+ updateBusStatus()
+ }
+
+ override fun onComplete() {
+ ThirdDeviceData.arriveStation()
+ d(TAG, "arrivedStation onComplete")
+ LineModel.stationList?.let {
+ LineModel.startStationIndex +=1
+ val startStation = LineManager.getStations().second
+ if(LineModel.startStationIndex +1< it.size){
+ val endStation = it[LineModel.startStationIndex +1]
+ LineManager.setStartAndEndStation(startStation,endStation)
+ LineModel.callEyeMap(6)
+ }
+ }
+ LineModel.arrivedStationSuccess()
+ updateBusStatus()
+ }
+
+ override fun onNext(data: Boolean) {
+
+ }
+ })
- if (!latitude.equals(arriveLat) || !longitude.equals(arriveLon)) {
- CallerLogger.e(M_BUS + TAG, "行程日志-到站拦截,到站坐标不一致");
- return;
- }
}
- if (isArrivedStation) return;
-
- CallerLogger.d(M_BUS + TAG, "行程日志-当前==backgroundCurrentStationIndex="
- + backgroundCurrentStationIndex);
-
- arriveSiteStation(type);
- }
-
- public boolean isGoingToNextStation() {
- return isGoingToNextStation;
}
// 登出
- public void logout() {
- MogoLocation gcj02 = CallerChassisLocationGCJ02ListenerManager.INSTANCE.getChassisLocationGCJ02();
- LoginStatusManager.loginOut();
- }
-
- public void triggerStartServiceEvent(boolean isRestart, boolean send,int source,String type) {
- if (stationList == null || backgroundCurrentStationIndex >= stationList.size() - 1) {
- return;
+ @JvmStatic
+ fun logoutInner() {
+ ThreadUtils.getIoPool().execute {
+// try {
+// if(RepositoryManager.haveDataWaitSyn()){
+// ToastUtils.showShort(ResourcesUtils.getString(R.string.shuttle_logout_error))
+// return@execute
+// }
+// if(RepositoryManager.haveRunningTask()){
+// ToastUtils.showShort(ResourcesUtils.getString(R.string.shuttle_logout_error_running))
+// return@execute
+// }
+// }catch (e:Exception){
+// OchChainLogManager.writeChainLog("错误","${e.message}")
+// }
+ MapMakerManager.removeAllMapMarkerByOwner(TAG)
+ OffLineTrajectoryManager.stopTrajReqLoop()
+ LoginStatusManager.loginOut()
}
- BusStationBean currentStation = stationList.get(backgroundCurrentStationIndex);
- BusStationBean nextStation = stationList.get(backgroundCurrentStationIndex + 1);
- OchAutopilotAnalytics.INSTANCE.triggerStartAutopilotEvent(isRestart, send,
- currentStation.getName(), nextStation.getName(), busRoutesResult.getLineId(), "", System.currentTimeMillis(),type,source);
}
-
- public void triggerUpdateStartAutoPilotSessionId(long sessionId) {
- if (stationList == null || backgroundCurrentStationIndex >= stationList.size() - 1) {
- return;
- }
- OchAutopilotAnalytics.INSTANCE.triggerUpdateStartAutoPilotSessionId(sessionId);
- }
-
- public void triggerUnableStartAPReasonEvent() {
- if (stationList == null || backgroundCurrentStationIndex >= stationList.size() - 1) {
- return;
- }
- BusStationBean currentStation = stationList.get(backgroundCurrentStationIndex);
- BusStationBean nextStation = stationList.get(backgroundCurrentStationIndex + 1);
- OchAutopilotAnalytics.INSTANCE.triggerUnableStartAPReasonEvent(
- currentStation.getName(), nextStation.getName(), String.valueOf(busRoutesResult.getLineId()), "",
- OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason());
- }
-
- public BusRoutesResult getBusRoutesResult() {
- return busRoutesResult;
- }
-
- public BusStationBean getBusNextStation() {
- // A->B 的过程中A站点的信息
- if (stationList == null || backgroundCurrentStationIndex >= stationList.size() - 1) {
- return null;
- }
- return stationList.get(backgroundCurrentStationIndex);
- }
-
- public int getCurrentStationIndex() {
- return backgroundCurrentStationIndex;
- }
-
- /**
- * 将业务订单信息保存,鹰眼可取用
- */
- private void updateAutopilotControlParameters() {
-
- AutopilotControlParameters parameters = initAutopilotControlParameters(-1);
- if (null == parameters) {
- CallerLogger.e(M_BUS + TAG, "AutopilotControlParameters is empty.");
- return;
- }
- CallerLogger.d(M_BUS + TAG, "AutopilotControlParameters is update.");
- CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(parameters);
- }
-
- private void clearAutopilotControlParameters() {
- CallerLogger.d(M_BUS + TAG, "AutopilotControlParameters is clear.");
- CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(null);
- }
-
- private AutopilotControlParameters initAutopilotControlParameters(int leaveIndex) {
- BusStationBean currentStation = null;
- BusStationBean nextStation = null;
-
- if (leaveIndex < 0) {
- if (backgroundCurrentStationIndex + 1 > stationList.size() - 1 || !isGoingToNextStation) {
- CallerLogger.e(M_BUS + TAG, "行程日志-mismatch condition1.");
- return null;
- }
- currentStation = stationList.get(backgroundCurrentStationIndex);
- nextStation = stationList.get(backgroundCurrentStationIndex + 1);
- } else {
- if (leaveIndex + 1 > stationList.size() - 1 || !isGoingToNextStation) {
- CallerLogger.e(M_BUS + TAG, "行程日志-mismatch condition2.");
- return null;
- }
- currentStation = stationList.get(leaveIndex);
- nextStation = stationList.get(leaveIndex + 1);
- }
-
- AutopilotControlParameters parameters = new AutopilotControlParameters();
- parameters.routeID = busRoutesResult.getLineId();
- parameters.routeName = busRoutesResult.getName();
- parameters.startName = PinYinUtil.getPinYinHeadChar(currentStation.getName());
- parameters.endName = PinYinUtil.getPinYinHeadChar(nextStation.getName());
- parameters.startLatLon = new AutopilotControlParameters
- .AutoPilotLonLat(currentStation.getLat(), currentStation.getLon());
- parameters.endLatLon = new AutopilotControlParameters
- .AutoPilotLonLat(nextStation.getLat(), nextStation.getLon());
- parameters.vehicleType = VEHICLE_TYPE;
- if (parameters.autoPilotLine == null) {
- parameters.autoPilotLine = new AutopilotControlParameters.AutoPilotLine(
- busRoutesResult.getLineId(),
- busRoutesResult.getName(),
- busRoutesResult.csvFileUrl==null?"":busRoutesResult.csvFileUrl,
- busRoutesResult.csvFileMd5==null?"":busRoutesResult.csvFileMd5,
- busRoutesResult.txtFileUrl==null?"":busRoutesResult.txtFileUrl,
- busRoutesResult.txtFileMd5==null?"":busRoutesResult.txtFileMd5,
- busRoutesResult.contrailSaveTime,
- busRoutesResult.carModel,
- busRoutesResult.csvFileUrlDPQP,
- busRoutesResult.csvFileMd5DPQP,
- busRoutesResult.txtFileUrlDPQP,
- busRoutesResult.txtFileMd5DPQP,
- busRoutesResult.contrailSaveTimeDPQP);
- }
-
- return parameters;
- }
-
- public void setTrajectoryStation(BusStationBean startStation, BusStationBean endStation, Long lineId) {
-
- LineManager.INSTANCE.setStartAndEndStation(startStation,endStation);
-
- MogoLocation startStationMogoLocation = new MogoLocation();
- startStationMogoLocation.setLongitude(startStation.getGcjLon());
- startStationMogoLocation.setLatitude(startStation.getGcjLat());
- MogoLocation endStationMogoLocation = new MogoLocation();
- endStationMogoLocation.setLongitude(endStation.getGcjLon());
- endStationMogoLocation.setLatitude(endStation.getGcjLat());
- TrajectoryAndDistanceManager.INSTANCE.setStationPoint(startStationMogoLocation, endStationMogoLocation, lineId);
- }
-
}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/ThirdDeviceData.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/ThirdDeviceData.kt
new file mode 100644
index 0000000000..bdf4647540
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/ThirdDeviceData.kt
@@ -0,0 +1,150 @@
+package com.mogo.och.offline.model
+
+import com.mogo.commons.AbsMogoApplication
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
+import com.mogo.eagle.core.utilcode.util.GsonUtils
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler
+import com.mogo.och.common.module.biz.login.LoginStatusManager
+import com.mogo.och.bridge.autopilot.line.LineManager
+import com.mogo.och.common.module.manager.socket.cloud.AbnormalFactorsLoopManager
+import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager
+import com.mogo.och.common.module.manager.socket.cloud.action.OperateAction
+import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener
+import com.mogo.och.common.module.manager.socket.lan.LanSocketManager
+import com.mogo.och.common.module.manager.socket.lan.LedScreenManager
+import com.mogo.och.common.module.manager.socket.lan.bean.BusinessType
+import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType
+import com.mogo.och.common.module.manager.socket.lan.bean.TaskDetailsMsg
+import com.mogo.och.common.module.utils.ResourcesUtils
+import com.mogo.och.data.bean.BusRoutesResult
+import com.mogo.och.data.bean.BusTransferData
+import com.mogo.och.offline.R
+import com.mogo.och.offline.constant.BusConst
+import com.mogo.och.offline.util.ShuttleVoiceManager
+
+object ThirdDeviceData {
+
+ const val TAG = M_BUS+"ThirdDeviceData"
+
+ @JvmStatic
+ val busRoutesResult: BusRoutesResult = BusRoutesResult()
+
+ fun init() {
+ //监听运营消息
+ OCHSocketMessageManager.registerSocketMessageListener(
+ OCHSocketMessageManager.msgMonitorType,
+ OperateAction(true)
+ )
+
+ // 长链接监听
+ AbnormalFactorsLoopManager.startLoopAbnormalFactors(AbsMogoApplication.getApp())
+
+ //监听乘客屏发来的消息
+ LanSocketManager.registerSocketMessageListener(
+ DPMsgType.TYPE_TASK_DETAILS.type,
+ taskDetailsMsgListener
+ )
+ }
+
+ fun release() {
+
+ OCHSocketMessageManager.releaseSocketMessageListener(OCHSocketMessageManager.msgMonitorType)
+
+ AbnormalFactorsLoopManager.stopLoopAbnormalFactors()
+
+ //监听乘客屏发来的消息
+ LanSocketManager.unRegisterSocketMessageListener(
+ DPMsgType.TYPE_TASK_DETAILS.type,
+ taskDetailsMsgListener
+ )
+ }
+
+ // 乘客屏请求线路信息
+ private val taskDetailsMsgListener = object : ILanMessageListener {
+ override fun targetLan(): Class = TaskDetailsMsg::class.java
+ override fun onLanMsgReceived(taskDetailsMsg: TaskDetailsMsg?) = sendTaskDetailsToClients()
+ }
+
+ private var delayedTts:Runnable?=null
+
+ // 离站
+ fun leaveStation() {
+ LineManager.getStationsWithLine { start, end, lineInfo ->
+ delayedTts = object :Runnable{
+ override fun run() {
+ ShuttleVoiceManager.leaveStationBus(end.name, end.nameKr)
+ }
+ }
+ UiThreadHandler.postDelayed(delayedTts, BusConst.DELAY_10S)
+ //给bus外屏发送
+ LedScreenManager.sendTripInfo2Led(
+ LedScreenManager.LEAVE_STATION,
+ lineInfo.lineName,
+ start.name,
+ end.name,
+ LineModel.isLastStation() == true
+ )
+ }
+ }
+
+ //到站
+ fun arriveStation() {
+ delayedTts?.let {
+ UiThreadHandler.removeCallbacks(delayedTts)
+ }
+ LineManager.getStationsWithLine { start, end, lineInfo ->
+ ShuttleVoiceManager.arrivedStationBus(end.name, end.nameKr)
+ // 收到正在进站的决策信息时播报,每个站点仅播报1次
+ ShuttleVoiceManager.arrivedStationOut(ResourcesUtils.getString(R.string.m2_voice_out_arrive_station))
+ //给bus外屏发送
+ LedScreenManager.sendTripInfo2Led(
+ LedScreenManager.ARRIVE_STATION,
+ lineInfo.lineName,
+ start.name,
+ end.name,
+ LineModel.isLastStation() == true
+ )
+ }
+ }
+
+ //结束任务
+ fun endTask() {
+ delayedTts?.let {
+ UiThreadHandler.removeCallbacks(delayedTts)
+ }
+ LineManager.getLineInfo {lineInfo ->
+ LedScreenManager.sendTripInfo2Led(
+ LedScreenManager.END_TRIP,
+ lineInfo.lineName,
+ "",
+ "",
+ false
+ )
+ }
+ }
+
+ fun sendTaskDetailsToClients() {
+ if (LineManager.lineInfos == null || LineModel.currentTask == null || LineModel.stationList.isNullOrEmpty()) {
+ val data = BusTransferData(if (LoginStatusManager.isLogin()) 1 else 0, null)
+ val msg = TaskDetailsMsg(GsonUtils.toJson(data), BusinessType.shuttle)
+ d(TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(msg))
+ LanSocketManager.sendMsgToClient(msg)
+ } else {
+ LineManager.getLineInfo {lineInfo ->
+ busRoutesResult.setSite(LineModel.stationList)
+ busRoutesResult.lineId = lineInfo.lineId.toInt()
+ busRoutesResult.name = lineInfo.lineName
+ busRoutesResult.taskId = LineModel.currentTask!!.taskId!!.toInt()
+ busRoutesResult.taskTime = LineModel.currentTask!!.startTime
+ busRoutesResult.writeVersion = System.currentTimeMillis()
+ val data = BusTransferData(if (LoginStatusManager.isLogin()) 1 else 0, busRoutesResult)
+ val msg = TaskDetailsMsg(GsonUtils.toJson(data), BusinessType.shuttle)
+ d(TAG, "sendTaskDetailsToClients = " + GsonUtils.toJson(msg))
+ LanSocketManager.sendMsgToClient(msg)
+ }
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/presenter/BusLinePresenter.java b/OCH/offline/driver/src/main/java/com/mogo/och/offline/presenter/BusLinePresenter.java
deleted file mode 100644
index efa414e901..0000000000
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/presenter/BusLinePresenter.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.mogo.och.offline.presenter;
-
-import androidx.annotation.NonNull;
-import androidx.lifecycle.LifecycleOwner;
-
-import com.mogo.commons.mvp.Presenter;
-import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
-import com.mogo.och.offline.bean.BindLineListResponse;
-import com.mogo.och.offline.ui.BusSwitchLineView;
-import com.mogo.och.offline.callback.IBusLinesCallback;
-import com.mogo.och.offline.model.BusLineModel;
-import com.mogo.och.offline.model.OrderModel;
-
-/**
- * @author: wangmingjun
- * @date: 2022/2/9
- */
-public class BusLinePresenter extends Presenter implements IBusLinesCallback {
-
- public BusLinePresenter(BusSwitchLineView view) {
- super(view);
- OrderModel.getInstance().init();
- }
-
- @Override
- public void onCreate(@NonNull LifecycleOwner owner) {
- super.onCreate(owner);
- initListener();
- }
-
- private void initListener() {
- BusLineModel.setBusLinesCallback(this);
- }
-
- @Override
- public void onBusLinesChange(BindLineListResponse lines) {
- UiThreadHandler.post(new Runnable() {
- @Override
- public void run() {
- if(mView!=null) {
- mView.onBusLinesChange(lines);
- }
- }
- }, UiThreadHandler.MODE.QUEUE);
- }
-
- @Override
- public void onChangeLineIdSuccess(BindLineListResponse.Result checkLineInfo) {
- OrderModel.getInstance().pushCacheTransferData(BindLineListResponse.getCommonLineInfo(checkLineInfo));
- OrderModel.getInstance().clearBusStationDatas();
- UiThreadHandler.post(new Runnable() {
- @Override
- public void run() {
- if(mView!=null) {
- mView.onChangeLineIdSuccess();
- }
- }
- }, UiThreadHandler.MODE.QUEUE);
- }
-
- public void queryBusLines(){
- BusLineModel.queryBusLines();
- }
-
- public void commitSwitchLineId(BindLineListResponse.Result checkLineInfo){
- BusLineModel.commitSwitchLineId(checkLineInfo);
- }
-
- public void removeListener(){
- BusLineModel.setBusLinesCallback(null);
- }
-
- public void queryBusRoutes(){
- OrderModel.getInstance().queryBusRoutes();
- }
-
- @Override
- public void onDestroy(@NonNull LifecycleOwner owner) {
- super.onDestroy(owner);
-
- }
-
-}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/presenter/BusPresenter.java b/OCH/offline/driver/src/main/java/com/mogo/och/offline/presenter/BusPresenter.java
deleted file mode 100644
index 87640b5fdd..0000000000
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/presenter/BusPresenter.java
+++ /dev/null
@@ -1,329 +0,0 @@
-package com.mogo.och.offline.presenter;
-
-import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
-
-import android.os.Looper;
-
-import androidx.annotation.NonNull;
-import androidx.lifecycle.LifecycleOwner;
-
-import com.mogo.commons.AbsMogoApplication;
-import com.mogo.commons.mvp.Presenter;
-import com.mogo.eagle.core.data.config.FunctionBuildConfig;
-import com.mogo.eagle.core.data.map.MogoLocation;
-import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
-import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager;
-import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
-import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
-import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
-import com.mogo.och.bridge.autopilot.OCHAdasAbilityManager;
-import com.mogo.och.bridge.autopilot.autopilot.IOchAutopilotStatusListener;
-import com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotStatusListenerManager;
-import com.mogo.och.bridge.autopilot.autopilot.bean.ArrivedStation;
-import com.mogo.och.common.module.biz.login.LoginStatusEnum;
-import com.mogo.och.data.bean.BusStationBean;
-import com.mogo.och.offline.callback.IBusADASStatusCallback;
-import com.mogo.och.offline.callback.IBusControllerStatusCallback;
-import com.mogo.och.offline.callback.IRefreshBusStationsCallback;
-import com.mogo.och.offline.callback.ISlidePannelHideCallback;
-import com.mogo.och.offline.fragment.ShuttleFragment;
-import com.mogo.och.offline.model.BusLineModel;
-import com.mogo.och.offline.model.OrderModel;
-import com.mogo.och.offline.util.OffLineTrajectoryManager;
-import com.mogo.och.common.module.biz.login.ILoginCallback;
-import com.mogo.och.common.module.biz.login.LoginStatusManager;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-/**
- * 网约车小巴
- *
- * @author tongchenfei
- */
-public class BusPresenter extends Presenter
- implements IRefreshBusStationsCallback, ISlidePannelHideCallback
- , IOchAutopilotStatusListener, IBusControllerStatusCallback, ILoginCallback, IBusADASStatusCallback {
-
- private static final String TAG = "BusPresenter";
-
- private final List mStationList = new ArrayList<>();
- private int mCurrentStation = 0;
-
- public BusPresenter(ShuttleFragment view) {
- super(view);
- //2021.11.1 鹰眼架构整合,由IMoGoAutopilotStatusListener逐步替代IMogoAdasOCHCallback接口
- OrderModel.getInstance().init();
- OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp());
-
- }
-
- @Override
- public void onCreate(@NonNull LifecycleOwner owner) {
- super.onCreate(owner);
- initModelListener();
-
- OrderModel.getInstance().queryBusCacheRoutes();
- }
-
- @Override
- public void onDestroy(@NonNull LifecycleOwner owner) {
- super.onDestroy(owner);
- OrderModel.getInstance().release();
- releaseListener();
- }
-
- public void initModelListener() {
- OrderModel.getInstance().setRefreshBusStationsCallback(this);
- OrderModel.getInstance().setSlidePanelHideCallback(this);
- OrderModel.getInstance().setControllerStatusCallback(this);
- OrderModel.getInstance().setAdasStatusCallback(this);
- OchAutoPilotStatusListenerManager.INSTANCE.addListener(TAG,this);
- LoginStatusManager.INSTANCE.addListener(TAG,this);
- }
-
- public void releaseListener() {
- OrderModel.getInstance().setRefreshBusStationsCallback(null);
- OrderModel.getInstance().setSlidePanelHideCallback(null);
- OrderModel.getInstance().setControllerStatusCallback(null);
- OrderModel.getInstance().setAdasStatusCallback(null);
- OCHAdasAbilityManager.getInstance().release();
- OchAutoPilotStatusListenerManager.INSTANCE.removeListener(TAG);
- LoginStatusManager.INSTANCE.removeListener(TAG);
- }
-
- public void abortTask() {
- OrderModel.getInstance().abortTask();
- }
-
- public void autoDriveToNextStation() {
- OrderModel.getInstance().autoDriveToNextStation();
- }
-
- public void restartAutopilot() {
- if (OrderModel.getInstance().isGoingToNextStation()){
- OrderModel.getInstance().restartAutopilot();
- }
- }
-
- // 登出
- public void logout() {
- OrderModel.getInstance().logout();
- }
-
- @Override
- public void updateBusTaskStatus(String lineName,String lineTime,
- List stationList,
- int arrivingOrArrivedIndex,
- boolean isArrived) {
- mStationList.clear();
- mStationList.addAll(stationList);
- if (arrivingOrArrivedIndex == 0 || isArrived){
- mCurrentStation = arrivingOrArrivedIndex;
- }else {
- mCurrentStation = arrivingOrArrivedIndex -1;
- }
- CallerLogger.d(M_BUS + "BusOrderModel =", " mCurrentStation =" + mCurrentStation);
-
- UiThreadHandler.post(new Runnable() {
- @Override
- public void run() {
- if(mView!=null) {
- mView.updateBusTaskStatus(lineName,lineTime,
- stationList, arrivingOrArrivedIndex, isArrived);
- }
- }
- }, UiThreadHandler.MODE.QUEUE);
- }
-
- @Override
- public void updateEmptyUi() {
- UiThreadHandler.post(new Runnable() {
- @Override
- public void run() {
- if(mView!=null) {
- mView.updateLineEmptyUI();
- }
- }
- }, UiThreadHandler.MODE.QUEUE);
- }
-
- @Override
- public void clearBusStationsMarkers() {
- UiThreadHandler.post(new Runnable() {
- @Override
- public void run() {
- if(mView!=null) {
- mView.clearBusStationsMarkers();
- }
- }
- }, UiThreadHandler.MODE.QUEUE);
- }
-
- @Override
- public void hideSlidePanel() {
- if (mView != null) {
- mView.hideSlidePanel();
- mView.setArrivedClikable(true);
- }
- }
-
- @Override
- public void onAutopilotArriveAtStation(ArrivedStation arrivedStation) {
- CallerLogger.e( M_BUS + TAG, "行程日志-onAutopilotArriveAtStation arrive");
- arriveStation(arrivedStation,"底盘触发进站");
- }
-
- public void arriveStation(ArrivedStation arrivedStation,String type){
- OrderModel.getInstance().onArriveAt(arrivedStation,type);
- }
-
- @Override
- public void onAutopilotStatusResponse(int state) {
- switch (state) {
- case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE:
- case IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING:
- case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE:
- if (FunctionBuildConfig.isDemoMode
- && (
- (mCurrentStation >= 0 && mCurrentStation <= mStationList.size() - 1)
- && OrderModel.getInstance().isGoingToNextStation()
- )
- ) {
- CallerLogger.d(M_BUS + "BusOrderModel=", "有美化功能");
- return;
- }
- // 改变UI自动驾驶状态
- UiThreadHandler.post(new Runnable() {
- @Override
- public void run() {
- if(mView!=null) {
- mView.onAutopilotStatusChanged(state, CallerAutoPilotControlManager.INSTANCE.isCanStartAutopilot(false,0));
- }
- }
- }, UiThreadHandler.MODE.QUEUE);
- break;
- case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING:
- OrderModel.getInstance().triggerStartServiceEvent(
- OrderModel.getInstance().isRestartAutopilot(), true,0,"");
- // 改变UI自动驾驶状态
- UiThreadHandler.post(new Runnable() {
- @Override
- public void run() {
- if(mView!=null) {
- mView.onAutopilotStatusChanged(state, CallerAutoPilotControlManager.INSTANCE.isCanStartAutopilot(false,0));
- }
- }
- }, UiThreadHandler.MODE.QUEUE);
- break;
- default:
- UiThreadHandler.post(new Runnable() {
- @Override
- public void run() {
- if(mView!=null) {
- mView.onAutopilotEnableChange(false);
- }
- }
- }, UiThreadHandler.MODE.QUEUE);
- break;
- }
- }
-
- @Override
- public void onAutopilotStatusResponseFromCan(int state) {
- if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
- OrderModel.getInstance().triggerStartServiceEvent(
- OrderModel.getInstance().isRestartAutopilot(), true,1,"");
- }
- }
-
- @Override
- public void onCarLocationChanged(MogoLocation location) {
-// if (null != location) {
-// runOnUIThread(() -> mView.updateSpeedView(location.getGnssSpeed()));
-// }
- }
-
- @Override
- public void startOpenAutopilot() {
- //非美化模式下启动动画
- UiThreadHandler.post(new Runnable() {
- @Override
- public void run() {
- if(mView!=null) {
- mView.startAutopilotAnimation();
- }
- }
- }, UiThreadHandler.MODE.QUEUE);
-
- //中间站点再次开启自驾时, 自动驾驶状态是2未改变, 此次鹰眼底层不再返给业务,需优化按钮动画显示
- if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
- == CallerAutoPilotStatusListenerManager.INSTANCE.getState()&&mView!=null){
- mView.onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getState(),
- CallerAutoPilotControlManager.INSTANCE.isCanStartAutopilot(false,0));
- }
- }
-
- private void runOnUIThread(Runnable executor) {
- if (executor == null) {
- return;
- }
- if (Looper.myLooper() != Looper.getMainLooper()) {
- UiThreadHandler.post(executor);
- } else {
- executor.run();
- }
- }
-
- /**
- * 测试使用
- */
- public void debugAutoPilotStatus(int status) {
- onAutopilotStatusResponse(status);
- }
-
-
- @Override
- public void onStatusChange(LoginStatusEnum currentStatus) {
- CallerLogger.d(M_BUS + TAG, " loginStatus =" + LoginStatusManager.isLogin());
- if(LoginStatusManager.isLogin()){
-// OrderModel.getInstance().queryBusRoutes();
- OrderModel.getInstance().queryBusCacheRoutes();
- BusLineModel.startLoopAllLine();
- }else {
- BusLineModel.stopLoopAllLine();
- OffLineTrajectoryManager.INSTANCE.stopTrajReqLoop();
- clearBusStationsMarkers();
- if(mView!=null) {
- mView.hideSlidePanel();
- }
- OrderModel.getInstance().closeBeautificationMode();
- }
- }
-
- @Override
- public void onStartAdasFailure() {
- UiThreadHandler.post(new Runnable() {
- @Override
- public void run() {
- if(mView!=null) {
- mView.stopAnimAndUpdateBtnStatus();
- }
- }
- }, UiThreadHandler.MODE.QUEUE);
- }
-
- @Override
- public void canStartAutopilot(boolean canStart) {
- UiThreadHandler.post(new Runnable() {
- @Override
- public void run() {
- if(mView!=null) {
- mView.onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getState(),canStart);
- }
- }
- }, UiThreadHandler.MODE.QUEUE);
- }
-}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/RepositoryManager.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/RepositoryManager.kt
new file mode 100644
index 0000000000..7f4a1afcdd
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/RepositoryManager.kt
@@ -0,0 +1,239 @@
+package com.mogo.och.offline.repository
+
+import com.google.gson.reflect.TypeToken
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
+import com.mogo.eagle.core.utilcode.util.GsonUtils
+import com.mogo.eagle.core.utilcode.util.ToastUtils
+import com.mogo.och.bridge.autopilot.line.LineManager
+import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
+import com.mogo.och.common.module.network.OchCommonServiceCallback
+import com.mogo.och.data.bean.BusStationBean
+import com.mogo.och.data.bean.ContraiInfo
+import com.mogo.och.data.bean.LineInfo
+import com.mogo.och.data.bean.SiteIntroduce
+import com.mogo.och.data.db.bean.LineDataBean
+import com.mogo.och.offline.model.LineModel
+import com.mogo.och.offline.model.LineModel.currentTask
+import com.mogo.och.offline.repository.db.bean.TaskSiteDataBean
+import com.mogo.och.offline.repository.db.repository.ContraiDb
+import com.mogo.och.offline.repository.db.repository.LineDb
+import com.mogo.och.offline.repository.db.repository.TaskDb
+import com.mogo.och.offline.repository.db.repository.TaskSiteDb
+import com.mogo.och.offline.repository.net.OrderServiceManager
+import com.mogo.och.offline.repository.net.bean.BindLineListResponse
+import io.reactivex.Observable
+
+
+object RepositoryManager {
+
+ const val TAG = "${M_BUS}RepositoryManager"
+
+ fun queryCanUseLine(): Observable?>? {
+ return LineDb.queryCanUseLineRx()
+ }
+
+ fun startTask(taskId:Long,lineId:Long,lineName:String): Observable? {
+ return TaskDb.startTask(taskId, lineId, lineName)
+ }
+
+ fun queryCarExecutableTaskList(ochCommonServiceCallback: OchCommonServiceCallback) {
+ OrderServiceManager.queryBindLineListBySn(ochCommonServiceCallback)
+ }
+
+ fun endTask(taskId: Long): Observable? {
+ return Observable.just(taskId).flatMap {
+ currentTask?.let {task->
+ if (task.taskId!=null&&task.lineId!=null) {
+ TaskDb.endTask(task.taskId!!)
+ }
+ }
+ return@flatMap Observable.just(true)
+ }
+ }
+
+ fun loadCurrentTaskInfo(): Observable? {
+ return Observable.just(123)
+ .flatMap {
+ // 获取正在运行的任务
+ val runningTaskInfo = TaskDb.queryRunningTask()
+ if (runningTaskInfo.isNullOrEmpty()) {
+ // 本地没有进行中的任务
+ CallerLogger.d(TAG, "loadCurrentTaskInfo 没有查询到正在运行的任务")
+ return@flatMap Observable.just(false)
+ } else if (runningTaskInfo.size > 1) {
+ // 本地有多条正在进行的任务 需要check event
+ // 1 比对event表 1 清理错误数据 2 加载后台数据
+ CallerLogger.d(TAG, "loadCurrentTaskInfo 查询到多个正在执行的任务")
+ return@flatMap Observable.just(false)
+ } else {
+ // 只有一条进行中的任务
+ currentTask = runningTaskInfo.first()
+ // 恢复站点信息
+ currentTask?.taskId?.let {
+ // 获取正在进行中的具体信息
+ val runnintTaskAndSites = TaskSiteDb.queryRunningTask(it)
+ if(runnintTaskAndSites.isNullOrEmpty()||runnintTaskAndSites.size<2){
+ CallerLogger.d(TAG, "异常情况:有任务:${runningTaskInfo} runningTask 表格没有对应的数据:${runnintTaskAndSites}")
+ OchChainLogManager.writeChainLogDb("加载任务", "异常情况:有任务:${runningTaskInfo} runningTask 表格没有对应的数据:${runnintTaskAndSites}")
+ TaskSiteDb.deleteErrorData(it)
+ return@flatMap Observable.just(false)
+ }
+ val db2Beans = db2Beans(runnintTaskAndSites)
+ LineModel.stationList = db2Beans.first
+ LineModel.startStationIndex = db2Beans.second
+ LineModel.stationList?.let { stationlist->
+ val startStation = stationlist[LineModel.startStationIndex]
+ if (LineModel.startStationIndex < stationlist.size-1) {
+ val endStation = stationlist[LineModel.startStationIndex + 1]
+ LineManager.setStartAndEndStation(startStation,endStation)
+ LineModel.callEyeMap(8)
+ }
+ }
+
+ }
+ // 设置自动驾驶信息
+ currentTask?.lineId?.let {
+ ContraiDb.queryAutopilotInfoByLineid(it)?.apply {
+ if (lineId == null || lineId!! < 0L||csvFileUrl.isNullOrEmpty()||csvFileMd5.isNullOrEmpty()||txtFileUrl.isNullOrEmpty()||txtFileMd5.isNullOrEmpty()) {
+ ToastUtils.showLong("请设置轨迹信息")
+ OchChainLogManager.writeChainLogAutopilot("轨迹错误",this.toString())
+ CallerLogger.d(TAG,"轨迹错误,$this")
+ }
+ LineManager.setContraiInfo(ContraiInfo(lineId!!,csvFileUrl!!,csvFileMd5!!,txtFileUrl!!,txtFileMd5!!,contrailSaveTime!!))
+ }
+ }
+ return@flatMap Observable.just(true)
+ }
+ }
+
+
+ }
+
+ fun leaveStation(
+ taskId: Long
+ ): Observable?{
+ return Observable.just(taskId)
+ .flatMap {
+ //开始站点: leaving false->true
+ LineManager.getStartStation {
+ TaskSiteDb.updateLeave(taskId, it.siteId.toLong(), true)
+ OchChainLogManager.writeChainLogDb(
+ "滑动出发",
+ "task:${currentTask}__taskId:${currentTask?.taskId}"
+ )
+ CallerLogger.d(TAG,"滑动出发:task:${currentTask}__taskId:${currentTask?.taskId}")
+ }
+ val (startStation, endStation) = LineManager.getStations()
+ val changeInfo =
+ "taskId:${currentTask?.taskId}--lineId:${currentTask?.lineId}--currentStationName:${startStation?.name}--finalNextStationName:${endStation?.name}"
+ OchChainLogManager.writeChainLog("滑动出发", changeInfo)
+ CallerLogger.d(TAG,"滑动出发:$changeInfo")
+ // 开始任务成功
+ return@flatMap Observable.just(true)
+ }
+ }
+
+ fun arriveStation(taskId: Long): Observable? {
+ // 开始站点:leaving true->false drivingStatus 2->1
+ return Observable.just(taskId)
+ .flatMap {
+ LineManager.getStations { start, end ->
+ if (currentTask != null && currentTask!!.taskId != null) {
+ currentTask?.let { task ->
+ if (task.taskId != null && task.lineId != null) {
+ TaskSiteDb.updateDrivingStatusAndLeave(
+ task.taskId!!,
+ start.siteId.toLong(),
+ TaskSiteDataBean.drivingStatusPassed,
+ false
+ )
+ }
+ }
+ } else {
+ OchChainLogManager.writeChainLog(
+ "到站_数据更新_error",
+ "task:${currentTask}__taskId:${currentTask?.taskId}"
+ )
+ CallerLogger.d(TAG,"到站_数据更新_error:task:${currentTask}__taskId:${currentTask?.taskId}")
+ }
+ // 结束站点: drivingStatus 3-2
+ if (currentTask != null && currentTask!!.taskId != null) {
+ currentTask?.taskId?.let { taskId ->
+ TaskSiteDb.updateDrivingStatus(
+ taskId,
+ end.siteId.toLong(),
+ TaskSiteDataBean.drivingStatusCurrent
+ )
+ }
+ } else {
+ OchChainLogManager.writeChainLog(
+ "到站_数据更新_error",
+ "task:${currentTask}__taskId:${currentTask?.taskId}"
+ )
+ CallerLogger.d(TAG,"到站_数据更新_error:task:${currentTask}__taskId:${currentTask?.taskId}")
+ }
+ val changeInfo =
+ "taskId:${currentTask?.taskId}--lineId:${currentTask?.lineId}--currentStationName:${start.name}--finalNextStationName:${end.name}"
+ OchChainLogManager.writeChainLog("到站", changeInfo)
+ CallerLogger.d(TAG,"到站:$changeInfo")
+ }
+ return@flatMap Observable.just(true)
+ }
+
+
+ }
+
+
+ fun db2Beans(runnintTaskAndSites: List?): Pair,Int> {
+ val result = mutableListOf()
+ var temp: BusStationBean? = null
+ var currentStationIndex = -1
+ var lineInfo: LineInfo?=null
+ if (runnintTaskAndSites.isNullOrEmpty()) {
+ LineManager.setLineInfo(lineInfo)
+ return Pair(result,currentStationIndex)
+ }
+ runnintTaskAndSites.forEachIndexed { index, taskAndsite ->
+ temp = BusStationBean()
+ temp?.drivingStatus = (taskAndsite.drivingStatus ?: 0)
+ temp?.lat = (taskAndsite.lat ?: 0.0)
+ temp?.lon = (taskAndsite.lon ?: 0.0)
+ temp?.gcjLat = (taskAndsite.gcjLat ?: 0.0)
+ temp?.gcjLon = (taskAndsite.gcjLon ?: 0.0)
+ temp?.introduction = taskAndsite.introduction
+ temp?.isLeaving = java.lang.Boolean.TRUE == taskAndsite.leaving
+ temp?.name = taskAndsite.name
+ temp?.nameKr = taskAndsite.nameKr
+ temp?.isPlayTts = java.lang.Boolean.TRUE == taskAndsite.isPlayTts
+ temp?.seq = (taskAndsite.seq ?: 0)
+ temp?.siteId = if (taskAndsite.siteId == null) 0 else taskAndsite.siteId!!.toInt()
+ if(!taskAndsite.videoList.isNullOrEmpty()){
+ try {
+ val list = GsonUtils.fromJson>(
+ taskAndsite.videoList,
+ object : TypeToken?>() {}.type
+ )
+ temp?.videoList = list.toMutableList()
+ }catch (e:Exception){
+ temp?.videoList = null
+ }
+
+ }
+ result.add(temp!!)
+ // 正在进行中的任务
+ if (temp!!.drivingStatus == TaskSiteDataBean.drivingStatusCurrent) {
+ currentStationIndex = index
+ }
+ // 线路信息
+ if (lineInfo == null && taskAndsite.lineId != null && taskAndsite.lineName != null) {
+ lineInfo = LineInfo(taskAndsite.lineId!!, taskAndsite.lineName!!, orderId = taskAndsite.taskId.toString())
+ }
+ lineInfo?.multiMap?.put("taskInfo",LineModel.getTaskTime())
+ }
+ LineManager.setLineInfo(lineInfo)
+
+ return Pair(result,currentStationIndex)
+ }
+
+}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/IDbRepository.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/IDbRepository.kt
new file mode 100644
index 0000000000..e20d5550de
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/IDbRepository.kt
@@ -0,0 +1,8 @@
+package com.mogo.och.offline.repository.db
+
+interface IDbRepository {
+ fun register(){
+ MyDataBase.instance?.register(this)
+ }
+ fun release()
+}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/MyDataBase.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/MyDataBase.kt
new file mode 100644
index 0000000000..1e410f653c
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/MyDataBase.kt
@@ -0,0 +1,87 @@
+package com.mogo.och.offline.repository.db
+
+import androidx.room.Database
+import androidx.room.Room
+import androidx.room.RoomDatabase
+import androidx.sqlite.db.SupportSQLiteOpenHelper
+import com.mogo.commons.AbsMogoApplication
+import com.mogo.commons.env.Project
+import com.mogo.commons.env.ProjectUtils
+import com.mogo.eagle.core.data.config.FunctionBuildConfig
+import com.mogo.och.data.db.bean.ContrailDataBean
+import com.mogo.och.data.db.bean.LineDataBean
+import com.mogo.och.data.db.bean.SiteDataBean
+import com.mogo.och.data.db.dao.ContrailDataDao
+import com.mogo.och.data.db.dao.LineDataDao
+import com.mogo.och.data.db.dao.SiteDataDao
+import com.mogo.och.offline.repository.db.bean.TaskSiteDataBean
+import com.mogo.och.offline.repository.db.dao.TaskDataDao
+import com.mogo.och.offline.repository.db.dao.TaskSiteDataDao
+
+//注解Database告诉系统这是Room数据库对象
+//entities指定该数据库有哪些表,多张表就逗号分隔
+//version指定数据库版本号,升级时需要用到
+//数据库继承自RoomDatabase
+@Database(entities = [ContrailDataBean::class, LineDataBean::class, SiteDataBean::class, TaskSiteDataBean::class], version = 6)
+abstract class MyDataBase : RoomDatabase() {
+
+ override fun getOpenHelper(): SupportSQLiteOpenHelper {
+ return super.getOpenHelper()
+ }
+
+ private val dbRepositorys = mutableListOf()
+
+ override fun close() {
+ super.close()
+ dbRepositorys.forEach {
+ it.release()
+ }
+ dbRepositorys.clear()
+ }
+
+ fun register(iDbRepository: IDbRepository) {
+ dbRepositorys.add(iDbRepository)
+ }
+
+ abstract val contrailDataDao: ContrailDataDao?
+ abstract val lineDataDao: LineDataDao?
+ abstract val siteDataDao: SiteDataDao?
+
+ abstract val taskDataDao: TaskDataDao?
+ abstract val taskSiteDataDao: TaskSiteDataDao?
+
+ companion object {
+
+ fun getDBName():MyDataBase{
+ val roomName = when (ProjectUtils.getProjectType()) {
+ Project.SAAS -> {
+ "saas_offline_db"
+ }
+ Project.DALI -> {
+ "dali_offline_db"
+ }
+ else->{
+ FunctionBuildConfig.appIdentityMode
+ }
+ }
+
+ val dbFile = AbsMogoApplication.getApp().getDatabasePath(roomName)
+
+ return Room.databaseBuilder(
+ AbsMogoApplication.getApp()!!.applicationContext,
+ MyDataBase::class.java,
+ dbFile.path
+ )
+ .fallbackToDestructiveMigration()
+ .build()
+ }
+
+ var instance: MyDataBase? = getDBName()
+ get() {
+ if(field==null){
+ field = getDBName()
+ }
+ return field
+ }
+ }
+}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/bean/TaskDataBean.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/bean/TaskDataBean.kt
new file mode 100644
index 0000000000..4a91d39867
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/bean/TaskDataBean.kt
@@ -0,0 +1,73 @@
+package com.mogo.och.offline.repository.db.bean
+
+import androidx.room.ColumnInfo
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+import com.google.gson.annotations.SerializedName
+
+@Entity(tableName = TaskDataBean.tableName)
+data class TaskDataBean(
+
+ @PrimaryKey(autoGenerate = true)
+ @SerializedName("idtemp")
+ var id: Int = 0,
+
+ /**
+ * 任务id
+ */
+ @ColumnInfo(name = "task_id", typeAffinity = ColumnInfo.INTEGER, index = true)
+ @SerializedName("id", alternate = ["shiftsId"])
+ var taskId: Long? = null,
+
+ /**
+ * 任务所属线路
+ */
+ @ColumnInfo(name = "line_id", typeAffinity = ColumnInfo.INTEGER, index = true)
+ var lineId: Long? = null,
+
+ /**
+ * 任务开始时间
+ */
+ @ColumnInfo(name = "start_time", typeAffinity = ColumnInfo.INTEGER)
+ var startTime: Long = System.currentTimeMillis(),
+
+ /**
+ * 任务结束时间
+ */
+ @ColumnInfo(name = "end_time", typeAffinity = ColumnInfo.INTEGER)
+ var endtime: Long? = null,
+
+ /**
+ * 任务状态 (0 未使用) (1 运行中) (2 已使用)
+ */
+ @ColumnInfo(name = "status", typeAffinity = ColumnInfo.INTEGER)
+ var status: Long? = unUse,
+) {
+ companion object {
+ const val tableName: String = "temp_task_data_table"
+
+ const val unUse = 0L //未使用
+ const val useing = 1L //运行中
+ const val used = 2L //已使用
+
+ }
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (javaClass != other?.javaClass) return false
+
+ other as TaskDataBean
+
+ if (taskId != other.taskId) return false
+ if (lineId != other.lineId) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ var result = taskId?.hashCode() ?: 0
+ result = 31 * result + (lineId?.hashCode() ?: 0)
+ return result
+ }
+
+}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/bean/TaskSiteDataBean.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/bean/TaskSiteDataBean.kt
new file mode 100644
index 0000000000..4aed607ed7
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/bean/TaskSiteDataBean.kt
@@ -0,0 +1,168 @@
+package com.mogo.och.offline.repository.db.bean
+
+import androidx.room.ColumnInfo
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+import com.mogo.och.data.db.bean.SiteDataBean
+
+@Entity(tableName = TaskSiteDataBean.tableName)
+data class TaskSiteDataBean(
+
+ @PrimaryKey(autoGenerate = true) var id: Int = 0,
+
+ /**
+ * 任务id
+ */
+ @ColumnInfo(name = "task_id", typeAffinity = ColumnInfo.INTEGER)
+ var taskId: Long? = null,
+
+ /**
+ * 线路id
+ */
+ @ColumnInfo(name = "line_id", typeAffinity = ColumnInfo.INTEGER)
+ var lineId: Long? = null,
+
+ /**
+ * 站点id
+ */
+ @ColumnInfo(name = "site_id", typeAffinity = ColumnInfo.INTEGER)
+ var siteId: Long? = null,
+
+ /**
+ * 线路名称 删除线路 特殊情况下要展示线路的冗余
+ */
+ @ColumnInfo(name = "line_name", typeAffinity = ColumnInfo.TEXT)
+ var lineName: String? = null,
+
+ /**
+ * 站点名称
+ */
+ @ColumnInfo(name = "name", typeAffinity = ColumnInfo.TEXT)
+ var name: String? = null,
+
+ /**
+ * 站点韩文
+ */
+ @ColumnInfo(name = "name_kr", typeAffinity = ColumnInfo.TEXT)
+ var nameKr: String? = null,
+
+ /**
+ * 站点排序
+ */
+ @ColumnInfo(name = "seq", typeAffinity = ColumnInfo.INTEGER)
+ var seq: Int? = null,
+
+ /**
+ * 高德坐标
+ */
+ @ColumnInfo(name = "gcj_lon", typeAffinity = ColumnInfo.REAL)
+ var gcjLon: Double? = null,
+
+ /**
+ * 高德坐标
+ */
+ @ColumnInfo(name = "gcj_lat", typeAffinity = ColumnInfo.REAL)
+ var gcjLat: Double? = null,
+
+ /**
+ * 高精坐标
+ */
+ @ColumnInfo(name = "lon", typeAffinity = ColumnInfo.REAL)
+ var lon: Double? = null,
+
+ /**
+ * 高精坐标
+ */
+ @ColumnInfo(name = "lat", typeAffinity = ColumnInfo.REAL)
+ var lat: Double? = null,
+
+ /**
+ * 当前站点状态 行驶信息,0初始值;1已经过;2当前站;3未到站
+ */
+ @ColumnInfo(name = "driving_status", typeAffinity = ColumnInfo.INTEGER)
+ var drivingStatus: Int? = null,
+
+ /**
+ * 是否离站
+ */
+ @ColumnInfo(name = "leaving", typeAffinity = ColumnInfo.INTEGER)
+ var leaving: Boolean? = null,
+
+ /**
+ * 到站时间
+ */
+ @ColumnInfo(name = "arrived_time", typeAffinity = ColumnInfo.INTEGER)
+ var arrivedTime: Long? = null,
+
+ /**
+ * 离站时间
+ */
+ @ColumnInfo(name = "leave_time", typeAffinity = ColumnInfo.INTEGER)
+ var leaveTime: Long? = null,
+
+ /**
+ * 站点介绍
+ */
+ @ColumnInfo(name = "introduction", typeAffinity = ColumnInfo.TEXT)
+ var introduction: String? = null,
+
+ /**
+ * 是否播放站点介绍
+ */
+ @ColumnInfo(name = "is_play_tts", typeAffinity = ColumnInfo.INTEGER)
+ var isPlayTts: Boolean? = null,
+
+ /**
+ * 任务保存到数据库的时间 用来第二天删除前几天的任务
+ */
+ @ColumnInfo(name = "event_save_time", typeAffinity = ColumnInfo.INTEGER)
+ var eventSaveTime: Long = System.currentTimeMillis(),
+
+ /**
+ * 站点视频
+ */
+ @ColumnInfo(name = "videoList", typeAffinity = ColumnInfo.TEXT)
+ var videoList: String? = null,
+
+ ) {
+ companion object {
+ /**
+ * 开始任务 并把第一站置为 2 当前站
+ */
+ fun toTaskSiteDatas(querySites: List, lineName: String): MutableList {
+ val result = mutableListOf()
+ var temp: TaskSiteDataBean?
+ querySites.forEach {
+ temp = TaskSiteDataBean()
+ temp?.lineId = it.lineId
+ temp?.lineName = lineName
+ temp?.siteId = it.siteId
+ temp?.name = it.name
+ temp?.nameKr = it.nameKr
+ temp?.seq = it.seq
+ temp?.gcjLon = it.gcjLon
+ temp?.gcjLat = it.gcjLat
+ temp?.lon = it.lon
+ temp?.lat = it.lat
+ if(it.seq==1){
+ temp?.drivingStatus = drivingStatusCurrent
+ }else{
+ temp?.drivingStatus = drivingStatusNotArrived
+ }
+ temp?.leaving = false
+ temp?.introduction = it.introduction
+ temp?.isPlayTts = it.isPlayTts
+ temp?.videoList = it.videoListDB
+ result.add(temp!!)
+ }
+ return result
+ }
+
+ const val tableName: String = "used_line_data_table"
+
+ const val drivingStatusInit = 0//0初始值
+ const val drivingStatusPassed = 1//1已经过
+ const val drivingStatusCurrent = 2//2当前站
+ const val drivingStatusNotArrived = 3//3未到站
+ }
+}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/dao/TaskDataDao.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/dao/TaskDataDao.kt
new file mode 100644
index 0000000000..07624d97dc
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/dao/TaskDataDao.kt
@@ -0,0 +1,86 @@
+package com.mogo.och.offline.repository.db.dao
+
+import androidx.room.Dao
+import androidx.room.Delete
+import androidx.room.Insert
+import androidx.room.OnConflictStrategy
+import androidx.room.Query
+import com.mogo.och.common.module.utils.DateTimeUtil
+import com.mogo.och.offline.repository.db.bean.TaskDataBean
+import io.reactivex.Observable
+
+@Dao
+interface TaskDataDao {
+ //插入数据
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ fun insert(vararg lineDataBean: TaskDataBean)
+
+ //删除数据
+ @Delete
+ fun delete(vararg lineDataBean: TaskDataBean)
+
+ @Query("UPDATE ${TaskDataBean.tableName} SET start_time = :currentTimeMillis ,status = :useing WHERE id = :id")
+ fun updateStatus(currentTimeMillis: Long, useing: Long, id: Int)
+
+ //删除非昨天添加的数据
+ @Query("DELETE FROM ${TaskDataBean.tableName} WHERE start_time < :zeroTime")
+ fun deleteDataByZero(zeroTime: Long): Int
+
+ @Query("UPDATE ${TaskDataBean.tableName} SET end_time = :endTime,status = ${TaskDataBean.used} WHERE task_id = :taskId")
+ fun endTask(taskId: Long, endTime: Long = DateTimeUtil.getCurrentTimeStamp())
+
+ //查询当天插入的所有数据
+ @Query("SELECT * FROM ${TaskDataBean.tableName} WHERE start_time > :zeroTime")
+ fun loadAllData(zeroTime: Long): List?
+
+ // 查询当天特定线路正在执行的任务
+ @Query("SELECT * FROM ${TaskDataBean.tableName} WHERE task_get_time > :zeroTime and status = ${TaskDataBean.useing} and line_id = :lineId")
+ fun queryRunningTaskByLineId(
+ lineId: Long,
+ zeroTime: Long = DateTimeUtil.getCurrentDateZero()
+ ): List?
+
+ // 查询当天特定线路正在执行的任务
+ @Query("SELECT * FROM ${TaskDataBean.tableName} WHERE task_get_time > :zeroTime and status = ${TaskDataBean.useing}")
+ fun queryRunningTaskByStatus(zeroTime: Long = DateTimeUtil.getCurrentDateZero()): List?
+
+ @Query("SELECT * FROM ${TaskDataBean.tableName} WHERE task_get_time > :zeroTime and status = ${TaskDataBean.unUse} and line_id = :lineId order by task_start_time")
+ fun queryUnuseTask(
+ lineId: Long,
+ zeroTime: Long = DateTimeUtil.getCurrentDateZero()
+ ): Observable?>
+
+ @Query("DELETE FROM ${TaskDataBean.tableName} WHERE start_time > :zeroTime and line_id = :lineId")
+ fun deleteByLineId(lineId: Long, zeroTime: Long = DateTimeUtil.getCurrentDateZero())
+
+ @Query("SELECT * FROM ${TaskDataBean.tableName} WHERE line_id = :lineId and start_time > :zeroTime")
+ fun querySitesByLineId(
+ lineId: Long?,
+ zeroTime: Long = DateTimeUtil.getCurrentDateZero()
+ ): List?
+
+ //查询线路对应的轨迹信息
+ @Query("SELECT * FROM ${TaskDataBean.tableName} WHERE task_id = :taskId")
+ fun queryContrailByLineId(taskId: Long): List?
+
+ //查询线路对应的轨迹信息
+ @Query("SELECT * FROM ${TaskDataBean.tableName}")
+ fun queryAllTask(): List?
+
+
+ // 删除过时数据
+ @Query("DELETE FROM ${TaskDataBean.tableName} WHERE start_time < :zeroTime")
+ fun deleteObsoleteData(zeroTime: Long = DateTimeUtil.getCurrentDateZero()): Int
+
+
+ //查询线路对应的轨迹信息 只要一个结果
+ fun queryTaskByTaskIdOne(taskId: Long): TaskDataBean? {
+ val queryContrailByLineId = queryContrailByLineId(taskId)
+ return if (queryContrailByLineId.isNullOrEmpty()) {
+ null
+ } else {
+ queryContrailByLineId.first()
+ }
+ }
+
+}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/dao/TaskSiteDataDao.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/dao/TaskSiteDataDao.kt
new file mode 100644
index 0000000000..2e64de4490
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/dao/TaskSiteDataDao.kt
@@ -0,0 +1,37 @@
+package com.mogo.och.offline.repository.db.dao
+
+import androidx.room.Dao
+import androidx.room.Insert
+import androidx.room.OnConflictStrategy
+import androidx.room.Query
+import com.mogo.och.common.module.utils.DateTimeUtil
+import com.mogo.och.offline.repository.db.bean.TaskSiteDataBean
+
+@Dao
+interface TaskSiteDataDao {
+ //插入数据
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ fun insert(vararg lineDataBean: TaskSiteDataBean):List
+
+ //查询当天插入的所有数据
+ @Query("SELECT * FROM ${TaskSiteDataBean.tableName} WHERE task_id = :taskId order by seq")
+ fun queryRunningTask(taskId: Long): List?
+
+ @Query("UPDATE ${TaskSiteDataBean.tableName} SET leaving = :leave WHERE task_id = :taskId and site_id = :siteId")
+ fun updateLeave(taskId: Long, siteId: Long, leave: Int)
+
+ @Query("UPDATE ${TaskSiteDataBean.tableName} SET leaving = :leave , driving_status = :drivingStatusCurrent WHERE task_id = :taskId and site_id = :siteId")
+ fun updateDrivingStatusANdLeave(taskId: Long, siteId: Long, drivingStatusCurrent: Int, leave: Int)
+
+ @Query("UPDATE ${TaskSiteDataBean.tableName} SET driving_status = :drivingStatusCurrent WHERE task_id = :taskId and site_id = :siteId")
+ fun updateDrivingStatus(taskId: Long, siteId: Long, drivingStatusCurrent: Int)
+
+ // 删除过时数据
+ @Query("DELETE FROM ${TaskSiteDataBean.tableName} WHERE event_save_time < :zeroTime")
+ fun deleteObsoleteData(zeroTime: Long = DateTimeUtil.getCurrentDateZero()):Int
+
+ // 根据taskId删除所属站点信息
+ @Query("DELETE FROM ${TaskSiteDataBean.tableName} WHERE task_id = :taskId")
+ fun deleteErrorDataByTaskId(taskId: Long)
+
+}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/ContraiDb.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/ContraiDb.kt
new file mode 100644
index 0000000000..b7949cc102
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/ContraiDb.kt
@@ -0,0 +1,25 @@
+package com.mogo.och.offline.repository.db.repository
+
+import com.mogo.och.data.db.dao.ContrailDataDao
+import com.mogo.och.data.db.repository.BaseContraiDb
+import com.mogo.och.offline.repository.db.IDbRepository
+import com.mogo.och.offline.repository.db.MyDataBase
+
+object ContraiDb : IDbRepository, BaseContraiDb() {
+
+ override var contrailDao: ContrailDataDao?=null
+ get() {
+ if(field==null){
+ field = MyDataBase.instance?.contrailDataDao
+ register()
+ }
+ return field
+ }
+
+ override fun release(){
+ contrailDao = null
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/LineDb.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/LineDb.kt
new file mode 100644
index 0000000000..32bd2e4439
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/LineDb.kt
@@ -0,0 +1,28 @@
+package com.mogo.och.offline.repository.db.repository
+
+import com.mogo.och.data.db.dao.LineDataDao
+import com.mogo.och.data.db.repository.BaseLineDb
+import com.mogo.och.offline.repository.db.IDbRepository
+import com.mogo.och.offline.repository.db.MyDataBase
+
+object LineDb: IDbRepository, BaseLineDb() {
+
+ override var lineDao: LineDataDao?=null
+ get() {
+ if(field==null){
+ field = MyDataBase.instance?.lineDataDao
+ register()
+ }
+ return field
+ }
+
+ override fun deleteSitesTaskAndContraiDb(lineId: Long) {
+ SiteDb.deleteByLineId(lineId)
+ }
+
+
+ override fun release() {
+ lineDao = null
+ }
+
+}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/SiteDb.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/SiteDb.kt
new file mode 100644
index 0000000000..22965d6a9a
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/SiteDb.kt
@@ -0,0 +1,23 @@
+package com.mogo.och.offline.repository.db.repository
+
+import com.mogo.och.data.db.dao.SiteDataDao
+import com.mogo.och.data.db.repository.BaseSiteDb
+import com.mogo.och.offline.repository.db.IDbRepository
+import com.mogo.och.offline.repository.db.MyDataBase
+
+object SiteDb: IDbRepository, BaseSiteDb() {
+
+ override var siteDataDao: SiteDataDao? = null
+ get() {
+ if(field==null){
+ field = MyDataBase.instance?.siteDataDao
+ register()
+ }
+ return field
+ }
+
+ override fun release() {
+ siteDataDao = null
+ }
+
+}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/TaskDb.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/TaskDb.kt
new file mode 100644
index 0000000000..97e3c8d5f4
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/TaskDb.kt
@@ -0,0 +1,194 @@
+package com.mogo.och.offline.repository.db.repository
+
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
+import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
+import com.mogo.och.common.module.manager.loop.BizLoopManager
+import com.mogo.och.common.module.utils.DateTimeUtil
+import com.mogo.och.data.db.exception.DbException
+import com.mogo.och.offline.repository.db.IDbRepository
+import com.mogo.och.offline.repository.db.MyDataBase
+import com.mogo.och.offline.repository.db.bean.TaskDataBean
+import com.mogo.och.offline.repository.db.dao.TaskDataDao
+import com.mogo.och.offline.repository.exception.DataException
+import io.reactivex.Observable
+
+object TaskDb : IDbRepository {
+
+ private const val TAG = "${M_BUS}TaskDb"
+
+ private var taskDataDao: TaskDataDao? = null
+ get() {
+ if(field==null){
+ field = MyDataBase.instance?.taskDataDao
+ register()
+ }
+ return field
+ }
+
+ override fun release() {
+ taskDataDao = null
+ }
+
+ fun addOrUpdate(vararg lineDataBean: TaskDataBean){
+ // 从接口恢复数据
+ taskDataDao?.insert(*lineDataBean)
+ }
+
+ fun addOrUpdate(serverDateList: List, lineId: Long?) {
+ val runable = object :Runnable {
+ override fun run() {
+ taskDataDao?.let { taskDataDao ->
+ val localTasks = taskDataDao.querySitesByLineId(lineId)
+ if(localTasks==null){
+ taskDataDao.insert(*serverDateList.toTypedArray())
+ // TODO: Ui展示需要动态刷新UI去
+ return
+ }
+
+ // 后台新增数据
+ val needAddDatas = serverDateList - localTasks
+ // 后台没有本地数据库有的未分配线路
+ val needMinusDatas = localTasks - serverDateList
+
+ // TODO: Ui展示需要动态刷新UI去
+
+ if (needAddDatas.isNotEmpty()) {
+ // 新增任务
+ taskDataDao.insert(*needAddDatas.toTypedArray())
+ }
+ if (needMinusDatas.isNotEmpty()) {
+ val needSaveTask = mutableListOf()
+ // 删除任务
+ needMinusDatas.forEach {
+ if(it.status==TaskDataBean.useing||it.status==TaskDataBean.used){
+ needSaveTask.add(it)
+ }
+ }
+ val failneedMinusDatas = needMinusDatas-needSaveTask
+ taskDataDao.delete(*failneedMinusDatas.toTypedArray())
+ }
+ }
+ }
+ }
+ BizLoopManager.runInIoThread(runable)
+
+ }
+
+ fun startTask(taskId: Long, lineId: Long,lineName:String): Observable? {
+ return Observable.just(taskId)
+ .flatMap {
+ var updateCount:Int? = 0
+ var startTime = System.currentTimeMillis()
+ try {
+ // 更新task状态
+ taskDataDao?.queryTaskByTaskIdOne(taskId)?.let {
+ it.startTime = System.currentTimeMillis()
+ it.status = TaskDataBean.useing
+ // 更新任务状态
+ taskDataDao?.updateStatus(System.currentTimeMillis(),TaskDataBean.useing,it.id)
+ OchChainLogManager.writeChainLogDb("开始任务", "变更线路:${lineId}_${lineName}_task:${taskId} 为正在使用的状态")
+ }
+ CallerLogger.d(TAG,"更新任务状态用时:${System.currentTimeMillis()-startTime}")
+ startTime = System.currentTimeMillis()
+ updateCount = TaskSiteDb.startTask(taskId, lineId, lineName)
+ OchChainLogManager.writeChainLogDb("开始任务", "把正在使用的数据更新到RunningTask表格一共${updateCount}行数据")
+ CallerLogger.d(TAG,"插入正在运行的线路用时:${System.currentTimeMillis()-startTime}")
+ } catch (e: Exception) {
+ if (e is DbException) {
+ println("数据不全")
+ // 恢复数据
+ taskDataDao?.queryTaskByTaskIdOne(taskId)?.let {
+ it.startTime = System.currentTimeMillis()
+ it.status = TaskDataBean.unUse
+ // 更新任务状态
+ taskDataDao?.updateStatus(System.currentTimeMillis(),TaskDataBean.unUse,it.id)
+ OchChainLogManager.writeChainLogDb("开始任务", "异常情况${lineId}_${lineName}_task:${taskId} 为未使用的状态 原因:${e.message}")
+ }
+ }
+ return@flatMap Observable.error(DataException(DataException.startTaskErrorCode,e.message?:""))
+ }
+ updateCount?.let {
+ if(it<=0){
+ // 插入失败
+ return@flatMap Observable.error(DataException(DataException.startTaskErrorCode,"未插入数据"))
+ }else{
+ // 开始任务成功
+ return@flatMap Observable.just(true)
+ }
+ }
+ }
+
+ }
+
+ fun queryRunningTaskByLineId(lineId: Long): List? {
+ return taskDataDao?.queryRunningTaskByLineId(lineId)
+ }
+
+ fun deleteByLineId(lineId: Long) {
+ taskDataDao?.deleteByLineId(lineId)
+ }
+
+ fun queryRunningTask(): List? {
+ return taskDataDao?.queryRunningTaskByStatus()
+ }
+
+ fun queryTaskById(taskId: Long): TaskDataBean? {
+ return taskDataDao?.queryTaskByTaskIdOne(taskId)
+ }
+
+ fun queryAllTask(): List? {
+ return taskDataDao?.queryAllTask()
+ }
+
+
+ fun endTask(taskId: Long) {
+ BizLoopManager.runInIoThread{
+ taskDataDao?.endTask(taskId)
+ }
+ }
+
+ fun deleteObsoleteData(){
+ taskDataDao?.deleteObsoleteData()?.let {
+ OchChainLogManager.writeChainLogDb("删除临时数据","Task删除数量:${it}")
+ }
+ }
+
+ fun saveRunningInfo(lineId: Int, taskId: Int, taskTime: Long) {
+ val runningTask = taskDataDao?.queryTaskByTaskIdOne(taskId.toLong())
+ if (runningTask==null) {
+ val taskDataBean = TaskDataBean()
+ taskDataBean.taskId = taskId.toLong()
+ taskDataBean.lineId = lineId.toLong()
+ taskDataBean.status = TaskDataBean.useing
+ taskDataDao?.insert(taskDataBean)
+ }else{
+ runningTask.status = TaskDataBean.useing
+ taskDataDao?.insert(runningTask)
+ }
+ }
+
+ fun endTaskByOther(taskId: Long) {
+ BizLoopManager.runInIoThread{
+ val taskInfo = taskDataDao?.queryTaskByTaskIdOne(taskId)
+ if(taskInfo!=null){
+ if (taskInfo.status == TaskDataBean.unUse) {
+ taskDataDao?.endTask(taskId)
+ }
+ }
+ }
+ }
+
+ fun restoreTask(taskId: Long) {
+ // 更新task状态
+ taskDataDao?.queryTaskByTaskIdOne(taskId)?.let {
+ it.startTime = System.currentTimeMillis()
+ it.status = TaskDataBean.useing
+ // 更新任务状态
+ taskDataDao?.updateStatus(System.currentTimeMillis(),TaskDataBean.useing,it.id)
+ OchChainLogManager.writeChainLogDb("恢复任务", "线路任务改为正在执行的状态")
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/TaskSiteDb.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/TaskSiteDb.kt
new file mode 100644
index 0000000000..a833f02ad4
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/TaskSiteDb.kt
@@ -0,0 +1,165 @@
+package com.mogo.och.offline.repository.db.repository
+
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
+import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
+import com.mogo.och.common.module.manager.loop.BizLoopManager
+import com.mogo.och.data.db.bean.LineDataBean
+import com.mogo.och.data.db.exception.DbException
+import com.mogo.och.offline.repository.db.IDbRepository
+import com.mogo.och.offline.repository.db.MyDataBase
+import com.mogo.och.offline.repository.db.bean.TaskSiteDataBean
+import com.mogo.och.offline.repository.db.dao.TaskSiteDataDao
+
+object TaskSiteDb : IDbRepository {
+
+ private const val TAG = "${M_BUS}TaskSiteDb"
+
+ private var taskSiteDataDao: TaskSiteDataDao? = null
+ get() {
+ if (field == null) {
+ field = MyDataBase.instance?.taskSiteDataDao
+ register()
+ }
+ return field
+ }
+
+ override fun release() {
+ taskSiteDataDao = null
+ }
+
+
+ fun addOrUpdate(vararg lineDataBean: TaskSiteDataBean) {
+ taskSiteDataDao?.insert(*lineDataBean)
+ }
+
+ // 开始线路
+ fun startTask(taskId: Long, linId: Long, lineName: String): Int? {
+ // 获取线路的站点
+ var startTime = System.currentTimeMillis()
+ val querySites = SiteDb.querySiteByLineId(linId)?.distinctBy { it.siteId }
+ if (querySites.isNullOrEmpty()) {
+ throw DbException("没有站点数据")
+ }
+ CallerLogger.d(TAG, "查询站点用时:${System.currentTimeMillis() - startTime}")
+ startTime = System.currentTimeMillis()
+ val toTaskSiteDatas = TaskSiteDataBean.toTaskSiteDatas(
+ querySites,
+ lineName
+ )
+ CallerLogger.d(TAG, "数据转换用时:${System.currentTimeMillis() - startTime}")
+ if (toTaskSiteDatas.size < 2) {
+ throw DbException("站点数据不全请稍后再试")
+ }
+ // 把线路所有的站点搬迁到运行中表格中
+ startTime = System.currentTimeMillis()
+ val result = taskSiteDataDao?.insert(*toTaskSiteDatas.toTypedArray())
+ CallerLogger.d(TAG, "数据插入用时:${System.currentTimeMillis() - startTime}")
+ return if (result.isNullOrEmpty()) {
+ null
+ } else {
+ result.size
+ }
+ }
+
+ // 滑动出发
+ fun updateLeave(taskId: Long, siteId: Long, leave: Boolean) {
+ BizLoopManager.runInIoThread {
+ taskSiteDataDao?.updateLeave(taskId, siteId, if (leave) 1 else 0)
+ }
+ }
+
+ fun updateDrivingStatus(taskId: Long, siteId: Long, drivingStatus: Int) {
+ BizLoopManager.runInIoThread {
+ taskSiteDataDao?.updateDrivingStatus(taskId, siteId, drivingStatus)
+ }
+ }
+
+ fun updateDrivingStatusAndLeave(
+ taskId: Long,
+ siteId: Long,
+ drivingStatus: Int,
+ leave: Boolean
+ ) {
+ BizLoopManager.runInIoThread {
+ taskSiteDataDao?.updateDrivingStatusANdLeave(
+ taskId,
+ siteId,
+ drivingStatus,
+ if (leave) 1 else 0
+ )
+ }
+ }
+
+ fun queryRunningTask(taskId: Long): List? {
+ return taskSiteDataDao?.queryRunningTask(taskId)
+ }
+
+ fun deleteErrorData(taskId: Long) {
+ taskSiteDataDao?.deleteErrorDataByTaskId(taskId)
+ }
+
+ fun deleteObsoleteData() {
+ taskSiteDataDao?.deleteObsoleteData()?.let {
+ OchChainLogManager.writeChainLogDb("删除临时数据", "rurnning Task删除数量:${it}")
+ }
+ }
+
+ /**
+ * 从后台恢复正在执行的任务
+ */
+ fun restoreRunningTask(
+ taskId: Long,
+ currentSiteId: Long,
+ leaving: Boolean,
+ lineInfo: LineDataBean
+ ) {
+ val taskHistory = queryRunningTask(taskId)
+ if (!taskHistory.isNullOrEmpty()) {
+ //有错误数据
+ deleteErrorData(taskId)
+ }
+ // 获取线路的站点
+ val querySites = SiteDb.querySiteByLineId(lineInfo.lineId!!)?.distinctBy { it.siteId }
+ if (querySites.isNullOrEmpty()) {
+ throw DbException("没有站点数据")
+ }
+// val toTaskSiteDatas = TaskSiteDataBean.toTaskSiteDatas(
+// querySites,
+// taskId,
+// lineInfo.lineName!!
+// )
+// val resetData = resetInfo(currentSiteId, leaving, toTaskSiteDatas)
+ // 把线路所有的站点搬迁到运行中表格中
+// taskSiteDataDao?.insert(*resetData.toTypedArray())
+ }
+
+ fun resetInfo(
+ currentSiteId: Long,
+ leaving: Boolean,
+ runningSite: MutableList
+ ): MutableList {
+ var currentSeq = 0
+ runningSite.forEach {
+ if (it.siteId == currentSiteId) {
+ currentSeq = it.seq ?: 0
+ it.drivingStatus = TaskSiteDataBean.drivingStatusCurrent
+ it.leaving = leaving
+ return@forEach
+ }
+ }
+ runningSite.forEach {
+ val seq = it.seq ?: 0
+ if (seq < currentSeq) {
+ it.drivingStatus = TaskSiteDataBean.drivingStatusPassed
+ it.leaving = true
+ } else if (seq > currentSeq) {
+ it.drivingStatus = TaskSiteDataBean.drivingStatusNotArrived
+ it.leaving = false
+ }
+ }
+ return runningSite
+ }
+
+
+}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/exception/DataException.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/exception/DataException.kt
new file mode 100644
index 0000000000..bfa813f2db
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/exception/DataException.kt
@@ -0,0 +1,15 @@
+package com.mogo.och.offline.repository.exception
+
+class DataException: RuntimeException {
+ var code:Int = 0
+ var msg:String = ""
+ constructor() : super()
+ constructor(code:Int, message: String) : super("${code}_${message}"){
+ this.code = code
+ this.msg = message
+ }
+
+ companion object{
+ val startTaskErrorCode = 10010
+ }
+}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/net/IBascApiService.java b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/IBascApiService.java
similarity index 88%
rename from OCH/offline/driver/src/main/java/com/mogo/och/offline/net/IBascApiService.java
rename to OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/IBascApiService.java
index abc781d37a..536004ca4e 100644
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/net/IBascApiService.java
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/IBascApiService.java
@@ -1,5 +1,5 @@
-package com.mogo.och.offline.net;
-import com.mogo.och.offline.bean.BindLineListResponse;
+package com.mogo.och.offline.repository.net;
+import com.mogo.och.offline.repository.net.bean.BindLineListResponse;
import io.reactivex.Observable;
import retrofit2.http.GET;
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/net/OrderServiceManager.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/OrderServiceManager.kt
similarity index 94%
rename from OCH/offline/driver/src/main/java/com/mogo/och/offline/net/OrderServiceManager.kt
rename to OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/OrderServiceManager.kt
index d3241a2de7..e23d134362 100644
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/net/OrderServiceManager.kt
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/OrderServiceManager.kt
@@ -1,4 +1,4 @@
-package com.mogo.och.offline.net
+package com.mogo.och.offline.repository.net
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.commons.AbsMogoApplication
@@ -9,7 +9,7 @@ import com.mogo.och.common.module.constant.OchCommonConst
import com.mogo.och.common.module.network.OchCommonServiceCallback
import com.mogo.och.common.module.network.OchCommonSubscribeImpl
import com.mogo.och.common.module.network.interceptor.transformIoTry
-import com.mogo.och.offline.bean.BindLineListResponse
+import com.mogo.och.offline.repository.net.bean.BindLineListResponse
/**
* @author: wangmingjun
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/bean/BindLineListResponse.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/bean/BindLineListResponse.kt
new file mode 100644
index 0000000000..ba501933bc
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/bean/BindLineListResponse.kt
@@ -0,0 +1,37 @@
+package com.mogo.och.offline.repository.net.bean
+
+import com.mogo.eagle.core.data.BaseData
+import com.mogo.och.data.bean.BusRoutesResult
+import com.mogo.och.data.bean.BusStationBean
+import java.util.*
+
+/**
+ *
+ */
+data class BindLineListResponse(val data: List?) : BaseData(){
+
+ data class Result(
+ var line: LineInfo?,
+ var siteList: List?,//站点名称
+ val contrail: Contrail?,//站点名称
+ )
+
+ data class LineInfo(
+ val lineId:Long?,
+ var lineName:String?,
+ )
+
+ data class Contrail(
+ val csvFileUrl:String?,
+ val csvFileMd5:String?,
+ val txtFileUrl:String?,
+ val txtFileMd5:String?,
+ val contrailSaveTime:Long?,
+ )
+ companion object{
+ fun save2Db(data: BindLineListResponse) {
+
+ }
+ }
+}
+
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/BusStationCommonItem.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/BusStationCommonItem.kt
deleted file mode 100644
index 88a7b65a85..0000000000
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/BusStationCommonItem.kt
+++ /dev/null
@@ -1,99 +0,0 @@
-package com.mogo.och.offline.ui
-
-import android.content.Context
-import android.util.AttributeSet
-import android.view.LayoutInflater
-import android.widget.ImageView
-import android.widget.LinearLayout
-import androidx.core.content.ContextCompat
-import com.mogo.och.common.module.utils.BlinkAnimationUtil
-import com.mogo.och.offline.R
-import kotlinx.android.synthetic.main.offline_stations_common_item.view.*
-
-/**
- * @author: wangmingjun
- * @date: 2022/9/15
- */
-class BusStationCommonItem @JvmOverloads constructor(
- context: Context,
- attrs: AttributeSet? = null,
- defStyleAttr: Int = 0
-) : LinearLayout(context, attrs, defStyleAttr){
-
- init {
- LayoutInflater.from(context).inflate(R.layout.offline_stations_common_item,this,true)
- }
-
- fun setStationName(name: String){
- busStationNameTv.text = name
- }
-
- fun setStationNameColor(color: Int){
- busStationNameTv.setTextColor(color)
- }
-
- fun setStationPointBg(type: Int) { // 0:灰色 过站 1:绿色 到站或者即将到站 2:蓝色:未到站
- BlinkAnimationUtil.clearAnimation(busCircleIv)
- when (type) {
- 0 -> {
- busCircleIvBg.visibility = GONE
- busCircleIv.setImageDrawable(
- ContextCompat.getDrawable(
- context,
- R.drawable.icon_point_grey_bus
- )
- )
- }
- 1 -> {
- busCircleIvBg.visibility = VISIBLE
- busCircleIv.setImageDrawable(
- ContextCompat.getDrawable(
- context,
- R.drawable.icon_point_green_bus
- )
- )
- BlinkAnimationUtil.setAnimation(busCircleIv)
- }
- 2 -> {
- busCircleIvBg.visibility = GONE
- busCircleIv.setImageDrawable(
- ContextCompat.getDrawable(
- context,
- R.drawable.icon_point_blue_bus
- )
- )
- }
-
- }
- }
-
- fun getCircleImageView() : ImageView{
- return busCircleIv
- }
-
- fun setStationArrowBg(type: Int){// 0:灰色 过站 1:绿色 前往下一站 2:蓝色 未到站
- when(type){
- 0 -> busArrowBg.setImageResource(R.drawable.icon_arrow_grey_bus)
- 1 -> busArrowBg.setImageResource(R.drawable.icon_arrow_green_bus)
- 2 -> busArrowBg.setImageResource(R.drawable.icon_arrow_blue_bus)
- }
-
- }
-
- fun setStationTag(tag: String){ // 0:起 1:终
- if (tag.isNullOrEmpty()){
- busTagTxt.visibility = GONE
- }else{
- busTagTxt.text = tag
- busTagTxt.visibility = VISIBLE
- }
- }
-
- fun showOrHideStationArrowBg(isShow:Boolean){
- if (isShow){
- busArrowBg.visibility = VISIBLE
- }else{
- busArrowBg.visibility = GONE
- }
- }
-}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/BusSwitchLineActivity.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/BusSwitchLineActivity.kt
deleted file mode 100644
index 93b9cc2f45..0000000000
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/BusSwitchLineActivity.kt
+++ /dev/null
@@ -1,181 +0,0 @@
-package com.mogo.och.offline.ui
-
-import android.graphics.Point
-import android.os.Bundle
-import android.view.Gravity
-import android.view.View
-import android.view.ViewGroup
-import android.view.WindowManager
-import android.widget.ImageView
-import android.widget.TextView
-import androidx.constraintlayout.widget.ConstraintLayout
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import com.mogo.commons.mvp.MvpActivity
-import com.mogo.commons.storage.SharedPrefsMgr
-import com.mogo.och.offline.presenter.BusLinePresenter
-import com.mogo.och.offline.ui.adapter.SwitchLineAdapter
-import com.mogo.och.offline.ui.adapter.OpenItemAnimator
-import com.mogo.eagle.core.utilcode.mogo.view.SpacesItemDecoration
-import com.mogo.eagle.core.utilcode.util.ToastUtils
-import com.mogo.och.offline.R
-import com.mogo.och.offline.bean.BindLineListResponse
-import java.util.ArrayList
-
-/**
- * @author: wangmingjun
- * @date: 2022/2/8
- */
-class BusSwitchLineActivity : MvpActivity(),
- View.OnClickListener, BusSwitchLineView {
-
- companion object{
- const val LASTCOMMITLINEID = "lastcommitlineid"
- }
-
- private lateinit var mClose: ImageView
- private lateinit var mNoDatasView: ConstraintLayout
- private lateinit var mLinesListView: RecyclerView
- private lateinit var mLineCommitBtn: TextView
- private lateinit var mAdapter: SwitchLineAdapter
- private lateinit var linearLayoutManager:LinearLayoutManager
- private val mData: MutableList = ArrayList()
- private var checkLineInfo:BindLineListResponse.Result? = null
- override fun getLayoutId(): Int {
- return R.layout.offline_switch_line
- }
-
- override fun createPresenter(): BusLinePresenter {
- return BusLinePresenter(this)
- }
-
- override fun initViews() {
- initWH()
- initView()
- }
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
-
- }
-
- override fun onResume() {
- super.onResume()
- initDatas()
- }
-
- /**
- * 初始化view
- */
- private fun initView() {
- mClose = findViewById(R.id.switch_line_close)
- mClose.setOnClickListener(this)
- mNoDatasView = findViewById(R.id.no_order_data_view)
- mLineCommitBtn = findViewById(R.id.switch_line_btn_commit)
- mLineCommitBtn.setOnClickListener(this)
- mLinesListView = findViewById(R.id.switch_line_rv)
- linearLayoutManager = LinearLayoutManager(this)
- mLinesListView.setLayoutManager(linearLayoutManager)
- mLinesListView.setItemAnimator(OpenItemAnimator())
- mAdapter = SwitchLineAdapter(applicationContext, mData)
- mLinesListView.addItemDecoration(
- SpacesItemDecoration(
- 4
- )
- )
- mLinesListView.setAdapter(mAdapter)
- //设置item 点击事件
- mAdapter.setOnLineItemClickListener(object : SwitchLineAdapter.LineItemClickListener{
- override fun onItemClick(lineInfo: BindLineListResponse.Result) {
- // 选中的线路
- checkLineInfo = lineInfo
- }
- })
- }
-
- /**
- * 设置布局宽高
- */
- private fun initWH() {
- val window = window
- val params = window.attributes
- val windowManager = getSystemService(WINDOW_SERVICE) as WindowManager
- val point = Point()
- windowManager.defaultDisplay.getSize(point) //用于获取屏幕高度
- params.width = (point.x * 0.375).toInt()
- params.height = ViewGroup.LayoutParams.MATCH_PARENT
- window.attributes = params
- window.setGravity(Gravity.START or Gravity.BOTTOM)
- }
-
- /**
- * 初始化数据
- */
- private fun initDatas() {
- mPresenter?.queryBusLines()
- }
-
- /**
- * 查询返回绑定路线集合
- * @param data
- */
- override fun onBusLinesChange(data: BindLineListResponse?) {
- if (null == data) {
- showNoData(true)
- return
- }
- if (data.data != null && data.data.size > 0) {
- showNoData(false)
- mData.clear()
- mData.addAll(data.data)
- mAdapter.notifyDataSetChanged()
- } else {
- showNoData(true)
- }
- }
-
- override fun onChangeLineIdSuccess() {
- ToastUtils.showLong(resources.getString(R.string.bus_change_line_commit_tip_s))
- mPresenter?.queryBusRoutes()
- mAdapter.setOnLineItemClickListener(null)
- mPresenter?.removeListener()
- finish()
- }
-
- /**
- * 有无数据UI显示
- * @param b
- */
- private fun showNoData(b: Boolean) {
- if (b) {
- mLinesListView.visibility = View.GONE
- mLineCommitBtn.visibility = View.GONE
- mNoDatasView.visibility = View.VISIBLE
- } else {
- mLinesListView.visibility = View.VISIBLE
- mLineCommitBtn.visibility = View.VISIBLE
- mNoDatasView.visibility = View.GONE
- }
- }
-
- override fun onClick(v: View) {
- //关闭dialog
- if (v.id == R.id.switch_line_close) {
- finish()
- return
- }
- //切换路线提交
- if (v.id == R.id.switch_line_btn_commit) {
- if (checkLineInfo==null) {
- ToastUtils.showLong("请选择任务")
- }else{
- mPresenter?.commitSwitchLineId(checkLineInfo)
- }
- }
- }
-
- override fun onDestroy() {
- mPresenter!!.removeListener()
- super.onDestroy()
- }
-}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/BusSwitchLineView.java b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/BusSwitchLineView.java
deleted file mode 100644
index e49d76f67e..0000000000
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/BusSwitchLineView.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.mogo.och.offline.ui;
-
-import com.mogo.commons.mvp.IView;
-import com.mogo.och.offline.bean.BindLineListResponse;
-
-/**
- * @author: wangmingjun
- * @date: 2022/2/10
- */
-public interface BusSwitchLineView extends IView {
-
- void onBusLinesChange(BindLineListResponse data);
- void onChangeLineIdSuccess();
-
-}
-
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/adapter/OpenItemAnimator.java b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/adapter/OpenItemAnimator.java
deleted file mode 100644
index fc7beebd9c..0000000000
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/adapter/OpenItemAnimator.java
+++ /dev/null
@@ -1,643 +0,0 @@
-package com.mogo.och.offline.ui.adapter;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.TimeInterpolator;
-import android.animation.ValueAnimator;
-import android.view.View;
-import android.view.ViewPropertyAnimator;
-
-import androidx.annotation.NonNull;
-import androidx.core.view.ViewCompat;
-import androidx.recyclerview.widget.DefaultItemAnimator;
-import androidx.recyclerview.widget.RecyclerView;
-import androidx.recyclerview.widget.SimpleItemAnimator;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * This implementation of {@link RecyclerView.ItemAnimator} provides basic
- * animations on remove, add, and move events that happen to the items in
- * a RecyclerView. RecyclerView uses a DefaultItemAnimator by default.
- *
- * @see RecyclerView#setItemAnimator(RecyclerView.ItemAnimator)
- */
-public class OpenItemAnimator extends DefaultItemAnimator {
- private static final boolean DEBUG = false;
-
- private static TimeInterpolator sDefaultInterpolator;
-
- private final ArrayList mPendingRemovals = new ArrayList<>();
- private final ArrayList mPendingAdditions = new ArrayList<>();
- private final ArrayList mPendingMoves = new ArrayList<>();
- private final ArrayList mPendingChanges = new ArrayList<>();
-
- ArrayList> mAdditionsList = new ArrayList<>();
- ArrayList> mMovesList = new ArrayList<>();
- ArrayList> mChangesList = new ArrayList<>();
-
- ArrayList mAddAnimations = new ArrayList<>();
- ArrayList mMoveAnimations = new ArrayList<>();
- ArrayList mRemoveAnimations = new ArrayList<>();
- ArrayList mChangeAnimations = new ArrayList<>();
-
- private static class MoveInfo {
- public RecyclerView.ViewHolder holder;
- public int fromX, fromY, toX, toY;
-
- MoveInfo(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) {
- this.holder = holder;
- this.fromX = fromX;
- this.fromY = fromY;
- this.toX = toX;
- this.toY = toY;
- }
- }
-
- private static class ChangeInfo {
- public RecyclerView.ViewHolder oldHolder, newHolder;
- public int fromX, fromY, toX, toY;
- private ChangeInfo(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder) {
- this.oldHolder = oldHolder;
- this.newHolder = newHolder;
- }
-
- ChangeInfo(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder,
- int fromX, int fromY, int toX, int toY) {
- this(oldHolder, newHolder);
- this.fromX = fromX;
- this.fromY = fromY;
- this.toX = toX;
- this.toY = toY;
- }
-
- @Override
- public String toString() {
- return "ChangeInfo{"
- + "oldHolder=" + oldHolder
- + ", newHolder=" + newHolder
- + ", fromX=" + fromX
- + ", fromY=" + fromY
- + ", toX=" + toX
- + ", toY=" + toY
- + '}';
- }
- }
-
- @Override
- public void runPendingAnimations() {
- boolean removalsPending = !mPendingRemovals.isEmpty();
- boolean movesPending = !mPendingMoves.isEmpty();
- boolean changesPending = !mPendingChanges.isEmpty();
- boolean additionsPending = !mPendingAdditions.isEmpty();
- if (!removalsPending && !movesPending && !additionsPending && !changesPending) {
- // nothing to animate
- return;
- }
- // First, remove stuff
- for (RecyclerView.ViewHolder holder : mPendingRemovals) {
- animateRemoveImpl(holder);
- }
- mPendingRemovals.clear();
- // Next, move stuff
- if (movesPending) {
- final ArrayList moves = new ArrayList<>(mPendingMoves);
- mMovesList.add(moves);
- mPendingMoves.clear();
- Runnable mover = () -> {
- for (MoveInfo moveInfo : moves) {
- animateMoveImpl(moveInfo.holder, moveInfo.fromX, moveInfo.fromY,
- moveInfo.toX, moveInfo.toY);
- }
- moves.clear();
- mMovesList.remove(moves);
- };
- if (removalsPending) {
- View view = moves.get(0).holder.itemView;
- ViewCompat.postOnAnimationDelayed(view, mover, getRemoveDuration());
- } else {
- mover.run();
- }
- }
- // Next, change stuff, to run in parallel with move animations
- if (changesPending) {
- final ArrayList changes = new ArrayList<>(mPendingChanges);
- mChangesList.add(changes);
- mPendingChanges.clear();
- Runnable changer = () -> {
- for (ChangeInfo change : changes) {
- animateChangeImpl(change);
- }
- changes.clear();
- mChangesList.remove(changes);
- };
- if (removalsPending) {
- RecyclerView.ViewHolder holder = changes.get(0).oldHolder;
- ViewCompat.postOnAnimationDelayed(holder.itemView, changer, getRemoveDuration());
- } else {
- changer.run();
- }
- }
- // Next, add stuff
- if (additionsPending) {
- final ArrayList additions = new ArrayList<>(mPendingAdditions);
- mAdditionsList.add(additions);
- mPendingAdditions.clear();
- Runnable adder = () -> {
- for (RecyclerView.ViewHolder holder : additions) {
- animateAddImpl(holder);
- }
- additions.clear();
- mAdditionsList.remove(additions);
- };
- if (removalsPending || movesPending || changesPending) {
- long removeDuration = removalsPending ? getRemoveDuration() : 0;
- long moveDuration = movesPending ? getMoveDuration() : 0;
- long changeDuration = changesPending ? getChangeDuration() : 0;
- long totalDelay = removeDuration + Math.max(moveDuration, changeDuration);
- View view = additions.get(0).itemView;
- ViewCompat.postOnAnimationDelayed(view, adder, totalDelay);
- } else {
- adder.run();
- }
- }
- }
-
- @Override
- public boolean animateRemove(final RecyclerView.ViewHolder holder) {
- resetAnimation(holder);
- mPendingRemovals.add(holder);
- return true;
- }
-
- private void animateRemoveImpl(final RecyclerView.ViewHolder holder) {
- final View view = holder.itemView;
- final ViewPropertyAnimator animation = view.animate();
- mRemoveAnimations.add(holder);
- animation.setDuration(getRemoveDuration()).alpha(0).setListener(
- new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animator) {
- dispatchRemoveStarting(holder);
- }
-
- @Override
- public void onAnimationEnd(Animator animator) {
- animation.setListener(null);
- view.setAlpha(1);
- dispatchRemoveFinished(holder);
- mRemoveAnimations.remove(holder);
- dispatchFinishedWhenDone();
- }
- }).start();
- }
-
- @Override
- public boolean animateAdd(final RecyclerView.ViewHolder holder) {
- resetAnimation(holder);
- holder.itemView.setAlpha(0);
- mPendingAdditions.add(holder);
- return true;
- }
-
- void animateAddImpl(final RecyclerView.ViewHolder holder) {
- final View view = holder.itemView;
- final ViewPropertyAnimator animation = view.animate();
- mAddAnimations.add(holder);
- animation.alpha(1).setDuration(getAddDuration())
- .setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animator) {
- dispatchAddStarting(holder);
- }
-
- @Override
- public void onAnimationCancel(Animator animator) {
- view.setAlpha(1);
- }
-
- @Override
- public void onAnimationEnd(Animator animator) {
- animation.setListener(null);
- dispatchAddFinished(holder);
- mAddAnimations.remove(holder);
- dispatchFinishedWhenDone();
- }
- }).start();
- }
-
- @Override
- public boolean animateMove(final RecyclerView.ViewHolder holder, int fromX, int fromY,
- int toX, int toY) {
- final View view = holder.itemView;
- fromX += (int) holder.itemView.getTranslationX();
- fromY += (int) holder.itemView.getTranslationY();
- resetAnimation(holder);
- int deltaX = toX - fromX;
- int deltaY = toY - fromY;
- if (deltaX == 0 && deltaY == 0) {
- dispatchMoveFinished(holder);
- return false;
- }
- if (deltaX != 0) {
- view.setTranslationX(-deltaX);
- }
- if (deltaY != 0) {
- view.setTranslationY(-deltaY);
- }
- mPendingMoves.add(new MoveInfo(holder, fromX, fromY, toX, toY));
- return true;
- }
-
- void animateMoveImpl(final RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) {
- final View view = holder.itemView;
- final int deltaX = toX - fromX;
- final int deltaY = toY - fromY;
- if (deltaX != 0) {
- view.animate().translationX(0);
- }
- if (deltaY != 0) {
- view.animate().translationY(0);
- }
- // TODO: make EndActions end listeners instead, since end actions aren't called when
- // vpas are canceled (and can't end them. why?)
- // need listener functionality in VPACompat for this. Ick.
- final ViewPropertyAnimator animation = view.animate();
- mMoveAnimations.add(holder);
- animation.setDuration(getMoveDuration()).setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animator) {
- dispatchMoveStarting(holder);
- }
-
- @Override
- public void onAnimationCancel(Animator animator) {
- if (deltaX != 0) {
- view.setTranslationX(0);
- }
- if (deltaY != 0) {
- view.setTranslationY(0);
- }
- }
-
- @Override
- public void onAnimationEnd(Animator animator) {
- animation.setListener(null);
- dispatchMoveFinished(holder);
- mMoveAnimations.remove(holder);
- dispatchFinishedWhenDone();
- }
- }).start();
- }
-
- @Override
- public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder,
- int fromX, int fromY, int toX, int toY) {
- if (oldHolder == newHolder) {
- // Don't know how to run change animations when the same view holder is re-used.
- // run a move animation to handle position changes.
- return animateMove(oldHolder, fromX, fromY, toX, toY);
- }
- final float prevTranslationX = oldHolder.itemView.getTranslationX();
- final float prevTranslationY = oldHolder.itemView.getTranslationY();
- final float prevAlpha = oldHolder.itemView.getAlpha();
- resetAnimation(oldHolder);
- int deltaX = (int) (toX - fromX - prevTranslationX);
- int deltaY = (int) (toY - fromY - prevTranslationY);
- // recover prev translation state after ending animation
- oldHolder.itemView.setTranslationX(prevTranslationX);
- oldHolder.itemView.setTranslationY(prevTranslationY);
- oldHolder.itemView.setAlpha(prevAlpha);
- if (newHolder != null) {
- // carry over translation values
- resetAnimation(newHolder);
- newHolder.itemView.setTranslationX(-deltaX);
- newHolder.itemView.setTranslationY(-deltaY);
- newHolder.itemView.setAlpha(0);
- }
- mPendingChanges.add(new ChangeInfo(oldHolder, newHolder, fromX, fromY, toX, toY));
- return true;
- }
-
- void animateChangeImpl(final ChangeInfo changeInfo) {
- final RecyclerView.ViewHolder holder = changeInfo.oldHolder;
- final View view = holder == null ? null : holder.itemView;
- final RecyclerView.ViewHolder newHolder = changeInfo.newHolder;
- final View newView = newHolder != null ? newHolder.itemView : null;
- if (view != null) {
- final ViewPropertyAnimator oldViewAnim = view.animate().setDuration(
- getChangeDuration());
- mChangeAnimations.add(changeInfo.oldHolder);
- oldViewAnim.translationX((float)(changeInfo.toX - changeInfo.fromX));
- oldViewAnim.translationY((float)(changeInfo.toY - changeInfo.fromY));
- oldViewAnim.alpha(0).setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animator) {
- dispatchChangeStarting(changeInfo.oldHolder, true);
- }
-
- @Override
- public void onAnimationEnd(Animator animator) {
- oldViewAnim.setListener(null);
- view.setAlpha(1);
- view.setTranslationX(0);
- view.setTranslationY(0);
- dispatchChangeFinished(changeInfo.oldHolder, true);
- mChangeAnimations.remove(changeInfo.oldHolder);
- dispatchFinishedWhenDone();
- }
- }).start();
- }
- if (newView != null) {
- final ViewPropertyAnimator newViewAnimation = newView.animate();
- mChangeAnimations.add(changeInfo.newHolder);
- newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration())
- .alpha(1).setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animator) {
- dispatchChangeStarting(changeInfo.newHolder, false);
- }
- @Override
- public void onAnimationEnd(Animator animator) {
- newViewAnimation.setListener(null);
- newView.setAlpha(1);
- newView.setTranslationX(0);
- newView.setTranslationY(0);
- dispatchChangeFinished(changeInfo.newHolder, false);
- mChangeAnimations.remove(changeInfo.newHolder);
- dispatchFinishedWhenDone();
- }
- }).start();
- }
- }
-
- private void endChangeAnimation(List infoList, RecyclerView.ViewHolder item) {
- for (int i = infoList.size() - 1; i >= 0; i--) {
- ChangeInfo changeInfo = infoList.get(i);
- if (endChangeAnimationIfNecessary(changeInfo, item)) {
- if (changeInfo.oldHolder == null && changeInfo.newHolder == null) {
- infoList.remove(changeInfo);
- }
- }
- }
- }
-
- private void endChangeAnimationIfNecessary(ChangeInfo changeInfo) {
- if (changeInfo.oldHolder != null) {
- endChangeAnimationIfNecessary(changeInfo, changeInfo.oldHolder);
- }
- if (changeInfo.newHolder != null) {
- endChangeAnimationIfNecessary(changeInfo, changeInfo.newHolder);
- }
- }
- private boolean endChangeAnimationIfNecessary(ChangeInfo changeInfo, RecyclerView.ViewHolder item) {
- boolean oldItem = false;
- if (changeInfo.newHolder == item) {
- changeInfo.newHolder = null;
- } else if (changeInfo.oldHolder == item) {
- changeInfo.oldHolder = null;
- oldItem = true;
- } else {
- return false;
- }
- item.itemView.setAlpha(1);
- item.itemView.setTranslationX(0);
- item.itemView.setTranslationY(0);
- dispatchChangeFinished(item, oldItem);
- return true;
- }
-
- @Override
- public void endAnimation(RecyclerView.ViewHolder item) {
- final View view = item.itemView;
- // this will trigger end callback which should set properties to their target values.
- view.animate().cancel();
- // TODO if some other animations are chained to end, how do we cancel them as well?
- for (int i = mPendingMoves.size() - 1; i >= 0; i--) {
- MoveInfo moveInfo = mPendingMoves.get(i);
- if (moveInfo.holder == item) {
- view.setTranslationY(0);
- view.setTranslationX(0);
- dispatchMoveFinished(item);
- mPendingMoves.remove(i);
- }
- }
- endChangeAnimation(mPendingChanges, item);
- if (mPendingRemovals.remove(item)) {
- view.setAlpha(1);
- dispatchRemoveFinished(item);
- }
- if (mPendingAdditions.remove(item)) {
- view.setAlpha(1);
- dispatchAddFinished(item);
- }
-
- for (int i = mChangesList.size() - 1; i >= 0; i--) {
- ArrayList changes = mChangesList.get(i);
- endChangeAnimation(changes, item);
- if (changes.isEmpty()) {
- mChangesList.remove(i);
- }
- }
- for (int i = mMovesList.size() - 1; i >= 0; i--) {
- ArrayList moves = mMovesList.get(i);
- for (int j = moves.size() - 1; j >= 0; j--) {
- MoveInfo moveInfo = moves.get(j);
- if (moveInfo.holder == item) {
- view.setTranslationY(0);
- view.setTranslationX(0);
- dispatchMoveFinished(item);
- moves.remove(j);
- if (moves.isEmpty()) {
- mMovesList.remove(i);
- }
- break;
- }
- }
- }
- for (int i = mAdditionsList.size() - 1; i >= 0; i--) {
- ArrayList additions = mAdditionsList.get(i);
- if (additions.remove(item)) {
- view.setAlpha(1);
- dispatchAddFinished(item);
- if (additions.isEmpty()) {
- mAdditionsList.remove(i);
- }
- }
- }
-
- // animations should be ended by the cancel above.
- //noinspection PointlessBooleanExpression,ConstantConditions
- if (mRemoveAnimations.remove(item) && DEBUG) {
- throw new IllegalStateException("after animation is cancelled, item should not be in "
- + "mRemoveAnimations list");
- }
-
- //noinspection PointlessBooleanExpression,ConstantConditions
- if (mAddAnimations.remove(item) && DEBUG) {
- throw new IllegalStateException("after animation is cancelled, item should not be in "
- + "mAddAnimations list");
- }
-
- //noinspection PointlessBooleanExpression,ConstantConditions
- if (mChangeAnimations.remove(item) && DEBUG) {
- throw new IllegalStateException("after animation is cancelled, item should not be in "
- + "mChangeAnimations list");
- }
-
- //noinspection PointlessBooleanExpression,ConstantConditions
- if (mMoveAnimations.remove(item) && DEBUG) {
- throw new IllegalStateException("after animation is cancelled, item should not be in "
- + "mMoveAnimations list");
- }
- dispatchFinishedWhenDone();
- }
-
- private void resetAnimation(RecyclerView.ViewHolder holder) {
- if (sDefaultInterpolator == null) {
- sDefaultInterpolator = new ValueAnimator().getInterpolator();
- }
- holder.itemView.animate().setInterpolator(sDefaultInterpolator);
- endAnimation(holder);
- }
-
- @Override
- public boolean isRunning() {
- return (!mPendingAdditions.isEmpty()
- || !mPendingChanges.isEmpty()
- || !mPendingMoves.isEmpty()
- || !mPendingRemovals.isEmpty()
- || !mMoveAnimations.isEmpty()
- || !mRemoveAnimations.isEmpty()
- || !mAddAnimations.isEmpty()
- || !mChangeAnimations.isEmpty()
- || !mMovesList.isEmpty()
- || !mAdditionsList.isEmpty()
- || !mChangesList.isEmpty());
- }
-
- /**
- * Check the state of currently pending and running animations. If there are none
- * pending/running, call {@link #dispatchAnimationsFinished()} to notify any
- * listeners.
- */
- void dispatchFinishedWhenDone() {
- if (!isRunning()) {
- dispatchAnimationsFinished();
- }
- }
-
- @Override
- public void endAnimations() {
- int count = mPendingMoves.size();
- for (int i = count - 1; i >= 0; i--) {
- MoveInfo item = mPendingMoves.get(i);
- View view = item.holder.itemView;
- view.setTranslationY(0);
- view.setTranslationX(0);
- dispatchMoveFinished(item.holder);
- mPendingMoves.remove(i);
- }
- count = mPendingRemovals.size();
- for (int i = count - 1; i >= 0; i--) {
- RecyclerView.ViewHolder item = mPendingRemovals.get(i);
- dispatchRemoveFinished(item);
- mPendingRemovals.remove(i);
- }
- count = mPendingAdditions.size();
- for (int i = count - 1; i >= 0; i--) {
- RecyclerView.ViewHolder item = mPendingAdditions.get(i);
- item.itemView.setAlpha(1);
- dispatchAddFinished(item);
- mPendingAdditions.remove(i);
- }
- count = mPendingChanges.size();
- for (int i = count - 1; i >= 0; i--) {
- endChangeAnimationIfNecessary(mPendingChanges.get(i));
- }
- mPendingChanges.clear();
- if (!isRunning()) {
- return;
- }
-
- int listCount = mMovesList.size();
- for (int i = listCount - 1; i >= 0; i--) {
- ArrayList moves = mMovesList.get(i);
- count = moves.size();
- for (int j = count - 1; j >= 0; j--) {
- MoveInfo moveInfo = moves.get(j);
- RecyclerView.ViewHolder item = moveInfo.holder;
- View view = item.itemView;
- view.setTranslationY(0);
- view.setTranslationX(0);
- dispatchMoveFinished(moveInfo.holder);
- moves.remove(j);
- if (moves.isEmpty()) {
- mMovesList.remove(moves);
- }
- }
- }
- listCount = mAdditionsList.size();
- for (int i = listCount - 1; i >= 0; i--) {
- ArrayList additions = mAdditionsList.get(i);
- count = additions.size();
- for (int j = count - 1; j >= 0; j--) {
- RecyclerView.ViewHolder item = additions.get(j);
- View view = item.itemView;
- view.setAlpha(1);
- dispatchAddFinished(item);
- additions.remove(j);
- if (additions.isEmpty()) {
- mAdditionsList.remove(additions);
- }
- }
- }
- listCount = mChangesList.size();
- for (int i = listCount - 1; i >= 0; i--) {
- ArrayList changes = mChangesList.get(i);
- count = changes.size();
- for (int j = count - 1; j >= 0; j--) {
- endChangeAnimationIfNecessary(changes.get(j));
- if (changes.isEmpty()) {
- mChangesList.remove(changes);
- }
- }
- }
-
- cancelAll(mRemoveAnimations);
- cancelAll(mMoveAnimations);
- cancelAll(mAddAnimations);
- cancelAll(mChangeAnimations);
-
- dispatchAnimationsFinished();
- }
-
- void cancelAll(List viewHolders) {
- for (int i = viewHolders.size() - 1; i >= 0; i--) {
- viewHolders.get(i).itemView.animate().cancel();
- }
- }
-
- /**
- * {@inheritDoc}
- *
- * If the payload list is not empty, DefaultItemAnimator returns true.
- * When this is the case:
- *
- * If you override {@link #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)}, both
- * ViewHolder arguments will be the same instance.
- *
- *
- * If you are not overriding {@link #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)},
- * then DefaultItemAnimator will call {@link #animateMove(RecyclerView.ViewHolder, int, int, int, int)} and
- * run a move animation instead.
- *
- *
- */
- @Override
- public boolean canReuseUpdatedViewHolder(@NonNull RecyclerView.ViewHolder viewHolder,
- @NonNull List payloads) {
- return !payloads.isEmpty() || super.canReuseUpdatedViewHolder(viewHolder, payloads);
- }
-}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/adapter/SwitchLineAdapter.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/adapter/SwitchLineAdapter.kt
deleted file mode 100644
index cdd6fa06db..0000000000
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/adapter/SwitchLineAdapter.kt
+++ /dev/null
@@ -1,107 +0,0 @@
-package com.mogo.och.offline.ui.adapter
-
-import android.content.Context
-import android.graphics.Color
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.ImageView
-import androidx.appcompat.widget.AppCompatTextView
-import androidx.recyclerview.widget.RecyclerView
-import com.mogo.och.offline.R
-import com.mogo.och.offline.bean.BindLineListResponse
-import com.mogo.och.offline.ui.adapter.SwitchLineAdapter.SwitchLineViewHolder
-import kotlin.text.StringBuilder
-
-/**
- * 路线列表adapter
- */
-class SwitchLineAdapter(
- private val mContext: Context,
- private val mData: List
-) : RecyclerView.Adapter() {
- companion object{
- const val TAG = "SwitchLineAdapter"
- }
- // RecyclerView设置点击事件
- private var mItemClickListener: LineItemClickListener? = null
- private var checkInfo:BindLineListResponse.Result? = null
- override fun onCreateViewHolder(
- parent: ViewGroup,
- viewType: Int
- ): SwitchLineViewHolder {
- val view = LayoutInflater.from(mContext).inflate(
- R.layout.offline_switch_line_list_item, parent, false
- )
- return SwitchLineViewHolder(view)
- }
-
- override fun onBindViewHolder(holder: SwitchLineViewHolder, position: Int) {
- val currentPosition = holder.bindingAdapterPosition
- val lineInfo = mData[currentPosition]
-
- if (lineInfo==checkInfo) {
- holder.itemView.setBackgroundResource(R.drawable.bus_shape_select_line_item_bg_normal)
- } else {
- holder.itemView.setBackgroundColor(Color.parseColor("#162761"))
- }
-
- lineInfo.line?.let {line->
- line.lineName?.let {
- if(it.length>10){
- holder.linelineName.text = it.substring(0,10)+"…"
- }else{
- holder.linelineName.text = lineInfo.line?.lineName
- }
- }
-
- }
-
- lineInfo.siteList?.let {
- val last = it.last()
- last.name?.let {siteName->
- val sb = StringBuilder()
- if (siteName.length>10) {
- sb.append(siteName.substring(0,5))
- sb.append("…")
- sb.append(siteName.substring(siteName.length-5,siteName.length))
- }else{
- sb.append(siteName)
- }
- val string = mContext.getString(R.string.bus_line_goto_end, sb.toString())
- holder.lineEndlineName.text = string
- }
- }
-
- //设置item点击事件
- holder.itemView.setOnClickListener {
- val oldPosition = mData.indexOf(checkInfo)
- checkInfo = lineInfo
- notifyItemChanged(oldPosition)
- notifyItemChanged(currentPosition)
- mItemClickListener?.onItemClick(lineInfo)
- }
- }
-
- override fun getItemCount(): Int {
- return mData.size
- }
-
- fun setOnLineItemClickListener(itemClickListener: LineItemClickListener?) {
- mItemClickListener = itemClickListener
- }
-
- class SwitchLineViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
- val linelineName: AppCompatTextView//线路名称
- val lineEndlineName: AppCompatTextView //终点
-
- init {
- linelineName = itemView.findViewById(R.id.switch_line_name)
- lineEndlineName = itemView.findViewById(R.id.switch_line_end_station)
- }
- }
-
- interface LineItemClickListener {
- fun onItemClick(lineInfo: BindLineListResponse.Result)
- }
-}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/bizswitch/SwitchBizView.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/bizswitch/SwitchBizView.kt
new file mode 100644
index 0000000000..c7db418ab5
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/bizswitch/SwitchBizView.kt
@@ -0,0 +1,119 @@
+package com.mogo.och.offline.ui.bizswitch
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.findViewTreeViewModelStoreOwner
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
+import com.mogo.eagle.core.utilcode.util.ThreadUtils
+import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
+import com.mogo.och.common.module.utils.ResourcesUtils
+import com.mogo.och.common.module.utils.RxUtils
+import com.mogo.och.common.module.wigets.WindowRelativeLayout
+import com.mogo.och.offline.R
+import io.reactivex.disposables.Disposable
+import kotlinx.android.synthetic.main.offline_switch_biz.view.loading_biz
+import kotlinx.android.synthetic.main.offline_switch_biz.view.swtichLine
+import kotlinx.android.synthetic.main.offline_switch_biz.view.taskRunning
+
+class SwitchBizView: WindowRelativeLayout, SwtichBizModel.SwtichLineViewCallback {
+
+
+ constructor(context: Context?) : super(context)
+
+ constructor(context: Context?, attributeSet: AttributeSet) : super(context, attributeSet)
+
+ constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr)
+
+ constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes)
+
+
+ companion object {
+ const val TAG = M_BUS+"SwitchBizView"
+ }
+
+ private var viewModel: SwtichBizModel?=null
+
+ private var queryTimeout: Disposable? = null
+
+
+ init {
+ LayoutInflater.from(context).inflate(R.layout.offline_switch_biz, this, true)
+ initView()
+ }
+
+ private fun initView(){
+ loading_biz.setEmptyText(ResourcesUtils.getString(R.string.offline_switch_biz_loading))
+ }
+
+ override fun onAttachedToWindow() {
+ CallerLogger.d(TAG,"SwitchBizView:onAttachedToWindow")
+ super.onAttachedToWindow()
+ viewModel = findViewTreeViewModelStoreOwner()?.let {
+ ViewModelProvider(it)[SwtichBizModel::class.java]
+ }
+ viewModel?.setSwitchBizCallback(this)
+ }
+
+ override fun onDetachedFromWindow() {
+ super.onDetachedFromWindow()
+ CallerLogger.d(TAG,"SwitchBizView:onDetachedFromWindow")
+ }
+
+ var startLoading = System.currentTimeMillis()
+
+ /**
+ * 展示loading页面
+ * 1、
+ * 2、第一次加载页面时展示
+ * 3、
+ */
+ override fun showLoadingView(){
+ startLoading = System.currentTimeMillis()
+ CallerLogger.d(TAG,"开始展示 lading 时间:${startLoading}")
+ loading_biz.visibility = VISIBLE
+ swtichLine.visibility = GONE
+ queryTimeout = RxUtils.createSubscribe(10_1000) {
+ OchChainLogManager.writeChainLog("Loading超时","loading 展示了10s")
+ CallerLogger.d(TAG,"Loading超时:loading 展示了10s")
+ viewModel?.queryRuningTask()
+ }
+ }
+
+ /**
+ * 初始化数据
+ */
+ override fun loadLineData() {
+ swtichLine.loadingDatas()
+ }
+
+ // 展示选择线路页面
+ override fun showSwtichLineView() {
+ RxUtils.disposeSubscribe(queryTimeout)
+ val endLoading = System.currentTimeMillis()
+ val dex = (100-(endLoading - startLoading)).takeIf { it>=0 }?:0
+ CallerLogger.d(TAG,"展示线路 lading 展示了 ${dex}毫秒")
+ ThreadUtils.runOnUiThreadDelayed({
+ loading_biz.visibility = GONE
+ swtichLine.visibility = VISIBLE
+ taskRunning.visibility = GONE
+ },dex,ThreadUtils.MODE.QUEUE)
+
+ }
+ // 展示正在进行的任务
+ override fun loadRunningTask() {
+ RxUtils.disposeSubscribe(queryTimeout)
+ val endLoading = System.currentTimeMillis()
+ val dex = (100-(endLoading - startLoading)).takeIf { it>=0 }?:0
+ CallerLogger.d(TAG,"展示运行中任务 lading 展示了 ${dex}毫秒")
+ ThreadUtils.runOnUiThreadDelayed({
+ loading_biz.visibility = GONE
+ swtichLine.visibility = GONE
+ taskRunning.visibility = VISIBLE
+ taskRunning.showRunningTaskInfo()
+ },dex,ThreadUtils.MODE.QUEUE)
+ }
+
+}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/bizswitch/SwtichBizModel.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/bizswitch/SwtichBizModel.kt
new file mode 100644
index 0000000000..3ab7ff601e
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/bizswitch/SwtichBizModel.kt
@@ -0,0 +1,77 @@
+package com.mogo.och.offline.ui.bizswitch
+
+import androidx.lifecycle.ViewModel
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
+import com.mogo.eagle.core.utilcode.util.ThreadUtils
+import com.mogo.och.offline.callback.IBusLinesCallback
+import com.mogo.och.offline.model.LineModel
+import com.mogo.och.offline.model.OrderModel
+
+/**
+ * @author XuXinChao
+ * @description BadCase录包管理页面
+ * @since: 2022/12/15
+ */
+class SwtichBizModel : ViewModel(), IBusLinesCallback {
+
+ private val TAG = M_BUS + SwtichBizModel::class.java.simpleName
+
+ private var viewCallback: SwtichLineViewCallback? = null
+
+
+ override fun onCleared() {
+ d(TAG, "onCleared")
+ LineModel.setBusLinesCallback(TAG, null)
+ }
+
+ fun setSwitchBizCallback(viewCallback: SwtichLineViewCallback) {
+ d(TAG, "setSwitchBizCallback")
+ LineModel.setBusLinesCallback(TAG, this)
+ this.viewCallback = viewCallback
+ this.viewCallback?.showLoadingView()
+ ThreadUtils.getIoPool().execute {
+ OrderModel.queryBusRoutes()
+ }
+ }
+
+ fun queryRuningTask() {
+ ThreadUtils.getIoPool().execute {
+ OrderModel.queryBusRoutes()
+ }
+ }
+
+ fun showSwitchLineInfo() {
+ viewCallback?.showLoadingView()
+ viewCallback?.loadLineData()
+ }
+
+ fun showSwitchLineInfoResult() {
+ viewCallback?.showSwtichLineView()
+ }
+
+
+ interface SwtichLineViewCallback {
+ fun showSwtichLineView()
+ fun showLoadingView()
+ fun loadLineData()
+ fun loadRunningTask()
+ }
+
+
+ override fun onNoRunningTask() {
+ this.viewCallback?.loadLineData()
+ d(TAG, "没有任务去加载线路")
+ }
+
+ override fun onRunningTask() {
+ this.viewCallback?.loadRunningTask()
+ d(TAG, "有任务去加载正在执行的任务")
+ }
+
+
+ override fun onCompleteTask() {
+ OrderModel.queryBusRoutes()
+ }
+}
+
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/fragment/OfflineFragment.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/fragment/OfflineFragment.kt
new file mode 100644
index 0000000000..9c1fc5dd83
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/fragment/OfflineFragment.kt
@@ -0,0 +1,100 @@
+package com.mogo.och.offline.ui.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.mogo.commons.mvp.MvpFragment
+import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchManager
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
+import com.mogo.och.bridge.ui.drawline.LineView
+import com.mogo.och.offline.R
+import kotlinx.android.synthetic.main.offline_base_fragment.mapContainerLayout
+
+/**
+ * 网约车基础Fragment,主要负责布局通用界面,处理站点面板和通话面板互斥情况
+ *
+ *
+ * 部分业务放在了此处处理
+ *
+ * @author tongchenfei
+ */
+class OfflineFragment : MvpFragment() {
+
+
+ private val runningTaskGateWay = "RUNNINGTASKGATEWAY"
+ private val lineView = "LINEVIEW"
+
+
+ override fun getLayoutId(): Int {
+ return R.layout.offline_base_fragment
+ }
+
+ override fun getTagName(): String {
+ return "ShuttleFragment"
+ }
+
+ override fun initViews() {
+
+ context?.let {
+ CallerEagleBaseFunctionCall4OchManager.addSingleToolKitCustomItem(lineView, LineView(it),10)
+ }
+
+ }
+
+ override fun initViews(savedInstanceState: Bundle?) {
+ super.initViews(savedInstanceState)
+ mapContainerLayout?.onCreate(savedInstanceState)
+ }
+
+ override fun createPresenter(): OfflinePresenter {
+ return OfflinePresenter(this)
+ }
+
+ override fun onResume() {
+ super.onResume()
+ mapContainerLayout?.onResume()
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ return super.onCreateView(inflater, container, savedInstanceState)
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapContainerLayout?.onSaveInstanceState(outState)
+ }
+
+ override fun onLowMemory() {
+ super.onLowMemory()
+ mapContainerLayout?.onLowMemory()
+ }
+
+ override fun onPause() {
+ super.onPause()
+ mapContainerLayout?.onPause()
+ }
+
+ override fun onDestroyView() {
+ mapContainerLayout?.onDestroy()
+ if (mPresenter != null) {
+ mPresenter!!.onDestroy(this)
+ }
+ CallerEagleBaseFunctionCall4OchManager.removeToolKitDefaultItemClickListener(lineView)
+ super.onDestroyView()
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ }
+
+ /**
+ * END
+ */
+ companion object {
+ private const val TAG = "${M_BUS}BaseBusTabFragment"
+ }
+}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/fragment/OfflinePresenter.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/fragment/OfflinePresenter.kt
new file mode 100644
index 0000000000..d92f5fea09
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/fragment/OfflinePresenter.kt
@@ -0,0 +1,57 @@
+package com.mogo.och.offline.ui.fragment
+
+import androidx.lifecycle.LifecycleOwner
+import com.mogo.commons.AbsMogoApplication
+import com.mogo.commons.mvp.Presenter
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
+import com.mogo.och.common.module.biz.login.ILoginCallback
+import com.mogo.och.common.module.biz.login.LoginStatusEnum
+import com.mogo.och.common.module.biz.login.LoginStatusManager
+import com.mogo.och.common.module.biz.login.LoginStatusManager.isLogin
+import com.mogo.och.bridge.autopilot.OCHAdasAbilityManager
+import com.mogo.och.offline.model.OrderModel
+import com.mogo.och.offline.util.OffLineTrajectoryManager
+
+/**
+ * 网约车小巴
+ *
+ * @author tongchenfei
+ */
+class OfflinePresenter(view: OfflineFragment?) : Presenter(view), ILoginCallback {
+
+ override fun onCreate(owner: LifecycleOwner) {
+ super.onCreate(owner)
+ initModelListener()
+ }
+
+ override fun onDestroy(owner: LifecycleOwner) {
+ super.onDestroy(owner)
+
+ releaseListener()
+ }
+
+ private fun initModelListener() {
+ OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp())
+ LoginStatusManager.addListener(TAG, this)
+ OrderModel.init()
+ }
+
+ private fun releaseListener() {
+ OCHAdasAbilityManager.getInstance().release()
+ LoginStatusManager.removeListener(TAG)
+ OrderModel.release()
+ }
+
+ override fun onStatusChange(currentStatus: LoginStatusEnum) {
+ d(TAG, " loginStatus =" + isLogin())
+ if (!isLogin()) {
+ OffLineTrajectoryManager.stopTrajReqLoop()
+ OrderModel.closeBeautificationMode()
+ }
+ }
+
+ companion object {
+ private const val TAG = M_BUS+"BusPresenter"
+ }
+}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/switchline/SwitchLineAdapter.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/switchline/SwitchLineAdapter.kt
new file mode 100644
index 0000000000..4db1eebff4
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/switchline/SwitchLineAdapter.kt
@@ -0,0 +1,104 @@
+package com.mogo.och.offline.ui.switchline
+
+import android.content.Context
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.appcompat.widget.AppCompatTextView
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.DiffUtil.Callback
+import androidx.recyclerview.widget.RecyclerView
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
+import com.mogo.och.offline.ui.switchline.SwitchLineAdapter.SwitchLineViewHolder
+import com.mogo.och.data.db.bean.LineDataBean
+import com.mogo.och.offline.R
+import me.jessyan.autosize.AutoSizeCompat
+
+/**
+ * 路线列表adapter
+ */
+class SwitchLineAdapter(
+ private val mContext: Context,
+ val mData: MutableList
+) : RecyclerView.Adapter() {
+ companion object{
+ const val TAG = M_BUS+"SwitchLineAdapter"
+ }
+ // RecyclerView设置点击事件
+ private var mItemClickListener: LineItemClickListener? = null
+
+ fun setDataList(dataList: List) {
+
+ val diffResult = DiffUtil.calculateDiff(MyDiffCallback(this.mData, dataList))
+ this.mData.clear()
+ this.mData.addAll(dataList)
+ diffResult.dispatchUpdatesTo(this)
+ }
+
+ override fun onCreateViewHolder(
+ parent: ViewGroup,
+ viewType: Int
+ ): SwitchLineViewHolder {
+ val view = LayoutInflater.from(mContext).inflate(
+ R.layout.offline_switch_line_list_item, parent, false
+ )
+ return SwitchLineViewHolder(view)
+ }
+
+ override fun onBindViewHolder(holder: SwitchLineViewHolder, position: Int) {
+ val currentPosition = holder.bindingAdapterPosition
+ AutoSizeCompat.autoConvertDensityOfGlobal(holder.itemView.resources)
+ val line = mData[currentPosition]
+
+ holder.lineName.text = line.lineName
+ val string = mContext.getString(R.string.offline_switch_line_endstationname, line.endStationName)
+ holder.lineEndName.text = string
+
+
+ //设置item点击事件
+ holder.itemView.setOnClickListener {
+ mItemClickListener?.onItemClick(line)
+ }
+ }
+
+ override fun getItemCount(): Int {
+ return mData.size
+ }
+
+ fun setOnLineItemClickListener(itemClickListener: LineItemClickListener?) {
+ mItemClickListener = itemClickListener
+ }
+
+ class SwitchLineViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+ val lineName: AppCompatTextView = itemView.findViewById(R.id.switch_line_name)//线路名称
+ val lineEndName: AppCompatTextView = itemView.findViewById(R.id.switch_line_end_station) //终点
+ }
+
+ interface LineItemClickListener {
+ fun onItemClick(data: LineDataBean)
+ }
+
+ inner class MyDiffCallback(private val oldData:List, private val newData:List):
+ Callback(){
+ override fun getOldListSize(): Int {
+ return oldData.size
+ }
+
+ override fun getNewListSize(): Int {
+ return newData.size
+ }
+
+ override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
+ val oldItem = oldData[oldItemPosition]
+ val newItem = newData[newItemPosition]
+ return oldItem == newItem && oldItem.endStationName == newItem.endStationName
+ }
+
+ override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
+ val oldItem = oldData[oldItemPosition]
+ val newItem = newData[newItemPosition]
+ return oldItem == newItem && oldItem.endStationName == newItem.endStationName
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/switchline/SwitchLineView.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/switchline/SwitchLineView.kt
new file mode 100644
index 0000000000..771d37d22d
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/switchline/SwitchLineView.kt
@@ -0,0 +1,182 @@
+package com.mogo.och.offline.ui.switchline
+
+import android.animation.ObjectAnimator
+import android.animation.ValueAnimator
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.findViewTreeViewModelStoreOwner
+import com.mogo.eagle.core.utilcode.kotlin.onClick
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
+import com.mogo.eagle.core.utilcode.mogo.view.SpacesItemDecoration
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler
+import com.mogo.och.common.module.manager.loop.BizLoopManager
+import com.mogo.och.common.module.utils.ResourcesUtils
+import com.mogo.och.common.module.wigets.WindowRelativeLayout
+import com.mogo.och.common.module.wigets.WrapContentLinearLayoutManager
+import com.mogo.och.common.module.wigets.commonview.ErrorView
+import com.mogo.och.data.db.bean.LineDataBean
+import com.mogo.och.offline.R
+import com.mogo.och.offline.ui.bizswitch.SwtichBizModel
+import kotlinx.android.synthetic.main.offline_switch_line.view.aciv_refresh_task
+import kotlinx.android.synthetic.main.offline_switch_line.view.actv_last_refresh_date
+import kotlinx.android.synthetic.main.offline_switch_line.view.include_empty
+import kotlinx.android.synthetic.main.offline_switch_line.view.include_errorview
+import kotlinx.android.synthetic.main.offline_switch_line.view.switch_line_rv
+import me.jessyan.autosize.utils.AutoSizeUtils
+
+
+class SwitchLineView: WindowRelativeLayout, SwtichLineModel.SwtichLineViewCallback {
+
+
+ constructor(context: Context?) : super(context)
+
+ constructor(context: Context?, attributeSet: AttributeSet) : super(context, attributeSet)
+
+ constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr)
+
+ constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes)
+
+
+ companion object {
+ const val TAG = "${M_BUS}SwitchLineView"
+ }
+
+ private var viewModel: SwtichLineModel?=null
+ private var viewbizModel: SwtichBizModel?=null
+
+ private lateinit var mAdapter: SwitchLineAdapter
+
+ private var animator:ObjectAnimator?=null
+
+
+ private lateinit var linearLayoutManager: WrapContentLinearLayoutManager
+
+ private var animatorStart = System.currentTimeMillis()
+
+ init {
+ LayoutInflater.from(context).inflate(R.layout.offline_switch_line, this, true)
+ initView()
+ }
+
+ private fun initView(){
+ linearLayoutManager = WrapContentLinearLayoutManager(context)
+ switch_line_rv.setLayoutManager(linearLayoutManager)
+ mAdapter = SwitchLineAdapter(context, mutableListOf())
+ switch_line_rv.addItemDecoration(
+ SpacesItemDecoration(
+ AutoSizeUtils.dp2px(context,20f)
+ )
+ )
+ switch_line_rv.setAdapter(mAdapter)
+ //设置item 点击事件
+ mAdapter.setOnLineItemClickListener(object : SwitchLineAdapter.LineItemClickListener{
+ override fun onItemClick(data: LineDataBean) {
+ CallerLogger.d(TAG,"选择线路 线路信息:${data}")
+
+ }
+ })
+
+ aciv_refresh_task.onClick(5_000) {
+ viewModel?.refreshTask()
+ animatorStart = System.currentTimeMillis()
+ if(animator==null) {
+ animator = ObjectAnimator.ofFloat(aciv_refresh_task, "rotation", 0f, 360f)
+ animator?.setDuration(1000) // 设置动画持续时间
+ animator?.repeatCount = ValueAnimator.INFINITE // 设置动画无限重复
+ animator?.repeatMode = ValueAnimator.RESTART // 设置重复模式
+ }
+ animator?.start()
+ }
+ include_errorview.reloadLIstener = object :ErrorView.ReloadLIstener{
+ override fun reload() {
+ viewbizModel?.showSwitchLineInfo()
+ }
+
+ }
+ }
+
+ /**
+ * 初始化数据
+ */
+ fun loadingDatas() {
+ CallerLogger.d(TAG,"加载线路去")
+ viewModel?.queryBusLines(true)
+ }
+
+ override fun onAttachedToWindow() {
+ super.onAttachedToWindow()
+ viewModel = findViewTreeViewModelStoreOwner()?.let {
+ ViewModelProvider(it).get(SwtichLineModel::class.java)
+ }
+ viewbizModel = findViewTreeViewModelStoreOwner()?.let {
+ ViewModelProvider(it).get(SwtichBizModel::class.java)
+ }
+
+ viewModel?.setDistanceCallback(this)
+ CallerLogger.d(TAG,"onAttachedToWindow")
+ }
+
+ override fun onDetachedFromWindow() {
+ super.onDetachedFromWindow()
+ CallerLogger.d(TAG,"onDetachedFromWindow")
+ }
+
+ override fun startTaskState(success: Boolean) {
+
+ }
+
+ override fun onBusLinesChange(data: MutableList?, show:Boolean) {
+ if (data.isNullOrEmpty()) {
+ showNoData(true)
+ }else{
+ showNoData(false)
+ mAdapter.setDataList(data)
+ }
+ CallerLogger.d(TAG,"加载线路成功")
+ if(show) {
+ viewbizModel?.showSwitchLineInfoResult()
+ }
+ }
+
+ /**
+ * 有无数据UI显示
+ * @param b
+ */
+ private fun showNoData(b: Boolean) {
+ BizLoopManager.runInMainThread{
+ include_errorview.visibility = View.GONE
+ if (b) {
+ switch_line_rv.visibility = View.GONE
+ include_empty.visibility = View.VISIBLE
+ } else {
+ switch_line_rv.visibility = View.VISIBLE
+ include_empty.visibility = View.GONE
+ }
+ }
+ }
+
+ override fun refreshDate(formatLongToString: String?) {
+ val endTime = System.currentTimeMillis()
+ val dex = (1000-(endTime - animatorStart)).takeIf { it>=0 }?:0
+ UiThreadHandler.postDelayed({
+ formatLongToString?.let {
+ actv_last_refresh_date.text = ResourcesUtils.getString(R.string.offline_switch_line_refresh_time,it)
+ animator?.cancel()
+ }
+ },dex,UiThreadHandler.MODE.QUEUE,)
+
+ }
+
+ override fun onBusLinesChangeFaile() {
+ include_errorview.visibility = View.VISIBLE
+ switch_line_rv.visibility = View.GONE
+ include_empty.visibility = View.GONE
+ viewbizModel?.showSwitchLineInfoResult()
+ }
+
+
+}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/switchline/SwtichLineModel.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/switchline/SwtichLineModel.kt
new file mode 100644
index 0000000000..6b99e9c8ce
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/switchline/SwtichLineModel.kt
@@ -0,0 +1,97 @@
+package com.mogo.och.offline.ui.switchline
+
+import androidx.lifecycle.ViewModel
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
+import com.mogo.och.common.module.utils.DateTimeUtil
+import com.mogo.och.common.module.utils.RxUtils
+import com.mogo.och.data.db.bean.LineDataBean
+import com.mogo.och.offline.callback.IBusLinesCallback
+import com.mogo.och.offline.model.LineModel
+import com.mogo.och.offline.repository.RepositoryManager
+import io.reactivex.Observer
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.disposables.Disposable
+import io.reactivex.schedulers.Schedulers
+
+/**
+ * @author XuXinChao
+ * @description BadCase录包管理页面
+ * @since: 2022/12/15
+ */
+class SwtichLineModel : ViewModel(), IBusLinesCallback {
+
+ private val TAG = M_BUS+ SwtichLineModel::class.java.simpleName
+
+ private var viewCallback: SwtichLineViewCallback?=null
+
+ private var endTaskDisposable:Disposable?=null
+
+
+ override fun onCleared() {
+ d(TAG,"onCleared")
+ LineModel.setBusLinesCallback(TAG,null)
+ }
+
+ fun setDistanceCallback(viewCallback: SwtichLineViewCallback){
+ this.viewCallback = viewCallback
+ LineModel.setBusLinesCallback(TAG,this)
+ }
+
+ fun queryBusLines(loading:Boolean) {
+ RxUtils.disposeSubscribe(endTaskDisposable)
+ RepositoryManager.queryCanUseLine()
+ ?.subscribeOn(Schedulers.io())
+ ?.observeOn(AndroidSchedulers.mainThread())
+ ?.subscribe(object : Observer?> {
+ override fun onSubscribe(d: Disposable) {
+ endTaskDisposable = d
+ d(TAG, "queryBusLines onSubscribe")
+ }
+
+ override fun onError(e: Throwable) {
+ d(TAG, "queryBusLines onError${e.printStackTrace()}")
+ viewCallback?.onBusLinesChangeFaile()
+ }
+
+ override fun onComplete() {
+ d(TAG, "queryBusLines onComplete")
+ }
+
+ override fun onNext(data: List) {
+ d(TAG, "queryBusLines onNext ${data}")
+ val tempData = data.distinctBy { it.lineId }
+ viewCallback?.onBusLinesChange(tempData.toMutableList(),loading)
+ RxUtils.disposeSubscribe(endTaskDisposable)
+ }
+
+ })
+ }
+
+ fun refreshTask() {
+ LineModel.refreshTask()
+ }
+
+ interface SwtichLineViewCallback{
+ fun startTaskState(success: Boolean)
+ fun onBusLinesChange(data: MutableList?, show:Boolean)
+ fun refreshDate(formatLongToString: String?)
+ fun onBusLinesChangeFaile()
+ }
+
+ override fun onRefreshSuccess(currentTimeStamp: Long) {
+ viewCallback?.refreshDate(
+ DateTimeUtil.formatLongToString(currentTimeStamp, DateTimeUtil.HH_mm_ss)
+ )
+ }
+
+ override fun onRefreshSuccessWIthData() {
+ super.onRefreshSuccessWIthData()
+ queryBusLines(false)
+ }
+
+ override fun onChangeLineIdFail() {
+ viewCallback?.startTaskState(false)
+ }
+}
+
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/taskrunning/TaskRunningAdapter.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/taskrunning/TaskRunningAdapter.kt
new file mode 100644
index 0000000000..928ca2e0bf
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/taskrunning/TaskRunningAdapter.kt
@@ -0,0 +1,258 @@
+package com.mogo.och.offline.ui.taskrunning
+
+import android.animation.ArgbEvaluator
+import android.content.Context
+import android.graphics.drawable.GradientDrawable
+import android.util.TypedValue
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.appcompat.widget.AppCompatImageView
+import androidx.appcompat.widget.AppCompatTextView
+import androidx.recyclerview.widget.RecyclerView
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
+import com.mogo.och.common.module.utils.ResourcesUtils
+import com.mogo.och.data.bean.BusStationBean
+import com.mogo.och.offline.R
+import com.mogo.och.offline.model.LineModel
+import me.jessyan.autosize.utils.AutoSizeUtils
+
+/**
+ * 路线列表adapter
+ */
+class TaskRunningAdapter(
+ private val mContext: Context,
+ val mData: MutableList
+) : RecyclerView.Adapter() {
+
+ companion object {
+ const val TAG = "${M_BUS}TaskRunningAdapter"
+ }
+
+ private val argbEvaluator: ArgbEvaluator = ArgbEvaluator()
+ private val startColor = ResourcesUtils.getColor(R.color.common_1970FF)
+ private val endColor = ResourcesUtils.getColor(R.color.common_19FF7F)
+ private val heightItem = 100f
+ private val halfHeight = 16.5f
+ private var totalHeight = 0f
+
+ fun setDataList(dataList: List) {
+ this.mData.clear()
+ this.mData.addAll(dataList)
+ if (LineModel.startStationIndex == 0) {
+ totalHeight = 33 + (dataList.size - 2) * heightItem
+ } else {
+ totalHeight =
+ (halfHeight + (dataList.size - 1 - LineModel.startStationIndex) * heightItem).toFloat()
+ }
+ notifyItemRangeChanged(0, dataList.size, true)
+ }
+
+ override fun onCreateViewHolder(
+ parent: ViewGroup,
+ viewType: Int
+ ): TaskRunningViewHolder {
+ val view = LayoutInflater.from(mContext).inflate(
+ R.layout.offline_task_running_item, parent, false
+ )
+ return TaskRunningViewHolder(view)
+ }
+
+ override fun onBindViewHolder(holder: TaskRunningViewHolder, position: Int) {
+ val currentPosition = holder.bindingAdapterPosition
+ val line = mData[currentPosition]
+ holder.actvStationName.text = line.name
+ val startStationIndex = LineModel.startStationIndex
+ if (startStationIndex > 0) {
+ CallerLogger.d(TAG, "位置:$currentPosition 当前站${mData[startStationIndex]} ")
+ }
+
+ if (currentPosition < startStationIndex) {
+ holder.actvStationName.setTextSize(
+ TypedValue.COMPLEX_UNIT_PX,
+ AutoSizeUtils.dp2px(mContext, 40f).toFloat()
+ )
+ holder.actvStationName.setTextColor(ResourcesUtils.getColor(R.color.common_4DFFFFFF))
+ holder.acivStationHead.setImageResource(R.drawable.offline_task_running_pass_station_head)
+ } else if (currentPosition == startStationIndex) {
+ holder.actvStationName.setTextSize(
+ TypedValue.COMPLEX_UNIT_PX,
+ AutoSizeUtils.dp2px(mContext, 45f).toFloat()
+ )
+ holder.actvStationName.setTextColor(ResourcesUtils.getColor(R.color.common_2EACFF))
+
+ holder.acivStationHead.setImageResource(R.drawable.offline_task_running_item_normal)
+ } else {
+ holder.actvStationName.setTextColor(ResourcesUtils.getColor(R.color.white))
+ holder.actvStationName.setTextSize(
+ TypedValue.COMPLEX_UNIT_PX,
+ AutoSizeUtils.dp2px(mContext, 40f).toFloat()
+ )
+ holder.itemView.background = null
+ holder.acivStationHead.setImageResource(R.drawable.offline_task_running_item_normal)
+ }
+
+ when (currentPosition) {
+ 0 -> {
+ holder.acivStationHeadBig.visibility = View.VISIBLE
+ holder.acivStationHead.visibility = View.INVISIBLE
+ holder.acivStationHeadBig.setImageResource(R.drawable.offline_task_running_item_start)
+ holder.middleStationBg.visibility = View.GONE
+ holder.startStationBg.visibility = View.VISIBLE
+ holder.endStationBg.visibility = View.GONE
+ if (startStationIndex == 0) {
+ if (line.isLeaving) {
+ // 下端 灰色
+ holder.startStationBg.setBackgroundResource(R.color.common_4DFFFFFF)
+ holder.itemView.background = null
+ } else {
+ // 下端 彩色
+ holder.itemView.setBackgroundResource(R.drawable.offline_task_running_current_station_bg)
+
+ val orientation = GradientDrawable.Orientation.TOP_BOTTOM
+ val temp01 = GradientDrawable(
+ orientation, intArrayOf(
+ startColor,
+ endColor
+ )
+ )
+ holder.startStationBg.background = temp01
+ }
+ } else {
+ // 下端 灰色
+ holder.startStationBg.setBackgroundResource(R.color.common_4DFFFFFF)
+ holder.itemView.background = null
+ }
+ }
+
+ mData.size - 1 -> {
+ holder.acivStationHeadBig.visibility = View.VISIBLE
+ holder.acivStationHead.visibility = View.INVISIBLE
+ holder.acivStationHeadBig.setImageResource(R.drawable.offline_task_running_item_end)
+ holder.middleStationBg.visibility = View.GONE
+ holder.startStationBg.visibility = View.GONE
+ holder.endStationBg.visibility = View.VISIBLE
+ if (startStationIndex == itemCount - 1) {
+ if (line.isLeaving) {
+ holder.endStationBg.setBackgroundResource(R.color.common_4DFFFFFF)
+ holder.itemView.setBackgroundResource(R.drawable.offline_task_running_current_station_bg)
+ } else {
+ holder.itemView.setBackgroundResource(R.drawable.offline_task_running_current_station_bg)
+ holder.endStationBg.setBackgroundResource(R.color.common_4DFFFFFF)
+ }
+ } else {
+ // 上端 彩色
+ holder.itemView.background = null
+ val startColorTemp = argbEvaluator.evaluate(
+ ((totalHeight - halfHeight) / totalHeight).toFloat(),
+ startColor,
+ endColor
+ ) as Int
+ val endColorTemp = argbEvaluator.evaluate(1f, startColor, endColor) as Int
+ val orientation = GradientDrawable.Orientation.TOP_BOTTOM
+ val temp01 = GradientDrawable(
+ orientation, intArrayOf(
+ startColorTemp,
+ endColorTemp
+ )
+ )
+ holder.endStationBg.background = temp01
+ }
+ }
+
+ else -> {
+ holder.acivStationHeadBig.visibility = View.GONE
+ holder.acivStationHead.visibility = View.VISIBLE
+ holder.middleStationBg.visibility = View.VISIBLE
+ holder.startStationBg.visibility = View.GONE
+ holder.endStationBg.visibility = View.GONE
+ if (currentPosition == startStationIndex) {
+ if (line.isLeaving) {
+ // 灰色
+ holder.middleStationBg.setBackgroundResource(R.color.common_4DFFFFFF)
+ holder.itemView.background = null
+ } else {
+ // 彩色
+ holder.itemView.setBackgroundResource(R.drawable.offline_task_running_current_station_bg)
+ val startColorTemp = argbEvaluator.evaluate(0f, startColor, endColor) as Int
+ val endColorTemp =
+ argbEvaluator.evaluate(100f / totalHeight, startColor, endColor) as Int
+ val orientation = GradientDrawable.Orientation.TOP_BOTTOM
+ val temp01 = GradientDrawable(
+ orientation, intArrayOf(
+ startColorTemp,
+ endColorTemp
+ )
+ )
+ holder.middleStationBg.background = temp01
+ }
+ } else if (currentPosition < startStationIndex) {
+ // 灰色
+ holder.middleStationBg.setBackgroundResource(R.color.common_4DFFFFFF)
+ holder.itemView.background = null
+ } else {
+ var dex = 0f
+ if (startStationIndex == 0) {
+ val firstItemData = mData[0]
+ if (!firstItemData.isLeaving) {
+ dex = halfHeight
+ }
+ } else {
+ val checkIndex = mData.get(startStationIndex)
+ if (!checkIndex.isLeaving) {
+ dex = heightItem
+ }
+ }
+ // 彩色
+ holder.itemView.background = null
+ val index = (currentPosition - startStationIndex - 1) * 100
+ val startFraction = (dex + index) / totalHeight
+ val endFraction = (dex + index + 100) / totalHeight
+ CallerLogger.d(
+ TAG,
+ "位置:$currentPosition 当前站${startStationIndex} 开始百分比:${startFraction} 结束百分比:${endFraction}"
+ )
+ val startColorTemp =
+ argbEvaluator.evaluate(startFraction, startColor, endColor) as Int
+ val endColorTemp =
+ argbEvaluator.evaluate(endFraction, startColor, endColor) as Int
+ val orientation = GradientDrawable.Orientation.TOP_BOTTOM
+ val temp01 = GradientDrawable(
+ orientation, intArrayOf(
+ startColorTemp,
+ endColorTemp
+ )
+ )
+ holder.middleStationBg.background = temp01
+ }
+ }
+ }
+ if (currentPosition == startStationIndex + 1) {
+ val preLine = mData[currentPosition - 1]
+ if (preLine.isLeaving) {
+ holder.itemView.setBackgroundResource(R.drawable.offline_task_running_current_station_bg)
+ } else {
+ holder.itemView.background = null
+ }
+ }
+
+ }
+
+ override fun getItemCount(): Int {
+ return mData.size
+ }
+
+ class TaskRunningViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+ val actvStationName: AppCompatTextView = itemView.findViewById(R.id.actv_station_name)//站点名称
+ val acivStationHead: AppCompatImageView =
+ itemView.findViewById(R.id.aciv_station_head)//普通站点标识 不是起始和终点坐标
+ val acivStationHeadBig: AppCompatImageView =
+ itemView.findViewById(R.id.aciv_station_head_big)//起始和终点坐标标识
+ val middleStationBg: View = itemView.findViewById(R.id.bg_pass_bg) //贯通背景调
+ val endStationBg: View = itemView.findViewById(R.id.bg_pass_head_bg) //终点的背景
+ val startStationBg: View = itemView.findViewById(R.id.bg_pass_bottom_bg) //起点坐标的背景
+
+ }
+
+}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/taskrunning/TaskRunningModel.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/taskrunning/TaskRunningModel.kt
new file mode 100644
index 0000000000..7632f0a22a
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/taskrunning/TaskRunningModel.kt
@@ -0,0 +1,84 @@
+package com.mogo.och.offline.ui.taskrunning
+
+import androidx.lifecycle.ViewModel
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
+import com.mogo.och.common.module.manager.loop.BizLoopManager
+import com.mogo.och.offline.callback.IBusLinesCallback
+import com.mogo.och.offline.model.LineModel
+import com.mogo.och.offline.model.OrderModel
+
+/**
+ * @author XuXinChao
+ * @description BadCase录包管理页面
+ * @since: 2022/12/15
+ */
+class TaskRunningModel : ViewModel(), IBusLinesCallback {
+
+ private val TAG = M_BUS + TaskRunningModel::class.java.simpleName
+
+ private var viewCallback: SwtichLineViewCallback? = null
+
+
+ override fun onCleared() {
+ }
+
+ fun setDistanceCallback(viewCallback: SwtichLineViewCallback) {
+ this.viewCallback = viewCallback
+ LineModel.setBusLinesCallback(TAG, this)
+ }
+
+ fun leaveStation() {
+ OrderModel.driveToNextStation()
+ }
+
+ interface SwtichLineViewCallback {
+ fun showRunningTaskInfo()
+ fun hideLoadingAndshowRunningTaskInfo()
+ fun smoothScrollToPosition(position: Int)
+ fun completeTaskFail()
+ }
+
+ override fun onLeaveStaionSuccess() {
+ BizLoopManager.runInMainThread {
+ viewCallback?.hideLoadingAndshowRunningTaskInfo()
+ smoothScrollToPosition()
+ }
+
+ }
+
+ fun smoothScrollToPosition() {
+ BizLoopManager.runInMainThread(object : Runnable {
+ override fun run() {
+ viewCallback?.smoothScrollToPosition(LineModel.startStationIndex)
+ }
+ })
+ }
+
+ fun arriveStation() {
+ OrderModel.onArriveAt(null, "页面触发到站")
+ }
+
+ override fun onArriveStationSuccess() {
+ BizLoopManager.runInMainThread {
+ smoothScrollToPosition()
+ viewCallback?.showRunningTaskInfo()
+ }
+ }
+
+ override fun onCompleteTask() {
+
+ }
+
+ override fun onCompleteTaskFail() {
+ super.onCompleteTaskFail()
+ BizLoopManager.runInMainThread {
+ viewCallback?.completeTaskFail()
+ }
+ }
+
+ fun completeTask() {
+ OrderModel.completeTask()
+ }
+
+}
+
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/taskrunning/TaskRunningView.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/taskrunning/TaskRunningView.kt
new file mode 100644
index 0000000000..ad9602a4de
--- /dev/null
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/taskrunning/TaskRunningView.kt
@@ -0,0 +1,168 @@
+package com.mogo.och.offline.ui.taskrunning
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.findViewTreeViewModelStoreOwner
+import com.mogo.eagle.core.utilcode.kotlin.onClick
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
+import com.mogo.och.bridge.autopilot.line.LineManager
+import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
+import com.mogo.och.common.module.utils.ResourcesUtils
+import com.mogo.och.common.module.wigets.dialog.CommonDialogStatus
+import com.mogo.och.common.module.wigets.CommonSlideView
+import com.mogo.och.common.module.wigets.WrapContentLinearLayoutManager
+import com.mogo.och.offline.R
+import com.mogo.och.offline.model.LineModel
+import com.mogo.och.offline.ui.bizswitch.SwtichBizModel
+import kotlinx.android.synthetic.main.offline_task_running.view.aciv_task_leave_station_slide_bg
+import kotlinx.android.synthetic.main.offline_task_running.view.actv_arriver_station
+import kotlinx.android.synthetic.main.offline_task_running.view.actv_complete_task
+import kotlinx.android.synthetic.main.offline_task_running.view.actv_running_task_last_station
+import kotlinx.android.synthetic.main.offline_task_running.view.actv_running_task_time
+import kotlinx.android.synthetic.main.offline_task_running.view.bus_task_running_line_name
+import kotlinx.android.synthetic.main.offline_task_running.view.loading_arrive_station
+import kotlinx.android.synthetic.main.offline_task_running.view.rl_running_task_station_list
+
+
+class TaskRunningView : ConstraintLayout, TaskRunningModel.SwtichLineViewCallback {
+
+
+ constructor(context: Context) : super(context)
+
+ constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
+
+ constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(
+ context,
+ attributeSet,
+ defStyleAttr
+ )
+
+ constructor(
+ context: Context,
+ attributeSet: AttributeSet,
+ defStyleAttr: Int,
+ defStyleRes: Int
+ ) : super(context, attributeSet, defStyleAttr, defStyleRes)
+
+
+ companion object {
+ const val TAG = M_BUS + "TaskRunningView"
+ }
+
+ private var viewModel: TaskRunningModel? = null
+ private var viewbizModel: SwtichBizModel? = null
+
+ private lateinit var mAdapter: TaskRunningAdapter
+
+ private lateinit var linearLayoutManager: WrapContentLinearLayoutManager
+
+ init {
+ LayoutInflater.from(context).inflate(R.layout.offline_task_running, this, true)
+ initView()
+ }
+
+ private fun initView() {
+ linearLayoutManager = WrapContentLinearLayoutManager(context)
+ rl_running_task_station_list.setLayoutManager(linearLayoutManager)
+ mAdapter = TaskRunningAdapter(context, mutableListOf())
+ rl_running_task_station_list.setAdapter(mAdapter)
+ aciv_task_leave_station_slide_bg.setSlideListener(object : CommonSlideView.SlideListener {
+ override fun slideEnd() {
+ viewModel?.leaveStation()
+ }
+ })
+ actv_arriver_station.onClick {
+ loading_arrive_station.visibility = VISIBLE
+ viewModel?.arriveStation()
+ }
+ actv_complete_task.onClick {
+ val builder = CommonDialogStatus.Builder()
+ val closeLineConfirmDialog = builder
+ .tips(ResourcesUtils.getString(R.string.offline_dialog_tips))
+ .status(CommonDialogStatus.Status.ask)
+ .build(context)
+ closeLineConfirmDialog.setClickListener(object : CommonDialogStatus.ClickListener {
+ override fun confirm() {
+ viewModel?.completeTask()
+ }
+
+ override fun cancel() {
+ closeLineConfirmDialog.dismiss()
+ }
+ })
+ closeLineConfirmDialog.show()
+ }
+ }
+
+ override fun onAttachedToWindow() {
+ super.onAttachedToWindow()
+ viewModel = findViewTreeViewModelStoreOwner()?.let {
+ ViewModelProvider(it).get(TaskRunningModel::class.java)
+ }
+ viewbizModel = findViewTreeViewModelStoreOwner()?.let {
+ ViewModelProvider(it).get(SwtichBizModel::class.java)
+ }
+
+ viewModel?.setDistanceCallback(this)
+ }
+
+ override fun showRunningTaskInfo() {
+ LineManager.getLineInfo { lineInfo ->
+ bus_task_running_line_name.text = lineInfo.lineName
+ }
+ actv_running_task_time.text = "班次:${LineModel.getTaskTime()}"
+ LineModel.stationList?.takeIf { it.size >= 2 }?.let {
+ actv_running_task_last_station.text = "往${it.last().name ?: ""}"
+ mAdapter.setDataList(it)
+ CallerLogger.d(
+ TAG,
+ "BusLineModel.startStationIndex:${LineModel.startStationIndex}___$it"
+ )
+ val currentStation = it.get(LineModel.startStationIndex)
+ if (currentStation.isLeaving) {
+ showArriverStationAndCompleteTask()
+ } else {
+ showLeaveStationView()
+ }
+ if (LineModel.startStationIndex == it.size - 1) {
+ aciv_task_leave_station_slide_bg.setTextValue("单程结束")
+ } else {
+ aciv_task_leave_station_slide_bg.setTextValue("滑动出发")
+ }
+ }
+ }
+
+ override fun hideLoadingAndshowRunningTaskInfo() {
+ loading_arrive_station.visibility = GONE
+ showRunningTaskInfo()
+ }
+
+ override fun completeTaskFail() {
+ aciv_task_leave_station_slide_bg.reset()
+ }
+
+ override fun smoothScrollToPosition(position: Int) {
+ try {
+ rl_running_task_station_list.smoothScrollToPosition(position)
+ } catch (e: Exception) {
+ OchChainLogManager.writeChainLog("错误", "e:${e.message}")
+ }
+
+ }
+
+ fun showLeaveStationView() {
+ aciv_task_leave_station_slide_bg.visibility = VISIBLE
+ actv_arriver_station.visibility = GONE
+ actv_complete_task.visibility = GONE
+ }
+
+ fun showArriverStationAndCompleteTask() {
+ aciv_task_leave_station_slide_bg.visibility = INVISIBLE
+ actv_arriver_station.visibility = VISIBLE
+ actv_complete_task.visibility = VISIBLE
+ }
+}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/util/ShuttleVoiceManager.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/util/ShuttleVoiceManager.kt
index 45de516670..4541b85435 100644
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/util/ShuttleVoiceManager.kt
+++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/util/ShuttleVoiceManager.kt
@@ -4,15 +4,23 @@ import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.voice.AIAssist
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
+import com.mogo.och.common.module.manager.socket.lan.LanSocketManager
+import com.mogo.och.common.module.manager.socket.lan.bean.AppConnectMsg
+import com.mogo.och.common.module.utils.ResourcesUtils
import com.mogo.och.common.module.voice.VoiceNotice
-import com.mogo.och.offline.R
+import com.mogo.och.shuttle.weaknet.R
import com.mogo.skin.utils.SkinResources
import com.mogo.tts.base.LangTtsEntity
import com.mogo.tts.base.LanguageType
-import java.util.ArrayList
object ShuttleVoiceManager {
+ fun arrivedStationOut(notice:String?){
+ if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) {
+ VoiceNotice.showNoticeOut(notice)
+ }
+ }
+
fun arrivedStationBus(siteNameCN: String?, siteNameKR: String?) {
val context = AbsMogoApplication.getApp()
val list: MutableList = ArrayList()
@@ -23,7 +31,7 @@ object ShuttleVoiceManager {
)
val engTTS = LangTtsEntity(
context.getString(R.string.bus_arrived_station_english_tip, it),
- LanguageType.CHINESE
+ LanguageType.ENGLISH
)
val koreanTTS = LangTtsEntity(
context.getString(R.string.bus_arrived_station_korean_tip, siteNameKR?:it),
@@ -32,9 +40,25 @@ object ShuttleVoiceManager {
list.add(chineseTTS)
list.add(engTTS)
list.add(koreanTTS)
+
}
- VoiceNotice.showNotice(list, AIAssist.LEVEL1,null)
+ if (AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode)) {
+ VoiceNotice.showNotice(list, AIAssist.LEVEL1,null)
+ } else if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) {
+ siteNameCN?.let {
+ sendArrivedStationToClient(it)
+ }
+ }
+ }
+
+ private fun sendArrivedStationToClient(arriveStation: String) {
+ val arrivedMsg = AppConnectMsg(
+ isViewShow = false,
+ isPlay = true,
+ msg = ResourcesUtils.getString(R.string.bus_arrived_station_tip,arriveStation),
+ )
+ LanSocketManager.sendMsgToClient(arrivedMsg)
}
fun leaveStationBus(siteNameCN: String?, siteNameKR: String?) {
@@ -47,7 +71,7 @@ object ShuttleVoiceManager {
)
val engTTS = LangTtsEntity(
context.getString(R.string.bus_leave_station_english_tip, it),
- LanguageType.CHINESE
+ LanguageType.ENGLISH
)
list.add(chineseTTS)
list.add(engTTS)
@@ -56,9 +80,26 @@ object ShuttleVoiceManager {
context.getString(R.string.bus_leave_station_korean_tip, siteNameKR ?: it),
LanguageType.KOREAN
)
+
list.add(koreanTTS)
}
- VoiceNotice.showNotice(list, AIAssist.LEVEL1,null)
+
+ if (AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode)) {
+ VoiceNotice.showNotice(list, AIAssist.LEVEL1,null)
+ } else if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) {
+ siteNameCN?.let {
+ sendStartStationToClient(it)
+ }
+ }
+ }
+
+ private fun sendStartStationToClient(nextStation: String) {
+ val startMsg = AppConnectMsg(
+ isViewShow = false,
+ isPlay = true,
+ msg = ResourcesUtils.getString(R.string.bus_leave_station_tip,nextStation),
+ )
+ LanSocketManager.sendMsgToClient(startMsg)
}
fun endOrderBus() {
@@ -70,17 +111,45 @@ object ShuttleVoiceManager {
list.add(chineseTTS)
list.add(engTTS)
list.add(koreanTTS)
- VoiceNotice.showNotice(list, AIAssist.LEVEL0,null)
+
+ if (AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode)) {
+ VoiceNotice.showNotice(list, AIAssist.LEVEL0,null)
+ } else if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) {
+ sendEndTaskToClient()
+ }
+
}
+ private fun sendEndTaskToClient() {
+ val endMsg = AppConnectMsg(
+ isViewShow = false,
+ isPlay = true,
+ msg = SkinResources.getInstance().getString(R.string.bus_end_task_tip),
+ )
+ LanSocketManager.sendMsgToClient(endMsg)
+ }
+
+
fun writeOffCount(successNum:Int){
if(successNum<=1){
- VoiceNotice.showNotice("核验通过", AIAssist.LEVEL3);
+ VoiceNotice.showNotice("核验通过", AIAssist.LEVEL3)
+ //sendWriteOffNumToClient("核验通过")
}else{
VoiceNotice.showNotice("$successNum 人核验通过", AIAssist.LEVEL3)
+ //sendWriteOffNumToClient("$successNum 人核验通过")
}
}
+ private fun sendWriteOffNumToClient(msg: String?) {
+ val passengerMsg = AppConnectMsg(
+ isViewShow = false,
+ isPlay = true,
+ msg = msg!!,
+ )
+ LanSocketManager.sendMsgToClient(passengerMsg)
+ }
+
+
// 距离发车还有1分钟
fun showLeafTime(tips: String) {
//语音提示
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/view/BizMapView.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/view/BizMapView.kt
deleted file mode 100644
index aaaa2035a2..0000000000
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/view/BizMapView.kt
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.mogo.och.offline.view
-
-import android.content.Context
-import android.os.Bundle
-import android.util.AttributeSet
-import android.view.LayoutInflater
-import android.widget.FrameLayout
-import com.mogo.eagle.core.data.config.FunctionBuildConfig
-import com.mogo.eagle.core.function.view.MapBizView
-import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
-import com.mogo.map.uicontroller.IMogoMapUIController
-import com.mogo.och.offline.R
-
-/**
- * 魔戒蓝牙控件
- * 放置于StatusBar右侧位置
- */
-class BizMapView @JvmOverloads constructor(
- context: Context,
- attrs: AttributeSet? = null,
- defStyleAttr: Int = 0
-) : FrameLayout(context, attrs, defStyleAttr) {
-
- private lateinit var mapBizView: MapBizView
-
- init {
- if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) {
- LayoutInflater.from(context).inflate(R.layout.offline_m2_bizmap_map, this, true)
- }else if(AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode)){
- LayoutInflater.from(context).inflate(R.layout.offline_jl_bizmap_map, this, true)
- }else{
- LayoutInflater.from(context).inflate(R.layout.offline_jl_bizmap_map, this, true)
- }
- mapBizView = findViewById(R.id.bizMapView)
- }
-
- fun getUI(): IMogoMapUIController? {
- return mapBizView.getUI()
- }
-
- fun onCreate(bundle: Bundle?) {
- mapBizView.onCreate(bundle)
- }
- fun onResume() {
- mapBizView.onResume()
- }
-
- fun onSaveInstanceState(outState: Bundle){
- mapBizView.onSaveInstanceState(outState)
- }
-
- fun onLowMemory() {
- mapBizView.onLowMemory()
- }
-
- fun onPause() {
- mapBizView.onPause()
- }
-
- fun onDestroy() {
- mapBizView.onDestroy()
- }
-}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/view/SlidePanelView.java b/OCH/offline/driver/src/main/java/com/mogo/och/offline/view/SlidePanelView.java
deleted file mode 100644
index d204fcd0ad..0000000000
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/view/SlidePanelView.java
+++ /dev/null
@@ -1,300 +0,0 @@
-package com.mogo.och.offline.view;
-
-import android.animation.ObjectAnimator;
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.LinearGradient;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.graphics.Shader;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.animation.DecelerateInterpolator;
-
-import androidx.annotation.Nullable;
-
-import com.mogo.commons.AbsMogoApplication;
-import com.mogo.eagle.core.utilcode.util.ConvertUtils;
-import com.mogo.eagle.core.utilcode.util.ThreadUtils;
-import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
-import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager;
-import com.mogo.och.offline.R;
-
-import me.jessyan.autosize.AutoSizeConfig;
-import me.jessyan.autosize.utils.AutoSizeUtils;
-
-/**
- * 滑块滑动面板
- *
- * @author tongchenfei
- */
-public class SlidePanelView extends View {
- private static final String TAG = "SlidePanelView";
-
- public SlidePanelView(Context context) {
- this(context, null);
- }
-
- public SlidePanelView(Context context, @Nullable AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public SlidePanelView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.SlidePanelView);
- textSize = (int) mTypedArray.getDimension(R.styleable.SlidePanelView_textSize, textSize);
- BLOCK_START_X = (int) mTypedArray.getDimension(R.styleable.SlidePanelView_BLOCK_START_X, BLOCK_START_X);
- BLOCK_START_Y = (int) mTypedArray.getDimension(R.styleable.SlidePanelView_BLOCK_START_Y, BLOCK_START_Y);
- NORMAL_TEXT_MARGIN_LEFT = (int) mTypedArray.getDimension(R.styleable.SlidePanelView_NORMAL_TEXT_MARGIN_LEFT, NORMAL_TEXT_MARGIN_LEFT);
- NORMAL_TEXT_MARGIN_RIGHT = (int) mTypedArray.getDimension(R.styleable.SlidePanelView_NORMAL_TEXT_MARGIN_RIGHT, NORMAL_TEXT_MARGIN_RIGHT);
- SHORT_TEXT_MARGIN_LEFT = (int) mTypedArray.getDimension(R.styleable.SlidePanelView_SHORT_TEXT_MARGIN_LEFT, SHORT_TEXT_MARGIN_LEFT);
- SHORT_TEXT_MARGIN_RIGHT = (int) mTypedArray.getDimension(R.styleable.SlidePanelView_SHORT_TEXT_MARGIN_RIGHT, SHORT_TEXT_MARGIN_RIGHT);
- init();
- }
-
- private final Paint bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- private final Paint blockPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- private final Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
-
- private static int textSize = 40;
- private static int BLOCK_START_X = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(),15);
- private static int BLOCK_START_Y = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(),15);
- private static int NORMAL_TEXT_MARGIN_LEFT = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(),40);
- private static int NORMAL_TEXT_MARGIN_RIGHT = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(),60);
- private static int SHORT_TEXT_MARGIN_LEFT = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(),60);;
- private static int SHORT_TEXT_MARGIN_RIGHT = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(),70);;
-
- private int textMarginLeft = NORMAL_TEXT_MARGIN_LEFT;
- private int textMarginRight = NORMAL_TEXT_MARGIN_RIGHT;
-
- private OnSlidePanelMoveToEndListener moveToEndListener;
-
- private int blockWidth = 0;
- private int blockOffset = 0;
-
- private float lastX;
- private boolean isToEnd = false;
-
- private static final String STRING_SLIDE_TO_RIGHT = "向右滑动";
- private RectF bgRectF;
- private Bitmap bmBlock;
-
- private final Matrix gradientMatrix = new Matrix();
- private float matrixTranslate;
- private final Rect textRect = new Rect();
- private LinearGradient textGradient;
-
- private ObjectAnimator matrixAnim;
-
- private String blockText = STRING_SLIDE_TO_RIGHT;
- private final Paint.FontMetrics blockTextMetrics = new Paint.FontMetrics();
-
- private static final int GRADIENT_OFFSET = 200;
-
- public void setOnSlidePanelMoveToEndListener(OnSlidePanelMoveToEndListener moveToEndListener) {
- this.moveToEndListener = moveToEndListener;
- }
-
- private void setBlockOffset(int blockOffset) {
- this.blockOffset = blockOffset;
- invalidate();
- }
-
- private void setMatrixTranslate(float matrixTranslate) {
- this.matrixTranslate = matrixTranslate;
- invalidate();
- }
-
- public void setText(String text) {
- this.blockText = text;
- requestLayout();
- invalidate();
- }
-
- private void init() {
- bgRectF = new RectF(0, 0, 0, 0);
- bgPaint.setColor(Color.parseColor("#CC0F1325"));
- bgPaint.setStyle(Paint.Style.FILL);
-
- textPaint.setStyle(Paint.Style.FILL);
- textPaint.setTextSize(textSize);
- textPaint.setTextAlign(Paint.Align.LEFT);
- textGradient = new LinearGradient(-GRADIENT_OFFSET, 0, 0, 0, new int[]{0x33ffffff, 0xffffffff, 0x33ffffff}, null, Shader.TileMode.CLAMP);
- textGradient.setLocalMatrix(gradientMatrix);
- textPaint.setShader(textGradient);
- textPaint.getFontMetrics(blockTextMetrics);
- decodeImage();
- }
-
- private void decodeImage(){
- ThreadUtils.getCpuPool().execute(() -> {
- int size = AutoSizeUtils.dp2px(getContext(), 120);
- BitmapFactory.Options opts = new BitmapFactory.Options();
- opts.inDensity = (int) AutoSizeConfig.getInstance().getInitDensity();
- bmBlock = BitmapFactory.decodeResource(getResources(), R.drawable.bus_base_slide_block,opts);
- bmBlock = Bitmap.createScaledBitmap(bmBlock, size, size, true);
- blockWidth = bmBlock.getWidth();
- UiThreadHandler.post(this::requestLayout,UiThreadHandler.MODE.QUEUE);
- });
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int widthMode = MeasureSpec.getMode(widthMeasureSpec);
- int heightMode = MeasureSpec.getMode(heightMeasureSpec);
- int widthSize;
- int heightSize;
-
- if (blockText.length() < 5) {
- textMarginLeft = SHORT_TEXT_MARGIN_LEFT;
- textMarginRight = SHORT_TEXT_MARGIN_RIGHT;
- } else {
- textMarginLeft = NORMAL_TEXT_MARGIN_LEFT;
- textMarginRight = NORMAL_TEXT_MARGIN_RIGHT;
- }
- if(bmBlock!=null) {
- if (widthMode == MeasureSpec.AT_MOST) {
- // 宽度根据图片大小,字符串长度,各种间隔确定
- // 高度根据图片大小和上下间隔确定
- textPaint.getTextBounds(blockText, 0, blockText.length(), textRect);
- widthSize = BLOCK_START_X * 2 + bmBlock.getWidth() + textMarginLeft + textMarginRight + textRect.width();
- heightSize = BLOCK_START_Y * 2 + bmBlock.getHeight();
- widthMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize, widthMode);
- heightMeasureSpec = MeasureSpec.makeMeasureSpec(heightSize, heightMode);
- }
- }
-
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- }
-
- private float textOffset = 0;
-
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- super.onSizeChanged(w, h, oldw, oldh);
- if (bgRectF != null){
- bgRectF.left = 0;
- bgRectF.top = 0;
- bgRectF.right = w;
- bgRectF.bottom = h;
- }
-
- if (matrixAnim != null) {
- matrixAnim.cancel();
- }
- textOffset = (getHeight() - blockTextMetrics.ascent - blockTextMetrics.descent) / 2;
- matrixAnim = ObjectAnimator.ofFloat(this, "matrixTranslate", 0, w + GRADIENT_OFFSET).setDuration(2000);
- matrixAnim.setRepeatCount(ValueAnimator.INFINITE);
- matrixAnim.start();
- }
-
- @Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
- if (matrixAnim != null) {
- matrixAnim.start();
- }
- }
-
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- if (matrixAnim != null) {
- matrixAnim.cancel();
- }
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- float x = event.getX();
- float y = event.getY();
-
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- if (x > BLOCK_START_X + blockOffset && x < blockWidth + BLOCK_START_X + blockOffset && y > BLOCK_START_Y && y < getHeight() - BLOCK_START_Y) {
- isToEnd = false;
- lastX = x;
- }
- break;
- case MotionEvent.ACTION_MOVE:
- if (lastX != 0) {
- blockOffset = (int) (x - lastX);
- if (blockOffset < 0) {
- blockOffset = 0;
- }
- if (blockOffset + BLOCK_START_X + blockWidth > getWidth()) {
- // 超出右边界
- blockOffset = getWidth() - BLOCK_START_X - blockWidth;
- if (!isToEnd) {
- isToEnd = true;
- if (moveToEndListener != null) {
- moveToEndListener.moveToEnd();
- }
- startBlockBackAnim();
- }
- }
- invalidate();
- }
- break;
- case MotionEvent.ACTION_UP:
- // 执行滑块回归动画
- if (!isToEnd) {
- startBlockBackAnim();
- }
- break;
- default:
- break;
- }
-
- return true;
- }
-
- private void startBlockBackAnim() {
- ObjectAnimator blockBackanimator = ObjectAnimator.ofInt(this, "blockOffset", blockOffset, 0);
- blockBackanimator.setInterpolator(new DecelerateInterpolator());
- blockBackanimator.setDuration(1000 * blockOffset / getWidth());
- blockBackanimator.start();
- lastX = 0;
- }
-
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- // 画背景
- canvas.drawRoundRect(bgRectF, (float) getHeight() / 2.0f, (float) getHeight() / 2.0f, bgPaint);
- // 画文字
- gradientMatrix.setTranslate(matrixTranslate, 0);
- textGradient.setLocalMatrix(gradientMatrix);
- canvas.save();
- canvas.drawText(blockText, (float) (blockWidth + BLOCK_START_X + textMarginLeft), (float) textOffset, textPaint);
- canvas.restore();
- if (bmBlock != null) {
- if(bmBlock.getByteCount()>=5*1024*1024){
- OchChainLogManager.writeChainLog("崩溃兜底策略",
- "图片大小监听"+ ConvertUtils.byte2FitMemorySize(bmBlock.getByteCount()),true,OchChainLogManager.EVENT_KEY_INFE_ERROR);
- bmBlock.recycle();
- bmBlock = null;
- blockWidth = 0;
- decodeImage();
- }else {
- // 画滑块
- canvas.drawBitmap(bmBlock, (float) (BLOCK_START_X + blockOffset), (float) BLOCK_START_Y, blockPaint);
- }
- }
-
- }
-
- public interface OnSlidePanelMoveToEndListener {
- /**
- * 滑块滑到了末尾
- */
- void moveToEnd();
- }
-}
diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/view/VerticalDashLineView.java b/OCH/offline/driver/src/main/java/com/mogo/och/offline/view/VerticalDashLineView.java
deleted file mode 100644
index 4ab48e3cda..0000000000
--- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/view/VerticalDashLineView.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.mogo.och.offline.view;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.DashPathEffect;
-import android.graphics.LinearGradient;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.Shader;
-import android.util.AttributeSet;
-import android.view.View;
-
-import androidx.annotation.Nullable;
-
-/**
- * 垂直虚线
- *
- * @author tongchenfei
- */
-public class VerticalDashLineView extends View {
- public VerticalDashLineView(Context context) {
- this(context,null);
- }
-
- public VerticalDashLineView(Context context, @Nullable AttributeSet attrs) {
- this(context, attrs,0);
- }
-
- public VerticalDashLineView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- init();
- }
-
- private final Paint linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- private final Path dashPath = new Path();
-
- private void init(){
- linePaint.setColor(Color.GREEN);
- linePaint.setStyle(Paint.Style.STROKE);
- linePaint.setStrokeWidth(2);
- linePaint.setPathEffect(new DashPathEffect(new float[]{5, 5}, 0));
- }
-
- public void setGradient(int startColor, int endColor) {
- LinearGradient linearGradient = new LinearGradient(0, 0, getWidth(), getHeight(), startColor, endColor, Shader.TileMode.CLAMP);
- linePaint.setShader(linearGradient);
- invalidate();
- }
-
- public void setColor(int color) {
- linePaint.setShader(null);
- linePaint.setColor(color);
- invalidate();
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- dashPath.reset();
- dashPath.moveTo((float) getWidth()/2, 0);
- dashPath.lineTo((float) getWidth()/2,getHeight());
- canvas.drawPath(dashPath,linePaint);
- }
-}
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_base_icon_in_autopilot.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_base_icon_in_autopilot.png
deleted file mode 100644
index 75c26c3d71..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_base_icon_in_autopilot.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_base_icon_not_in_autopilot.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_base_icon_not_in_autopilot.png
deleted file mode 100644
index 927296d690..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_base_icon_not_in_autopilot.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_base_slide_block.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_base_slide_block.png
deleted file mode 100644
index ed7b293b90..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_base_slide_block.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_disable_autopilot_icon.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_disable_autopilot_icon.png
deleted file mode 100644
index 170f254cd1..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_disable_autopilot_icon.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_dot_line.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_dot_line.png
deleted file mode 100644
index 186001352c..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_dot_line.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_ic_autopilot.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_ic_autopilot.png
deleted file mode 100644
index be978145dc..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_ic_autopilot.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_icon_arrived_station.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_icon_arrived_station.png
deleted file mode 100644
index 8a065b66dd..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_icon_arrived_station.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_icon_arriving_station.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_icon_arriving_station.png
deleted file mode 100644
index 4ed57a0e30..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_icon_arriving_station.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_icon_not_arrive_station.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_icon_not_arrive_station.png
deleted file mode 100644
index e0bb24c526..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_icon_not_arrive_station.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_light_green_nor.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_light_green_nor.png
deleted file mode 100644
index bc9fed952d..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_light_green_nor.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_light_red_nor.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_light_red_nor.png
deleted file mode 100644
index 8732508ded..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_light_red_nor.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_lightyellow_nor.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_lightyellow_nor.png
deleted file mode 100644
index bae01408fd..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_lightyellow_nor.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_line_panel_bg.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_line_panel_bg.png
deleted file mode 100755
index 3166d20e37..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_line_panel_bg.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_line_panel_bg_1.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_line_panel_bg_1.png
deleted file mode 100755
index 09a9c252da..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_line_panel_bg_1.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_line_task_arrow.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_line_task_arrow.png
deleted file mode 100644
index b32f0693a6..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_line_task_arrow.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_loading_autopilot_icon.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_loading_autopilot_icon.png
deleted file mode 100644
index f21a1081f1..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_loading_autopilot_icon.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_no_line_icon.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_no_line_icon.png
deleted file mode 100755
index fc20dca73c..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_no_line_icon.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_och_dot_line.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_och_dot_line.png
deleted file mode 100644
index a720a532ea..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_och_dot_line.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_operation_status_bg.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_operation_status_bg.png
deleted file mode 100644
index 3c339efde4..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_operation_status_bg.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_operation_status_select_bg.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_operation_status_select_bg.png
deleted file mode 100644
index c6717d2518..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_operation_status_select_bg.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_right_autopilot_icon.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_right_autopilot_icon.png
deleted file mode 100644
index cc2b18083d..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_right_autopilot_icon.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_selected_btn.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_selected_btn.png
deleted file mode 100644
index 3f05565483..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_selected_btn.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_setting_btn_bg.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_setting_btn_bg.png
deleted file mode 100644
index ba41bf3a53..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_setting_btn_bg.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_switch_line_close.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_switch_line_close.png
deleted file mode 100644
index 370b61de38..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_switch_line_close.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_switch_map_long.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_switch_map_long.png
deleted file mode 100755
index cf3e5a3778..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_switch_map_long.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_switch_map_medium.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_switch_map_medium.png
deleted file mode 100755
index bdc2725468..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_switch_map_medium.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_unselect_btn.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_unselect_btn.png
deleted file mode 100644
index 0114bb4f2b..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_unselect_btn.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_wrong_autopilot_icon.png b/OCH/offline/driver/src/main/res/drawable-nodpi/bus_wrong_autopilot_icon.png
deleted file mode 100644
index 0c8988acb3..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/bus_wrong_autopilot_icon.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/end_maker_icon.png b/OCH/offline/driver/src/main/res/drawable-nodpi/end_maker_icon.png
deleted file mode 100755
index 8acf113151..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/end_maker_icon.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_ai_collect.png b/OCH/offline/driver/src/main/res/drawable-nodpi/icon_ai_collect.png
deleted file mode 100755
index 6da7b81fe4..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_ai_collect.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_ai_normal.png b/OCH/offline/driver/src/main/res/drawable-nodpi/icon_ai_normal.png
deleted file mode 100755
index e98738b192..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_ai_normal.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_ai_select.png b/OCH/offline/driver/src/main/res/drawable-nodpi/icon_ai_select.png
deleted file mode 100755
index d3e0107c02..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_ai_select.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_arrow_blue_bus.png b/OCH/offline/driver/src/main/res/drawable-nodpi/icon_arrow_blue_bus.png
deleted file mode 100755
index 026c36086f..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_arrow_blue_bus.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_arrow_green_bus.png b/OCH/offline/driver/src/main/res/drawable-nodpi/icon_arrow_green_bus.png
deleted file mode 100755
index 06bebc7013..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_arrow_green_bus.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_arrow_grey_bus.png b/OCH/offline/driver/src/main/res/drawable-nodpi/icon_arrow_grey_bus.png
deleted file mode 100755
index f4f9b2bca2..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_arrow_grey_bus.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_bad_case.png b/OCH/offline/driver/src/main/res/drawable-nodpi/icon_bad_case.png
deleted file mode 100755
index 22f88301f9..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_bad_case.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_bad_case_normal.png b/OCH/offline/driver/src/main/res/drawable-nodpi/icon_bad_case_normal.png
deleted file mode 100755
index c0a978fc2b..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_bad_case_normal.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_bad_case_select.png b/OCH/offline/driver/src/main/res/drawable-nodpi/icon_bad_case_select.png
deleted file mode 100755
index ebacf3a11a..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_bad_case_select.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_no_bus_line.png b/OCH/offline/driver/src/main/res/drawable-nodpi/icon_no_bus_line.png
deleted file mode 100755
index fc20dca73c..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_no_bus_line.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_point_blue_bus.png b/OCH/offline/driver/src/main/res/drawable-nodpi/icon_point_blue_bus.png
deleted file mode 100755
index dc4c4f6f0d..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_point_blue_bus.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_point_green_bus.png b/OCH/offline/driver/src/main/res/drawable-nodpi/icon_point_green_bus.png
deleted file mode 100755
index ed3b871338..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_point_green_bus.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_point_grey_bus.png b/OCH/offline/driver/src/main/res/drawable-nodpi/icon_point_grey_bus.png
deleted file mode 100755
index d43e34bb26..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_point_grey_bus.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_station_start_end.png b/OCH/offline/driver/src/main/res/drawable-nodpi/icon_station_start_end.png
deleted file mode 100644
index 04580a8f0d..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/icon_station_start_end.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/no_order_data.png b/OCH/offline/driver/src/main/res/drawable-nodpi/no_order_data.png
deleted file mode 100644
index 0e61996d3f..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/no_order_data.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/offline_line_task_arrow.png b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_line_task_arrow.png
new file mode 100644
index 0000000000..47c387eb9f
Binary files /dev/null and b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_line_task_arrow.png differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/offline_map_end.png b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_map_end.png
new file mode 100644
index 0000000000..45071228a2
Binary files /dev/null and b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_map_end.png differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/offline_map_notarrive.png b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_map_notarrive.png
new file mode 100644
index 0000000000..cbb2dda8b9
Binary files /dev/null and b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_map_notarrive.png differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/offline_map_pass.png b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_map_pass.png
new file mode 100644
index 0000000000..a411050a6e
Binary files /dev/null and b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_map_pass.png differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/offline_map_start.png b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_map_start.png
new file mode 100644
index 0000000000..baca87f72f
Binary files /dev/null and b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_map_start.png differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/offline_refresh_task.png b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_refresh_task.png
new file mode 100644
index 0000000000..9928698738
Binary files /dev/null and b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_refresh_task.png differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/offline_switch_biz_bg.png b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_switch_biz_bg.png
new file mode 100644
index 0000000000..f92a934e07
Binary files /dev/null and b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_switch_biz_bg.png differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/offline_switch_biz_bg_header.png b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_switch_biz_bg_header.png
new file mode 100644
index 0000000000..8cc1c9e36e
Binary files /dev/null and b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_switch_biz_bg_header.png differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/offline_switch_line_adapter_point.png b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_switch_line_adapter_point.png
new file mode 100644
index 0000000000..b2c4edba60
Binary files /dev/null and b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_switch_line_adapter_point.png differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/offline_task_running_item_end.png b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_task_running_item_end.png
new file mode 100644
index 0000000000..e54309848c
Binary files /dev/null and b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_task_running_item_end.png differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/offline_task_running_item_normal.png b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_task_running_item_normal.png
new file mode 100644
index 0000000000..b2c4edba60
Binary files /dev/null and b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_task_running_item_normal.png differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/offline_task_running_item_start.png b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_task_running_item_start.png
new file mode 100644
index 0000000000..dac86db75d
Binary files /dev/null and b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_task_running_item_start.png differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/offline_task_running_pass_station_head.png b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_task_running_pass_station_head.png
new file mode 100644
index 0000000000..7e70dbce57
Binary files /dev/null and b/OCH/offline/driver/src/main/res/drawable-nodpi/offline_task_running_pass_station_head.png differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/pingxingjiashi.png b/OCH/offline/driver/src/main/res/drawable-nodpi/pingxingjiashi.png
deleted file mode 100644
index 78bfa2687f..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/pingxingjiashi.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/press_start_status.png b/OCH/offline/driver/src/main/res/drawable-nodpi/press_start_status.png
deleted file mode 100755
index af32c20cb5..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/press_start_status.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable-nodpi/shuttle_write_off_bg.png b/OCH/offline/driver/src/main/res/drawable-nodpi/shuttle_write_off_bg.png
deleted file mode 100755
index de9b6c49b7..0000000000
Binary files a/OCH/offline/driver/src/main/res/drawable-nodpi/shuttle_write_off_bg.png and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/drawable/ai_collect_selector.xml b/OCH/offline/driver/src/main/res/drawable/ai_collect_selector.xml
deleted file mode 100755
index a1211f3c47..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/ai_collect_selector.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bad_case_selector.xml b/OCH/offline/driver/src/main/res/drawable/bad_case_selector.xml
deleted file mode 100755
index bc47ce95d7..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bad_case_selector.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_autopilot_0_1_status_bg.xml b/OCH/offline/driver/src/main/res/drawable/bus_autopilot_0_1_status_bg.xml
deleted file mode 100644
index 47ca8c7d4b..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_autopilot_0_1_status_bg.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
- -
-
- -
-
-
-
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_base_autopilot_status_icon_selector.xml b/OCH/offline/driver/src/main/res/drawable/bus_base_autopilot_status_icon_selector.xml
deleted file mode 100644
index 94555d78cc..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_base_autopilot_status_icon_selector.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_checkbox_selector.xml b/OCH/offline/driver/src/main/res/drawable/bus_checkbox_selector.xml
deleted file mode 100644
index d95e931160..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_checkbox_selector.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_line_dividing_line1_selector.xml b/OCH/offline/driver/src/main/res/drawable/bus_line_dividing_line1_selector.xml
deleted file mode 100644
index b00fbd8bd6..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_line_dividing_line1_selector.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
- -
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_line_dividing_line2_selector.xml b/OCH/offline/driver/src/main/res/drawable/bus_line_dividing_line2_selector.xml
deleted file mode 100644
index ee555aae15..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_line_dividing_line2_selector.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
- -
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_operation_status_bg_selector.xml b/OCH/offline/driver/src/main/res/drawable/bus_operation_status_bg_selector.xml
deleted file mode 100755
index 3a3dc6a292..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_operation_status_bg_selector.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_panel_anchor_bkg.xml b/OCH/offline/driver/src/main/res/drawable/bus_panel_anchor_bkg.xml
deleted file mode 100644
index 21b39b7e37..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_panel_anchor_bkg.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_panel_bkg.xml b/OCH/offline/driver/src/main/res/drawable/bus_panel_bkg.xml
deleted file mode 100644
index 69539ed40f..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_panel_bkg.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_setting_tip_red_cir_bg.xml b/OCH/offline/driver/src/main/res/drawable/bus_setting_tip_red_cir_bg.xml
deleted file mode 100644
index 203971340e..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_setting_tip_red_cir_bg.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_shape_select_line_item_time_bg.xml b/OCH/offline/driver/src/main/res/drawable/bus_shape_select_line_item_time_bg.xml
deleted file mode 100644
index ee8088637c..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_shape_select_line_item_time_bg.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_station_green_dash_line.xml b/OCH/offline/driver/src/main/res/drawable/bus_station_green_dash_line.xml
deleted file mode 100644
index fe46ef2228..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_station_green_dash_line.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_station_v_green_dash.xml b/OCH/offline/driver/src/main/res/drawable/bus_station_v_green_dash.xml
deleted file mode 100644
index 376e0a472c..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_station_v_green_dash.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
- -
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_switch_line_btn.xml b/OCH/offline/driver/src/main/res/drawable/bus_switch_line_btn.xml
deleted file mode 100644
index 8b066b0ce8..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_switch_line_btn.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
- -
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_switch_line_btn_commit.xml b/OCH/offline/driver/src/main/res/drawable/bus_switch_line_btn_commit.xml
deleted file mode 100644
index e94992d507..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_switch_line_btn_commit.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_switch_map_bg.xml b/OCH/offline/driver/src/main/res/drawable/bus_switch_map_bg.xml
deleted file mode 100644
index b34021d977..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_switch_map_bg.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_task_time_bg.xml b/OCH/offline/driver/src/main/res/drawable/bus_task_time_bg.xml
deleted file mode 100644
index 917f3932fe..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_task_time_bg.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_yi_biao_pan_bg_nor.xml b/OCH/offline/driver/src/main/res/drawable/bus_yi_biao_pan_bg_nor.xml
deleted file mode 100644
index 2ef90e60f7..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_yi_biao_pan_bg_nor.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_yi_biao_pan_bg_speeding.xml b/OCH/offline/driver/src/main/res/drawable/bus_yi_biao_pan_bg_speeding.xml
deleted file mode 100644
index dea7a88bb6..0000000000
--- a/OCH/offline/driver/src/main/res/drawable/bus_yi_biao_pan_bg_speeding.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bg_bus_traffic_light_background.xml b/OCH/offline/driver/src/main/res/drawable/offline_switch_line_normal.xml
similarity index 56%
rename from OCH/offline/driver/src/main/res/drawable/bg_bus_traffic_light_background.xml
rename to OCH/offline/driver/src/main/res/drawable/offline_switch_line_normal.xml
index e0b90b9c55..5121d1a6be 100644
--- a/OCH/offline/driver/src/main/res/drawable/bg_bus_traffic_light_background.xml
+++ b/OCH/offline/driver/src/main/res/drawable/offline_switch_line_normal.xml
@@ -1,7 +1,6 @@
-
-
-
+
+
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_shape_select_line_item_bg_normal.xml b/OCH/offline/driver/src/main/res/drawable/offline_switch_line_selected.xml
similarity index 83%
rename from OCH/offline/driver/src/main/res/drawable/bus_shape_select_line_item_bg_normal.xml
rename to OCH/offline/driver/src/main/res/drawable/offline_switch_line_selected.xml
index e5faafb27b..c236e4a6e4 100644
--- a/OCH/offline/driver/src/main/res/drawable/bus_shape_select_line_item_bg_normal.xml
+++ b/OCH/offline/driver/src/main/res/drawable/offline_switch_line_selected.xml
@@ -4,4 +4,5 @@
+
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/offline_switch_line_selector.xml b/OCH/offline/driver/src/main/res/drawable/offline_switch_line_selector.xml
new file mode 100644
index 0000000000..ec53f34b30
--- /dev/null
+++ b/OCH/offline/driver/src/main/res/drawable/offline_switch_line_selector.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_shape_select_line_item_time_bg_selected.xml b/OCH/offline/driver/src/main/res/drawable/offline_task_running_arrive_station_press_normal.xml
similarity index 54%
rename from OCH/offline/driver/src/main/res/drawable/bus_shape_select_line_item_time_bg_selected.xml
rename to OCH/offline/driver/src/main/res/drawable/offline_task_running_arrive_station_press_normal.xml
index e2b482ee5f..5121d1a6be 100644
--- a/OCH/offline/driver/src/main/res/drawable/bus_shape_select_line_item_time_bg_selected.xml
+++ b/OCH/offline/driver/src/main/res/drawable/offline_task_running_arrive_station_press_normal.xml
@@ -1,6 +1,6 @@
-
-
+
+
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/bus_shape_select_line_item_bg_selected.xml b/OCH/offline/driver/src/main/res/drawable/offline_task_running_arrive_station_press_select.xml
similarity index 59%
rename from OCH/offline/driver/src/main/res/drawable/bus_shape_select_line_item_bg_selected.xml
rename to OCH/offline/driver/src/main/res/drawable/offline_task_running_arrive_station_press_select.xml
index e5faafb27b..7b95fb492d 100644
--- a/OCH/offline/driver/src/main/res/drawable/bus_shape_select_line_item_bg_selected.xml
+++ b/OCH/offline/driver/src/main/res/drawable/offline_task_running_arrive_station_press_select.xml
@@ -1,7 +1,6 @@
-
+
+
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/offline_task_running_arrive_station_selector.xml b/OCH/offline/driver/src/main/res/drawable/offline_task_running_arrive_station_selector.xml
new file mode 100644
index 0000000000..154a228557
--- /dev/null
+++ b/OCH/offline/driver/src/main/res/drawable/offline_task_running_arrive_station_selector.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/OCH/offline/driver/src/main/res/drawable/offline_task_running_complete_press_normal.xml b/OCH/offline/driver/src/main/res/drawable/offline_task_running_complete_press_normal.xml
new file mode 100644
index 0000000000..5121d1a6be
--- /dev/null
+++ b/OCH/offline/driver/src/main/res/drawable/offline_task_running_complete_press_normal.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/offline_task_running_complete_press_select.xml b/OCH/offline/driver/src/main/res/drawable/offline_task_running_complete_press_select.xml
new file mode 100644
index 0000000000..7b95fb492d
--- /dev/null
+++ b/OCH/offline/driver/src/main/res/drawable/offline_task_running_complete_press_select.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/offline_task_running_complete_selector.xml b/OCH/offline/driver/src/main/res/drawable/offline_task_running_complete_selector.xml
new file mode 100644
index 0000000000..94554284c2
--- /dev/null
+++ b/OCH/offline/driver/src/main/res/drawable/offline_task_running_complete_selector.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/OCH/offline/driver/src/main/res/drawable/offline_task_running_current_station_bg.xml b/OCH/offline/driver/src/main/res/drawable/offline_task_running_current_station_bg.xml
new file mode 100644
index 0000000000..b0886cc9d4
--- /dev/null
+++ b/OCH/offline/driver/src/main/res/drawable/offline_task_running_current_station_bg.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/offline_task_running_item_normal.xml b/OCH/offline/driver/src/main/res/drawable/offline_task_running_item_normal.xml
new file mode 100644
index 0000000000..5121d1a6be
--- /dev/null
+++ b/OCH/offline/driver/src/main/res/drawable/offline_task_running_item_normal.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/offline_task_running_normal.xml b/OCH/offline/driver/src/main/res/drawable/offline_task_running_normal.xml
new file mode 100644
index 0000000000..5121d1a6be
--- /dev/null
+++ b/OCH/offline/driver/src/main/res/drawable/offline_task_running_normal.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/drawable/offline_task_running_selector.xml b/OCH/offline/driver/src/main/res/drawable/offline_task_running_selector.xml
new file mode 100644
index 0000000000..6f1e2e2037
--- /dev/null
+++ b/OCH/offline/driver/src/main/res/drawable/offline_task_running_selector.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/OCH/offline/driver/src/main/res/layout/offline_base_fragment.xml b/OCH/offline/driver/src/main/res/layout/offline_base_fragment.xml
index 64b4c69814..ca6121f7c8 100644
--- a/OCH/offline/driver/src/main/res/layout/offline_base_fragment.xml
+++ b/OCH/offline/driver/src/main/res/layout/offline_base_fragment.xml
@@ -1,120 +1,23 @@
+ android:layout_height="match_parent">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -127,204 +30,16 @@
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_height="match_parent" />
+
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/layout/offline_fragment_och.xml b/OCH/offline/driver/src/main/res/layout/offline_fragment_och.xml
deleted file mode 100644
index ac5e8f10c9..0000000000
--- a/OCH/offline/driver/src/main/res/layout/offline_fragment_och.xml
+++ /dev/null
@@ -1,129 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/layout/offline_jl_bizmap_map.xml b/OCH/offline/driver/src/main/res/layout/offline_jl_bizmap_map.xml
deleted file mode 100644
index ffb955a311..0000000000
--- a/OCH/offline/driver/src/main/res/layout/offline_jl_bizmap_map.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/layout/offline_m2_bizmap_map.xml b/OCH/offline/driver/src/main/res/layout/offline_m2_bizmap_map.xml
deleted file mode 100644
index 625b786557..0000000000
--- a/OCH/offline/driver/src/main/res/layout/offline_m2_bizmap_map.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/layout/offline_no_data_common_view.xml b/OCH/offline/driver/src/main/res/layout/offline_no_data_common_view.xml
deleted file mode 100644
index e27a976e9b..0000000000
--- a/OCH/offline/driver/src/main/res/layout/offline_no_data_common_view.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/layout/offline_no_line_view.xml b/OCH/offline/driver/src/main/res/layout/offline_no_line_view.xml
deleted file mode 100644
index 6d81e77fc7..0000000000
--- a/OCH/offline/driver/src/main/res/layout/offline_no_line_view.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/layout/offline_stations_common_item.xml b/OCH/offline/driver/src/main/res/layout/offline_stations_common_item.xml
deleted file mode 100644
index 28078230ca..0000000000
--- a/OCH/offline/driver/src/main/res/layout/offline_stations_common_item.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/layout/offline_switch_biz.xml b/OCH/offline/driver/src/main/res/layout/offline_switch_biz.xml
new file mode 100644
index 0000000000..947681dc8f
--- /dev/null
+++ b/OCH/offline/driver/src/main/res/layout/offline_switch_biz.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/layout/offline_switch_line.xml b/OCH/offline/driver/src/main/res/layout/offline_switch_line.xml
index 7bce498646..5937445bff 100644
--- a/OCH/offline/driver/src/main/res/layout/offline_switch_line.xml
+++ b/OCH/offline/driver/src/main/res/layout/offline_switch_line.xml
@@ -1,73 +1,74 @@
-
-
+ tools:layout_height="@dimen/dp_966"
+ tools:background="@color/common_203555"
+ xmlns:tools="http://schemas.android.com/tools">
+ android:layout_marginTop="@dimen/dp_37"
+ android:textColor="@color/white"
+ android:text="@string/offline_task_running_linename"/>
-
+
+
+
-
-
+
+
-
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+
+
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/layout/offline_switch_line_list_item.xml b/OCH/offline/driver/src/main/res/layout/offline_switch_line_list_item.xml
index 4ca60e8d73..dd6aa34bc6 100644
--- a/OCH/offline/driver/src/main/res/layout/offline_switch_line_list_item.xml
+++ b/OCH/offline/driver/src/main/res/layout/offline_switch_line_list_item.xml
@@ -4,37 +4,59 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@color/offline_color_162761">
+ android:background="@drawable/offline_switch_line_selector">
+
+
+
+
+
+ android:textSize="@dimen/dp_40"
+ app:layout_constraintTop_toTopOf="@+id/aciv_line_point"
+ app:layout_constraintBottom_toBottomOf="@+id/aciv_line_point"
+ app:layout_constraintStart_toEndOf="@+id/aciv_line_point"
+ app:layout_constraintEnd_toStartOf="@+id/switch_line_item_select_iv"
+ tools:text="@string/offline_switch_line_item_line_name" />
-
-
-
+ app:layout_constraintEnd_toStartOf="@+id/switch_line_item_select_iv"
+ tools:text="@string/offline_switch_line_endstation_name" />
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/layout/offline_switch_line_list_task_item.xml b/OCH/offline/driver/src/main/res/layout/offline_switch_line_list_task_item.xml
deleted file mode 100644
index 07cb6d0eec..0000000000
--- a/OCH/offline/driver/src/main/res/layout/offline_switch_line_list_task_item.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/layout/offline_task_running.xml b/OCH/offline/driver/src/main/res/layout/offline_task_running.xml
new file mode 100644
index 0000000000..acb632ad53
--- /dev/null
+++ b/OCH/offline/driver/src/main/res/layout/offline_task_running.xml
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/layout/offline_task_running_item.xml b/OCH/offline/driver/src/main/res/layout/offline_task_running_item.xml
new file mode 100644
index 0000000000..28ee9dcbbf
--- /dev/null
+++ b/OCH/offline/driver/src/main/res/layout/offline_task_running_item.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/layout/offline_test_bar_view.xml b/OCH/offline/driver/src/main/res/layout/offline_test_bar_view.xml
deleted file mode 100644
index a64bdaa4d9..0000000000
--- a/OCH/offline/driver/src/main/res/layout/offline_test_bar_view.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/raw/bus_away_passengers.json b/OCH/offline/driver/src/main/res/raw/bus_away_passengers.json
deleted file mode 100644
index e76436f2dc..0000000000
--- a/OCH/offline/driver/src/main/res/raw/bus_away_passengers.json
+++ /dev/null
@@ -1,184 +0,0 @@
-{
- "code": 0,
- "msg": "",
- "detailMsg": "",
- "result": {
- "info": [
- {
- "_id": "cee57b3ae07c4486b0357319368487d7",
- "orderNo": "XB20210422000002",
- "orderType": 10,
- "userName": "董QAD",
- "userPhone": "15631204018",
- "startStationId": 1,
- "startStation": "万集东门站",
- "startStationCoordinate": [
- 116.7354579447,
- 40.1974932972
- ],
- "endStationId": 2,
- "endStation": "顺密路口站",
- "endStationCoordinate": [
- 116.721520973,
- 40.1940181096
- ],
- "orderDispatchType": 7,
- "carNum": "京NB010",
- "sn": "F803EB2046PZD00149",
- "orderStartTime": "2021-04-22 16:31:58",
- "orderEndTime": "2021-04-26 10:38:13",
- "arrivedStartStationTime": null,
- "arrivedEndStationTime": null,
- "cityCode": "010",
- "areaCode": "1001",
- "createTime": "2021-04-22 16:31:58",
- "updateTime": "2021-04-26 10:38:13",
- "personNum": 1,
- "travelDistance": 1.2,
- "vehicleColour": null,
- "lastBrandName": null,
- "headImgUrl": null
- },
- {
- "_id": "ce69b1bcfb9840c6a4563bc6ef947caf",
- "orderNo": "XB20210426000000",
- "orderType": 10,
- "userName": "董QAD",
- "userPhone": "15631204018",
- "startStationId": 1,
- "startStation": "万集东门站",
- "startStationCoordinate": [
- 116.7354579447,
- 40.1974932972
- ],
- "endStationId": 2,
- "endStation": "顺密路口站",
- "endStationCoordinate": [
- 116.721520973,
- 40.1940181096
- ],
- "orderDispatchType": 7,
- "carNum": "京NB010",
- "sn": "F803EB2046PZD00149",
- "orderStartTime": "2021-04-26 10:38:48",
- "orderEndTime": "2021-04-26 10:46:16",
- "arrivedStartStationTime": null,
- "arrivedEndStationTime": null,
- "cityCode": "010",
- "areaCode": "1001",
- "createTime": "2021-04-26 10:38:48",
- "updateTime": "2021-04-26 10:46:16",
- "personNum": 1,
- "travelDistance": 1.2,
- "vehicleColour": null,
- "lastBrandName": null,
- "headImgUrl": null
- },
- {
- "_id": "cae07b56f41c4e0fa60ab3543ffc258e",
- "orderNo": "XB20210426000001",
- "orderType": 10,
- "userName": "董QAD",
- "userPhone": "15631204018",
- "startStationId": 1,
- "startStation": "万集东门站",
- "startStationCoordinate": [
- 116.7354579447,
- 40.1974932972
- ],
- "endStationId": 2,
- "endStation": "顺密路口站",
- "endStationCoordinate": [
- 116.721520973,
- 40.1940181096
- ],
- "orderDispatchType": 7,
- "carNum": "京NB010",
- "sn": "F803EB2046PZD00149",
- "orderStartTime": "2021-04-26 10:47:05",
- "orderEndTime": "2021-04-26 10:48:07",
- "arrivedStartStationTime": null,
- "arrivedEndStationTime": null,
- "cityCode": "010",
- "areaCode": "1001",
- "createTime": "2021-04-26 10:47:05",
- "updateTime": "2021-04-26 10:48:07",
- "personNum": 1,
- "travelDistance": 1.2,
- "vehicleColour": null,
- "lastBrandName": null,
- "headImgUrl": null
- },
- {
- "_id": "62bc84afbc434d01b644c74ee406e772",
- "orderNo": "XB20210426000002",
- "orderType": 10,
- "userName": "董QAD",
- "userPhone": "15631204018",
- "startStationId": 1,
- "startStation": "万集东门站",
- "startStationCoordinate": [
- 116.7354579447,
- 40.1974932972
- ],
- "endStationId": 2,
- "endStation": "顺密路口站",
- "endStationCoordinate": [
- 116.721520973,
- 40.1940181096
- ],
- "orderDispatchType": 7,
- "carNum": "京NB010",
- "sn": "F803EB2046PZD00149",
- "orderStartTime": "2021-04-26 10:48:22",
- "orderEndTime": "2021-04-26 10:50:32",
- "arrivedStartStationTime": null,
- "arrivedEndStationTime": null,
- "cityCode": "010",
- "areaCode": "1001",
- "createTime": "2021-04-26 10:48:22",
- "updateTime": "2021-04-26 10:50:32",
- "personNum": 1,
- "travelDistance": 1.2,
- "vehicleColour": null,
- "lastBrandName": null,
- "headImgUrl": null
- },
- {
- "_id": "fa3214c7a6ec411bb3d6edbc98907423",
- "orderNo": "XB20210426000009",
- "orderType": 10,
- "userName": "董QAD",
- "userPhone": "15631204018",
- "startStationId": 1,
- "startStation": "万集东门站",
- "startStationCoordinate": [
- 116.7354579447,
- 40.1974932972
- ],
- "endStationId": 2,
- "endStation": "顺密路口站",
- "endStationCoordinate": [
- 116.721520973,
- 40.1940181096
- ],
- "orderDispatchType": 7,
- "carNum": "京NB010",
- "sn": "F803EB2046PZD00149",
- "orderStartTime": "2021-04-26 19:26:05",
- "orderEndTime": "2021-04-27 14:35:50",
- "arrivedStartStationTime": null,
- "arrivedEndStationTime": null,
- "cityCode": "010",
- "areaCode": "1001",
- "createTime": "2021-04-26 19:26:05",
- "updateTime": "2021-04-27 14:35:50",
- "personNum": 1,
- "travelDistance": 1.2,
- "vehicleColour": null,
- "lastBrandName": null,
- "headImgUrl": null
- }
- ]
- }
-}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/raw/bus_di.mp3 b/OCH/offline/driver/src/main/res/raw/bus_di.mp3
deleted file mode 100644
index 5f313f8970..0000000000
Binary files a/OCH/offline/driver/src/main/res/raw/bus_di.mp3 and /dev/null differ
diff --git a/OCH/offline/driver/src/main/res/raw/bus_order_1.json b/OCH/offline/driver/src/main/res/raw/bus_order_1.json
deleted file mode 100644
index 050b67447d..0000000000
--- a/OCH/offline/driver/src/main/res/raw/bus_order_1.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "_id": "62bc84afbc434d01b644c74ee406e772",
- "areaCode": "1001",
- "carNum": "京NB010",
- "cityCode": "010",
- "createTime": "Apr 26, 2021 10:48:22 AM",
- "endStation": "顺密路口站",
- "endStationCoordinate": [
- 116.721520973,
- 40.1940181096
- ],
- "endStationId": 2,
- "orderDispatchType": 1,
- "orderNo": "XB20210426000002",
- "orderStartTime": "Apr 26, 2021 10:48:22 AM",
- "orderType": 10,
- "sn": "F803EB2046PZD00149",
- "startStation": "万集东门站",
- "startStationCoordinate": [
- 116.7354579447,
- 40.1974932972
- ],
- "startStationId": 1,
- "travelDistance": 1.2,
- "updateTime": "Apr 26, 2021 10:48:23 AM",
- "userName": "董QAD",
- "userPhone": "15631204018"
-}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/raw/bus_station_list1.json b/OCH/offline/driver/src/main/res/raw/bus_station_list1.json
deleted file mode 100644
index c74daa1174..0000000000
--- a/OCH/offline/driver/src/main/res/raw/bus_station_list1.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
- "code": 0,
- "msg": "",
- "detailMsg": "",
- "result": {
- "site": [
- {
- "lineId": 1.0,
- "siteId": 1.0,
- "siteName": "万集东门站",
- "cityCode": "010",
- "areaCode": "1001",
- "areaName": "顺义区",
- "currentLocation": [
- 116.7354579447,
- 40.1974932972
- ],
- "lon": 116.7354579447,
- "lat": 40.1974932972,
- "siteDesc": "万集东门站",
- "siteState": 1.0,
- "isCurrentSite": 1.0,
- "siteColor": 1.0,
- "peoples": "0",
- "ifStop": 1.0
- },
- {
- "lineId": 1.0,
- "siteId": 2.0,
- "siteName": "市政府前街18号",
- "cityCode": "010",
- "areaCode": "1001",
- "areaName": "顺义区",
- "currentLocation": [
- 116.729134342,
- 40.1953113732
- ],
- "lon": 116.729134342,
- "lat": 40.1953113732,
- "siteDesc": "市政府前街18号",
- "siteState": 1.0,
- "isCurrentSite": 3.0,
- "siteColor": 2.0,
- "peoples": "0",
- "ifStop": 0.0
- },
- {
- "lineId": 1.0,
- "siteId": 3.0,
- "siteName": "顺密路口站",
- "cityCode": "010",
- "areaCode": "1001",
- "areaName": "顺义区",
- "currentLocation": [
- 116.721520973,
- 40.1940181096
- ],
- "lon": 116.721520973,
- "lat": 40.1940181096,
- "siteDesc": "顺密路口站",
- "siteState": 1.0,
- "isCurrentSite": 0.0,
- "siteColor": 0.0,
- "peoples": "0",
- "ifStop": 1.0
- }
- ]
- }
-}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/raw/bus_station_list2.json b/OCH/offline/driver/src/main/res/raw/bus_station_list2.json
deleted file mode 100644
index 48d6782cc3..0000000000
--- a/OCH/offline/driver/src/main/res/raw/bus_station_list2.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "code": 0,
- "msg": "",
- "detailMsg": "",
- "result": {
- "site": [
- {
- "lineId": 1.0,
- "siteId": 1.0,
- "siteName": "万集东门站",
- "cityCode": "010",
- "areaCode": "1001",
- "areaName": "顺义区",
- "currentLocation": [
- 116.7354579447,
- 40.1974932972
- ],
- "lon": 116.7354579447,
- "lat": 40.1974932972,
- "siteDesc": "万集东门站",
- "siteState": 1.0,
- "isCurrentSite": 0.0,
- "siteColor": 0.0,
- "peoples": "0",
- "ifStop": 1.0
- },
- {
- "lineId": 1.0,
- "siteId": 1.0,
- "siteName": "万集东门站",
- "cityCode": "010",
- "areaCode": "1001",
- "areaName": "顺义区",
- "currentLocation": [
- 116.7374429112,
- 40.2023987087
- ],
- "lon": 116.7374429112,
- "lat": 40.2023987087,
- "siteDesc": "万集东门站",
- "siteState": 1.0,
- "isCurrentSite": 0.0,
- "siteColor": 0.0,
- "peoples": "0",
- "ifStop": 1.0
- },
- {
- "lineId": 1.0,
- "siteId": 2.0,
- "siteName": "顺密路口站",
- "cityCode": "010",
- "areaCode": "1001",
- "areaName": "顺义区",
- "currentLocation": [
- 116.721520973,
- 40.1940181096
- ],
- "lon": 116.721520973,
- "lat": 40.1940181096,
- "siteDesc": "顺密路口站",
- "siteState": 1.0,
- "isCurrentSite": 1.0,
- "siteColor": 1.0,
- "peoples": "0",
- "ifStop": 1.0
- },
- {
- "lineId": 1.0,
- "siteId": 2.0,
- "siteName": "顺密路口站",
- "cityCode": "010",
- "areaCode": "1001",
- "areaName": "顺义区",
- "currentLocation": [
- 116.723146,
- 40.179637
- ],
- "lon": 116.723146,
- "lat": 40.179637,
- "siteDesc": "顺密路口站",
- "siteState": 1.0,
- "isCurrentSite": 1.0,
- "siteColor": 1.0,
- "peoples": "0",
- "ifStop": 1.0
- },
- {
- "lineId": 2.0,
- "siteId": 2.0,
- "siteName": "顺密路口站",
- "cityCode": "010",
- "areaCode": "1001",
- "areaName": "顺义区",
- "currentLocation": [
- 116.738835502,
- 40.2023958306
- ],
- "lon": 116.738835502,
- "lat": 40.2023958306,
- "siteDesc": "顺密路口站",
- "siteState": 1.0,
- "isCurrentSite": 1.0,
- "siteColor": 1.0,
- "peoples": "0",
- "ifStop": 1.0
- }
- ]
- }
-}
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/values/colors.xml b/OCH/offline/driver/src/main/res/values/colors.xml
index 2f2edfe867..0d2c4cc409 100644
--- a/OCH/offline/driver/src/main/res/values/colors.xml
+++ b/OCH/offline/driver/src/main/res/values/colors.xml
@@ -1,64 +1,4 @@
- #FF1FA7FF
- #FFFFFFFF
- #FFFFFFFF
- #FF51649D
- #7F8299EB
- #51649D
- #427d8e
- #1FA7FF
- #3FC281
- #427d8e
- #3FC281
-
- #FFFFFF
- #99FFFFFF
- #FF52BBFF
-
- #BF30334C
- #fff
- #f1f1f1
-
- #7DE261
- #FF2B2B
- #E3BC59
- #FFF
- #256BFF
- #FFFFFF
-
- #DB3137
- #162761
- #3E77F6
- #323C6F
-
- #2966EC
- #F7151D41
-
- #19FFFFFF
- #FFFFFF
-
- #FFFFA28B
- #FFDA1100
- #FF60FFD3
- #FF006D43
- #FFFFE198
- #FFFF9B00
- #59FFFFFF
-
- #CCB9C3E9
- #4Dffffff
-
- #8E9DD4
- #2B6EFF
- #00FFF8
-
- #FFFFFF
- #4DFFFFFF
- #FFFFFF
- #323C6F
- #CAD6FF
- #BF0E3DBC
- #BF1E2E89
\ No newline at end of file
diff --git a/OCH/offline/driver/src/main/res/values/strings.xml b/OCH/offline/driver/src/main/res/values/strings.xml
index e5f1635eb8..6b1c89dcc4 100644
--- a/OCH/offline/driver/src/main/res/values/strings.xml
+++ b/OCH/offline/driver/src/main/res/values/strings.xml
@@ -1,66 +1,24 @@
- 近距视角
- 远距视角
- 启动中…
- 启动成功
- 启动失败
- 自动驾驶
- 任务列表
- 暂无任务
- 选择时间
- 路线:
- 起点:
- 终点:
- 确认
- 选择任务
- 结束任务
- 自动驾驶状态中,不可切换或结束路线
- 当前行程未完成,不可切换路线
- 当前车辆无路线\n请联系运营人员绑定
- 起点:
- 终点:
- 往%1$s方向
- 更换任务成功
- 更换任务失败
-
- 起点:
- 终点:
- 当前站点:
- 下一站:
- 自动驾驶状态为0不可用
- 进站
- 起
- 终
- 班次:
-
- 提示
- 您确认要结束任务吗?
- 确认
- 取消
-
- 离线\n模式
-
- 暂无任务
+ 更新时间:%1$s
+ 滑动出发
- 距离发车时间还有%1$s分钟
+ 线路名称
+ 往新街口方向
- 平行驾驶
+ 到站
+ 结束
+ 路线:
+ 终点:
-
- 已到达%1$s,带好随身物品,下车请注意安全。
- We are arriving at %1$s ,get off with your belongings
- %1$s 역에 도착했습니다 , 소지품 챙겨서 내리세요
+ 加载中……
- 车辆起步,请扶稳坐好,前方到站是%1$s,请下车的乘客做好准备。
- The next station is %1$s ,please get ready for your arrival
- 전방에서 역에 도착하는 %1$s ,차에서 내리는 승객은 준비하세요
+ 往%1$s方向
- 感谢您体验\'蘑菇车联\'自动驾驶小巴车,我们下次再见。
- Thank you for experiencing the self-driving minibus. See you next time
- 자율주행 버스를 체험해 주셔서 감사합니다. 다음에 또 뵙겠습니다
-
+ 您确认要结束任务吗?
+ 蘑菇小巴正在进站
+ 蘑菇小巴出发咯
diff --git a/OCH/shuttle/driver_weaknet/build.gradle b/OCH/shuttle/driver_weaknet/build.gradle
index 79b33674e6..49d22eb6d4 100644
--- a/OCH/shuttle/driver_weaknet/build.gradle
+++ b/OCH/shuttle/driver_weaknet/build.gradle
@@ -63,10 +63,10 @@ dependencies {
implementation rootProject.ext.dependencies.rxjava
implementation rootProject.ext.dependencies.rxandroid
- implementation rootProject.ext.dependencies.roomRxjava
implementation rootProject.ext.dependencies.androidxrecyclerview
kapt rootProject.ext.dependencies.recyclerviewadapterhelper
+ implementation rootProject.ext.dependencies.roomRxjava
implementation rootProject.ext.dependencies.androidxroomruntime
kapt rootProject.ext.dependencies.androidxroomcompiler
diff --git a/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_switch_biz.xml b/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_switch_biz.xml
index f5b1760fd2..9cb22949dc 100644
--- a/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_switch_biz.xml
+++ b/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_switch_biz.xml
@@ -37,7 +37,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
-
- #99FFFFFF
#4D000000
#1970FF
- #19FF7F
+ ·
#B3FFFFFF
#ffffffff
#80000000
diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/scene/SceneConstant.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/scene/SceneConstant.kt
index 008a613138..8b1f59e3d4 100644
--- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/scene/SceneConstant.kt
+++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/scene/SceneConstant.kt
@@ -24,6 +24,10 @@ class SceneConstant {
// Och common
const val M_OCHCOMMON = "M_OCHCOMMON-"
+ // Och offline
+ const val M_OFFLINE = "M_OFFLINE-"
+
+
//小巴车
const val M_BUS = "M_BUS-"
//小巴车乘客屏